当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たろう

Re:当たり判定について

#101

投稿記事 by たろう » 15年前

返信ありがとうございます。いいえ、当たりとみなしません。

softya

Re:当たり判定について

#102

投稿記事 by softya » 15年前

>角度は0のままでも出来るのでしょうか?
出来ますが、垂直でも斜めでも自在に作れないなら理解しているとは言えません。
当たり判定をちゃんと理解するために作っているはずでよね。

ookami

Re:当たり判定について

#103

投稿記事 by ookami » 15年前

> いいえ、当たりとみなしません。
それはなぜですか?

たろう

Re:当たり判定について

#104

投稿記事 by たろう » 15年前

赤い円の中に移動後は青い移動後に入らないためです。

たろう

Re:当たり判定について

#105

投稿記事 by たろう » 15年前

softyaさん
返信ありがとうございます。

わかっていなかったみたいです。
ヒントでもいいので教えてもらえませんでしょうか?

ookami

Re:当たり判定について

#106

投稿記事 by ookami » 15年前

> 赤い円の中に移動後は青い移動後に入らないためです。
わかりました。

ではこれは?(添付)
今回は、青は動きません。

たろう

Re:当たり判定について

#107

投稿記事 by たろう » 15年前

ookamiさん
返信ありがとうございます。
当たりません。
理由はすり抜けてしまうからです。

ookami

Re:当たり判定について

#108

投稿記事 by ookami » 15年前

え...?では、これは?
(ちょっとずらしました)

たろう

Re:当たり判定について

#109

投稿記事 by たろう » 15年前

当たらないと思うのですが。。。
間違っていますでしょうか?

たろう

Re:当たり判定について

#110

投稿記事 by たろう » 15年前

すみません。いっきに移動したらですよね?

シエル

Re:当たり判定について

#111

投稿記事 by シエル » 15年前

定義が少ないんじゃ。。。
その物体の速さとか教えてあげないと答えづらいですよ。

ookami

Re:当たり判定について

#112

投稿記事 by ookami » 15年前

確認しますが、
たろうさんがやりたい当たり判定では、
No.60350でもNo.60354でも、当たってないとみなす、
ということで、ファイナルアンサー?

ookami

Re:当たり判定について

#113

投稿記事 by ookami » 15年前

# シエルさん
たろうさんのお答え次第では、速さうんぬんが意味なくなってしまいますからネw
まぁもうちょっと待ちましょう。

たろう

Re:当たり判定について

#114

投稿記事 by たろう » 15年前

ファイナルアンサーで。。。

softya

Re:当たり判定について

#115

投稿記事 by softya » 15年前

ookamiさんの質問の意図は、
>確認なんですが、たろうさんがやりたい当たり判定では、
>図のような場合は、当たりとみなしますか?
なので、それに沿っての返答を求められていると思いますよ。

>わかっていなかったみたいです。
>ヒントでもいいので教えてもらえませんでしょうか?

ヒントと言っても物体2が静止しているならt=0.7だけで当たるためには物体1の速度に応じた適度な小ささの当たり半径を選んでやればそのタイミングだけで当たります。角度0でも。
でも、これは一番簡単な奴なので不十分ですけどね。
図を色々書いてみても分かりませんか?頭の中でイメージできないなら実際に紙の上に書いて考えるしか無いと思いますよ。

シエル

Re:当たり判定について

#116

投稿記事 by シエル » 15年前

なるほどw失礼致しました。

たろう

Re:当たり判定について

#117

投稿記事 by たろう » 15年前

すみません。
違います。
その画像で当たり判定されるようにしたいのです。

ookami

Re:当たり判定について

#118

投稿記事 by ookami » 15年前

うはwwww ファイナルアンサーに対して罵倒を書くところでしたwwww 確認してよかった。せふせふ。

では、次はこの添付、どう思いますか?

-- 追記:添付しわすれましたw 画像

たろう

Re:当たり判定について

#119

投稿記事 by たろう » 15年前

