🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

3277閲覧

円同士の当たり判定でめり込み量を補正が上手く実装できない。

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

1クリップ

投稿2021/03/14 04:59

編集2021/03/15 01:16

提示コードの///コメント内部のコードですが当たり判定をしてめり込み量を補正するのですが右キーを押しっぱなしにすると補正しているのにも関わらず右に動いいてめり込んでしまうのですがこれはどうしたらいいのでしょか?何かの誤差だと思い色々値をいじりましたが原因がわかりませんどうすればいいのでしょうか?

右キーを押して補正されて1ドットづつ右に動いてめり込んでしまいます。
getVector();というのは緑(プレイヤー)の移動している方向です。

イメージ説明
イメージ説明

cpp

1 2//交差判定 3void CircleCollision::Intersect(CircleCollision& col) 4{ 5 //printf("あああ%d\n",col.getRadius()); 6 //printf("あああ%d\n",getRadius()); 7 8 int c = sqrt((col.getCenter().x - getCenter().x) * (col.getCenter().x - getCenter().x) + 9 (col.getCenter().y - getCenter().y) * (col.getCenter().y - getCenter().y)); 10 11 //printf("C:%d\n",c); 12 if ( c <= (col.getRadius() + getRadius()) ) 13 { 14// printf("true\n"); 15 16 //タグと当たり判定 17 setCol(true); //当たり判定を設定 18 setColTag(col.getMyTag()); //タグを取得 19 col.setColTag(getMyTag()); //タグを設定 20 21 if (getTriggerType() == false) 22 { 23 int len = sqrt((col.getCenter().x - getCenter().x) * (col.getCenter().x - getCenter().x) + 24 (col.getCenter().y - getCenter().y) * (col.getCenter().y - getCenter().y)); 25 printf("len %d\n",len); 26 27 float m = (col.getRadius() + getRadius()) - len; //めり込み量 28 29// printf("いいい %d\n", getRadius()); 30// printf("ああああ %d\n", col.getRadius()); 31 32// printf("m %f\n",m); 33 34 glm::vec2 vec = getVector(); 35 vec = vec * -1.0f; //ベクトルを反転 36 printf("vec : %.2f , %.2f \n", vec.x, vec.y); 37 38 vec = glm::normalize(vec); 39 vec.x = vec.x * m ; 40 vec.y = vec.y * m ; 41// printf("vec : %.2f , %.2f \n", vec.x, vec.y); 42 43 44 glm::ivec2 pos = vec; 45 printf("pos : %d , %d \n",pos.x,pos.y); 46////////////////////////////////////////////////////////////////////////////////// 47 glm::ivec2 p = getCenter() += (pos); 48 //printf("p : %d , %d \n",p.x,p.y); 49 setCenterValue(p); 50 51///////////////////////////////////////////////////////////////////////////////// 52 53 } 54 } 55 else 56 { 57 //交差していない 58 // printf("false\n"); 59 60 //タグと当たり判定 61 setCol(false); //当たり判定を設定 62 setColTag(Tag::Invalid); //タグを取得 63 col.setColTag(Tag::Invalid); //タグを設定 64 } 65} 66

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

glm::vec2 vec = getVector();

これ,何なのでしょう?

提示コードを見る限り,
「このgetVector()で得られる何らかのベクトルの長さをmにしたものが座標補正量になる」
という筋書きに見えますが,
本当にそうなるのでしょうか?

ひょっとしたら,
getVector()で得られるベクトルというのはその緑の円を移動させようという(速度的な)量なのではありませんか?
例えば

右キーを押しっぱなし

している場合,(2,0) とか (5,0) とか,どの程度の大きさかわかりませんけども,X+方向を向くベクトルだったりしませんか?

だとすれば,この場合の補正量は (-m,0) ということになりそうに見えますが,「X座標をmだけ減じることが補正となるのか?」ということを考えると,これは疑問です.
2つの円のY座標が一致していない場合にはmでは足りないでしょう.
なぜならば,mとは「X方向の」めり込み量ではなく,「半径方向の」めり込み量だからです.

[追記]例を図で示す.
例えば,緑の円が左の方向から移動してきた結果として図の左側のように赤い円と重なったとする.
提示されたコードが求めているmとは図に示した部分の長さであると見える.
もしも,「補正」というのが図の右側のように「2つの円が接するように緑円の位置を左方向に修正する」という話だとしたら,その補正量(図内紫色矢印の長さ)というのは,明らかにmよりも大きい.

イメージ説明


intとfloatが混在している点も気になりますが,それが問題を生じるかどうかまではわかりません.

投稿2021/03/14 06:32

編集2021/03/15 01:42
fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/14 07:22

どうすればいいのでしょうか?
fana

2021/03/15 01:10 編集

getVector()が返す物の意味はこれで合っているのか? ・Yesの場合 → 演算内容が滅茶苦茶なわけだから,処理内容自体を考え直せばよい.  算数問題ですな.紙の上に円を2つ書いて,妥当な補正量とは何か?というのを考え直してみたらどうか. ・Noの場合 → getVector()が何を返すのかを明確にすべき
退会済みユーザー

退会済みユーザー

2021/03/15 01:09

質問ですが返すものとはどういう意味でしょうか?
fana

2021/03/15 01:11

> vec = getVector(); というコードから,関数getVector()は何かをreturnで返すのだと見た.その戻り値のこと.
退会済みユーザー

退会済みユーザー

2021/03/15 01:12

getVector()は当たっときの方向が求まります。w
fana

2021/03/15 01:20

> 当たっときの方向 こういう言葉だと,相手には何も伝わらないということをそろそろわかるべき. 「方向」とは何の方向なのか? 「方向」だと表現するならば,そのベクトルのノルム(長さ)には意味は無いの? 回答内では円の移動量(障害物等に当たらないならば移動させたい量)ではないかと予想したが,それで合っているのか違うのか.明確にされたい. --- そもそも getVector()という名前が「ベクトルを得られる」ということしか表現しておらず,謎すぎる. 得られるベクトルって何だよ?っていうのが最も重要なところだろうにそれを全く表現しない名称には恐怖すら感じる(個人の感想です).
fana

2021/03/15 01:44

回答内容をわかりやすくするために,絵を追加した.
退会済みユーザー

退会済みユーザー

2021/03/16 23:58 編集

ありがとうございました。考えてみます。しばらく思考したいのですがわかりません。そもそもこれはやり方等あるのでしょうか? 追記 こちらのサイトを見ることにしました。https://hakuhin.jp/as/collide.html#COLLIDE_00
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問