当たり範囲に入っていません。それはわかります。

ookami

Re:当たり判定について

#120

投稿記事 by ookami » 15年前

> 当たり範囲に入っていません。
というのは、たろうさんがやりたい当たり判定では、当たってないと見なすんですか?
それとも、関数を工夫して、当たっていると見なせるようにしたいんですか?

たろう

Re:当たり判定について

#121

投稿記事 by たろう » 15年前

関数を工夫して当たっているとみなせるようにしたいです。

ookami

Re:当たり判定について

#122

投稿記事 by ookami » 15年前

その工夫っていうのは、上のソース上ではどんな感じでするんでしょう。

softya

Re:当たり判定について

#123

投稿記事 by softya » 15年前

良いトレーニング法を思いつきました。
No:60303 でたろうさんの作ったプログラムの物体1と物体2の当たり判定の円を絵に書いてもらえませんか。
tは0.1刻みで0~1.0の全部を書いてみてください。

たろう

Re:当たり判定について

#124

投稿記事 by たろう » 15年前

返信ありがとうございます。
t0.0~0.5まで書いてみました。
当たり判定はこんな感じですよね?

たろう

Re:当たり判定について

#125

投稿記事 by たろう » 15年前

すみませんわかりません。
答え教えていただけませんでしょうか?

ookami

Re:当たり判定について

#126

投稿記事 by ookami » 15年前

座標を書き加えてもらってもいいですか?
あと、楕円は何ですか?

softya

Re:当たり判定について

#127

投稿記事 by softya » 15年前

>返信ありがとうございます。
>t0.0~0.5まで書いてみました。
>当たり判定はこんな感じですよね?

No:60303のプログラムの
printfDx("%d",atarihantei(7.0f,0.0f,7.0f,0.0f,10.0f,21.0f,0.0f,0.0f,0.0f,0.0f));
のパラメータで動かした場合の図形ですよね?
物体1と物体2で色変えてもらって良いですか。
それと0.0か1.0まで全てお願いします。

ちゃんと計算して数値も書いてくださいね。
※ プログラムで計算しても良いですけどね。 画像

たろう

Re:当たり判定について

#128

投稿記事 by たろう » 15年前

返信ありがとうございます。
出来ました。
#define GLOBAL_INSTANCE  
#include "include/DxLib.h" 
#include<math.h> 
// 動いてない円同士の当たり判定 
int test_circle_circle(float x1, float y1, float r1, float x2, float y2, float r2) 
{ 
    float x = x1 - x2; 
    float y = y1 - y2; 
    float r = r1 + r2; 
    return x * x + y * y <=r*r; 
} 

// 動いている円同士の当たり判定 
int atarihantei( 
    // X座標, Y座標, 半径, 角度, 速度 
    float x1, float y1, float r1, float a1, float v1, 
    float x2, float y2, float r2, float a2, float v2
    ) 
{ 
    // 経過時間 
    // 円がそれぞれ a1, a2 の方向に v1, v2 だけ進んだ時間を 1.0 とする 
    float t = 0.0f; 

    while (t < 1.0f) 
    { 
        // 初期位置から t だけ進んだ円同士の当たり判定を行う 
        if (test_circle_circle( 
            x1 + cos(a1) * v1 * t, y1 + sin(a1) * v1 * t, r1, 
            x2 + cos(a2) * v2 * t, y2 + sin(a2) * v2 * t, r2)) 
        { 

            return 1; 
        } 

        // 適当に時間を進ませる 
        // ここの値は r1, r2, v1, v2 から適切に求めるべきだけど、ここでは面倒なのでやらない 
        t +=0.1; 
    } 
    // 初期位置から 1.0 だけ進んだ円同士の当たり判定を行う 
     
 
    return test_circle_circle( 
        x1 + cos(a1) * v1, y1 + sin(a1) * v1, r1, 
        x2 + cos(a2) * v2, y2 + sin(a2) * v2, r2); ; 
} 


int Prossessloop() 
{ 
    if(ProcessMessage()!=0) 
        return -1; 
    if(ClearDrawScreen()!=0) 
        return -1; 
    return 0;  

} 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 
    ChangeWindowMode(TRUE);//ウィンドウモード 
     
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 

    while(Prossessloop()!=-1){ 


//当たり判定 


    // X座標, Y座標, 半径, 角度, 速度  
    printfDx("%d",atarihantei(0.7f,0.0f,0.00000023841858f,//0にしたいのですがプログラムで計算されると誤差が出えるのでこの数値にしました。
                                0.0f,1.0f,  2.1f,0.0f,0.0f,0.0f,-1.0f)); 
//x1を1上げると当たらない、rを下げると当たらない 
        ScreenFlip(); 
    } 

    DxLib_End(); 
    return 0; 
}

softya

Re:当たり判定について

#129

投稿記事 by softya » 15年前

>返信ありがとうございます。
>出来ました。
えーと何が?は冗談として、えらく極端な衝突パターンで来ましたね。

理解度を確認したいので図は必ず書いてくださいね。
1)最初のNo:60303
2)最新のNo:60453
の両方でお願いします。

【追記】
ookamiさんの最後の質問にも答えてくださいね。 画像

たろう

Re:当たり判定について

#130

投稿記事 by たろう » 15年前

返信ありがとうございます。
画像です。汚いですが勘弁してください。。。
60303は待ってください。

たろう

Re:当たり判定について

#131

投稿記事 by たろう » 15年前

No60303の画像です。

softya

Re:当たり判定について

#132

投稿記事 by softya » 15年前

とりあえず、No:60303のやつは、
// X座標, Y座標, 半径, 角度, 速度
atarihantei(7.0f,0.0f,7.0f,0.0f,10.0f,
      21.0f,0.0f,0.0f,0.0f,0.0f));
ですよね。

    X座標, Y座標, 半径, 角度, 速度
物体1 7.0 0.0 7.0 0 10.0
物体2 21.0 0 0 0 0.0

なので物体2は座標(21,0)に静止する(速度0)半径0の当たり範囲もつ物体というわけです。
図と違いますよね?
それと物体1は座標(7,0)から速度10.0/フレームで角度0で移動する当たり判定半径7の円をもつ物体ですよね。
これも図と違うと思います。

ちゃんと計算すれば分かる話ですので、
1.まずちゃんと計算して表などにまとめること。
2.グラフ用紙などに計算結果を反映した図を書くこと。
以上をやってみてください。
出来れば、表だけ先にここに書いてもらうと間違っているかすぐ分かります。

ookami

Re:当たり判定について

#133

投稿記事 by ookami » 15年前

ちょっと確認なんですが、
 座標(x0,y0)から、角度 a で 距離 r 進んだ座標
を、数式で表現できますか?
添付をご参考ください。

ookami

Re:当たり判定について

#134

投稿記事 by ookami » 15年前

連続ですみません、
さらに確認なんですが、たろうさんがやりたい当たり判定では、
図のような場合は、当たりとみなしますか?

たろう

Re:当たり判定について

#135

投稿記事 by たろう » 15年前

softyaさん返信ありがとうございます。
物体2は静止してます。
赤い丸がそうなんですが。
>それと物体1は座標(7,0)から速度10.0/フレームで角度0で移動する当たり判定半径7の円をもつ物体ですよね。
当たり判定のx座標を載せていなかったのが間違っていたのでしょうか?
ookamiさん返信ありがとうございます。
>数式で表現できますか?
((x0-?)*cos(a),(y0-?)*sin(a))ですよね。
図のような場合は、当たりとみなしますか?
みなします。

ookami

Re:当たり判定について

#136

投稿記事 by ookami » 15年前

> ((x0-?)*cos(a),(y0-?)*sin(a))ですよね。
> 図のような場合は、当たりとみなしますか?
> みなします。

ちょっと心が折れそうなのでまた明日お返事します。
もう一度よく考えてみてください。
その回答は、単に間違っているというだけではありません。
すごくまずいです。

たろう

Re:当たり判定について

#137

投稿記事 by たろう » 15年前

すみません。
(r*cos(a),r*sin(a))です。

softya

Re:当たり判定について

#138

投稿記事 by softya » 15年前

>物体2は静止してます。
>赤い丸がそうなんですが。

図の解釈が間違っているかも知れませんが、赤い丸も緑い丸が移動している様に見えます。
すいません、図にある赤い丸、緑の丸、青丸の意味を教えてください。
それとt=0から1.0までの物体1と2の座標と当たり半径の大きさを書いてもらっても良いですか。

>>それと物体1は座標(7,0)から速度10.0/フレームで角度0で移動する当たり判定半径7の円をもつ物体ですよね。
>当たり判定のx座標を載せていなかったのが間違っていたのでしょうか?

図に描かれている数値は座標ではないのでしょうか?

softya

Re:当たり判定について

#139

投稿記事 by softya » 15年前

>(r*cos(a),r*sin(a))です。

それも違います。
仮に値を入れて見たり、グラフを書いてみれば分かります。

ookami

Re:当たり判定について

#140

投稿記事 by ookami » 15年前

> (r*cos(a),r*sin(a))です。
違います。移動量ではなく座標を聞いています。

あと、「当たるとみなす」ほうは、どうなんです?

--

念のためですが、
ここまで皆さんが紹介されてきたアルゴリズムは、
どれも、すりぬけ(トンネリング)や、
逆に当たっていないのに当たったことにしてしまう場合がある半面、
計算量が少ないなどのメリットがあるから紹介してくださっていることを、理解していますか? 画像

たろう

Re:当たり判定について

#141

投稿記事 by たろう » 15年前

すみません。
?のところを書けばよかったのでしょうか?
だとしたら
(x0+r*cos(a),y0+r*sin(a))です。

たろう

Re:当たり判定について

#142

投稿記事 by たろう » 15年前

赤い丸は、物理1、で緑の丸は物理2で青はここまで当たり判定するです。
>それとt=0から1.0までの物体1と2の座標と当たり半径の大きさを書いてもらっても良いですか。
座標は、(14,0)(13,0)(12,0)(11,0)(10,0)(9,0)(8.0)(7,0)(6,0)(5,0)です。
当たり半径は7です。
>図に描かれている数値は座標ではないのでしょうか?
書き間違えました。すみません。座標です。(x座標の)

softya

Re:当たり判定について

#143

投稿記事 by softya » 15年前

>赤い丸は、物理1、で緑の丸は物理2で青はここまで当たり判定するです。

ごめんなさい。やっぱり分からないです。
当たり半径は図に書いてないと思って良いですか?

>座標は、(14,0)(13,0)(12,0)(11,0)(10,0)(9,0)(8.0)(7,0)(6,0)(5,0)です。
>当たり半径は7です。
これは物体1ですよね?
スタートの座標に14がくるのが分かりません。
(14,0)を求めた式と当てはめた数値を書いてもらって良いでしょうか?

>書き間違えました。すみません。座標です。(x座標の)
これは何のX座標でしょうか?
物体1とも違うわけですよね?

たろう

Re:当たり判定について

#144

投稿記事 by たろう » 15年前

説明が下手ですみません。
>当たり半径は図に書いてないと思って良いですか?
いいです。
>スタートの座標に14がくるのが分かりません。
// 初期位置から t だけ進んだ円同士の当たり判定を行う
if (test_circle_circle(
7 + cos(0) * 10 * 0, y1 + sin(a1) * v1 * t, r1,
21 + cos(0) * 0 * 0, y2 + sin(a2) * v2 * t, r2))
>これは何のX座標でしょうか?
当たり判定のx座標です。

int test_circle_circle(float x1, float y1, float r1, float x2, float y2, float r2)
{
float x = x1 - x2;
float y = y1 - y2;
float r = r1 + r2;
return x * x + y * y <=r*r; ここのx座標
}
>物体1とも違うわけですよね?
物体1と物体2の当たり判定です。
説明が下手でほんと申し訳ありません。
とりあえず解決とします。こんな馬鹿な自分ですが、
こんな人に回答していただきまして誠に本当にありがとうございました。

softya

Re:当たり判定について

#145

投稿記事 by softya » 15年前

ここまでやったなら最後までやりませんか?
ookamiさんにの最後の質問にも答えてませんし。

>return x * x + y * y <=r*r; ここのx座標
これはX座標ではなく、物体1と2のX方向の距離です。

>当たり判定のx座標です。
つまり物体同士の距離を表す図って事になりますよね。
うーん、それでも図は良く分かりません。

私は、
>No:60303 でたろうさんの作ったプログラムの物体1と物体2の当たり判定の円を絵に書いてもらえませんか。
とお願いしたハズなので、tの値それぞれの時に物体の存在する座標と当たり判定の範囲が分かればよかったのですが。
つまり、スタート地点(t=0)だと座標(7,0)に半径7の円を書いてもらって、これをt=1.0まで書いてもらえば良いんです。これを書くだけでかなりイメージ出来ると思うんですけど。

たろう

Re:当たり判定について

#146

投稿記事 by たろう » 15年前

返信ありがとうございます。
最後までやるつもりです。
画像です。
ookamiさん
気づきませんでした。
>計算量が少ないなどのメリットがあるから紹介してくださっていることを、理解していますか?
知りませんでした。こんな計算があるんだなとしか。

softya

Re:当たり判定について

#147

投稿記事 by softya » 15年前

この図は、No:60303 のものでしょうか?
だとすると円の半径は7ですので今の図だと移動距離に比べて円が小さいです。
それと半径は固定されているので最後の位置の(17,0)までずっと同じ大きさの円になります。

>知りませんでした。こんな計算があるんだなとしか。
当たり判定の正確さとCPUの負荷はトレードオフです。
どこかで妥協しないといけません。
ある程度までは工夫で高速化出来ます。

ookami

Re:当たり判定について

#148

投稿記事 by ookami » 15年前

>> ここまで皆さんが紹介されてきたアルゴリズムは、
>> どれも、すりぬけ(トンネリング)や、
>> 逆に当たっていないのに当たったことにしてしまう場合がある半面、
>> 計算量が少ないなどのメリットがあるから紹介してくださっていることを、理解していますか?
> 知りませんでした。

これまでの皆さんのアドバイスを振り返ってみましょう。



# No:58756
# 1.移動のフレームレートを上げる。
# 1フレームの間に10回移動させてやっても結構平気だったります。こうすることでトンネリングの発生する確率はかなり低くなると思います。
# 2.円が移動してできた軌跡同士で当たり判定を行う。
# ただし、明らかに当たってない場合も当たってしまうと判断されてしまう場合があります。

# No:58896
# ある時刻と別の時刻では衝突していないが、その間の時間に当る可能性を見過ごしている。
# もちろん、この時間を短くすることによってより正確に判定することは可能であるが、
# 厳密な判定をするためには限りなく無限小に近い時間間隔で計算しなければならず、ゲームに必要な高速性を維持することができない。

# No:59054
# 線分交差法は厳密な意味で考えると駄目だとおもってます。
# ただ厳密性がどこまで必要かも考える必要がありますよね。

# No:59126
# この線分交差による判定方法がダメだということではなく、
# こういった状況が発生したときに、たろうさんの作っているゲームはそれが許容できるのかどうかということになってきます。

# No:59296
# v1 や v2 が r1 や r2 の 10 倍以上の大きさになっている場合にはやっぱりすり抜けてしまう現象が起きてしまう可能性が高くなってしまいます。



ちょっと挙げるの疲れてきましたが、
みなさんが、「いろいろな方法があるが、精度もいろいろだ」と
たろうさんに仰っているんです。

ookami

Re:当たり判定について

#149

投稿記事 by ookami » 15年前

ちなみに、いまのところ、もっとも「正確」であるが、「計算が難しい(人によるけど)」のは、
softyaさんが示されているリンクの先にある、「移動する2つの球の衝突場所と時刻を得る」だと思います。
http://marupeke296.com/COL_3D_No9_GetSp ... ndPos.html

もっとも「正確でない」けれども「簡単」なのは、フレームの間のことは考えないことです。

たろう

Re:当たり判定について

#150

投稿記事 by たろう » 15年前

softyaさん返信ありがとうございます。

>この図は、No:60303 のものでしょうか?
>だとすると円の半径は7ですので今の図だと移動距離に比べて円が小さいです。
>それと半径は固定されているので最後の位置の(17,0)までずっと同じ大きさの円になります。
同じ円が書けなかったのでばらばらな円になってしまいましたが。同じ円です。すみません。
円で書くとどうなるんでしょうか?

ookamiさん返信ありがとうございます。
そうだったんですか、あまり考えていなかったので、全然気づきませんでした。

softya

Re:当たり判定について

#151

投稿記事 by softya » 15年前

>同じ円が書けなかったのでばらばらな円になってしまいましたが。同じ円です。すみません。
>円で書くとどうなるんでしょうか?

移動距離が1ピクセルづつに対して円の半径が7ピクセル(直径14ピクセル)なんですが大体想像できませんか?
1cm毎ずらしながら半径7cmの円を11個書くのと同じです。想像できないならグラフ用紙に書いてみたほうが良いと思いますけど。

>ookamiさん返信ありがとうございます。
>そうだったんですか、あまり考えていなかったので、全然気づきませんでした。

理解度が不明なので、もう少し詳しくookamiさん向けに返事してくださいね。
No:60503 と No:60505 の内容にまったく触れられてません。

たろう

Re:当たり判定について

#152

投稿記事 by たろう » 15年前

>移動距離が1ピクセルづつに対して円の半径が7ピクセル(直径14ピクセル)なんですが大体想像できませんか?
1cm毎ずらしながら半径7cmの円を11個書くのと同じです。想像できないならグラフ用紙に書いてみたほうが良いと思いますけど。

そのつもりで書いたのですが・・・

softya

Re:当たり判定について

#153

投稿記事 by softya » 15年前

>そのつもりで書いたのですが・・・

本当に定規とコンパスで書いてみると分かります。1cmづつ移動する半径7cmの円ですよ。
フリーハンドで書いても絶対にこんな円の重なり方はしません。
信じてやってみてください。
こちらで答えを書いても良いのですが、それでは図形を考えるトレーニングになりませんので。

ookami

Re:当たり判定について

#154

投稿記事 by ookami » 15年前

>> みなさんが、「いろいろな方法があるが、精度もいろいろだ」と
>> たろうさんに仰っているんです。
> そうだったんですか、あまり考えていなかったので、全然気づきませんでした。

もうちょっと書き方を工夫したほうがいいと思いますよ?
たろうさんが考えないで、他に誰が考えるんですか?

Dixq (管理人)

Re:当たり判定について

#155

投稿記事 by Dixq (管理人) » 15年前

> たろうさん

規約に従って利用して下さっているにも関わらずすみません。
ここの掲示板の仕様上、1トピック内のレス数があまりにも多いと掲示板のトップページ全体に表示される最新トピック数が減ってしまうようです。
その為、更新から24時間経過していないトピックが過去ログに落ちてしまう場合がいくつか発生しています。

一応掲示板では1質問1トピックを基本とさせて頂いています。
話が長くなってしまう場合や、関連した話でわざわざ別にトピックを立てる必要が無い場合もあると思いますが、
なるべく後から見た人が解りやすいようにトピックごとに細かく質問をわけ、関連性が高い時は、前トピックのリンクを貼って頂けると幸いです。

閉鎖

“C言語何でも質問掲示板” へ戻る