質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

4401閲覧

DirectX11で壁沿りベクトルを実装したい

futonmin

総合スコア33

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/01/28 03:16

編集2021/01/31 04:53

前提・実現したいこと

directx11でレースゲームを作っているのですが、斜めの当たり判定(OBB)を持つ壁にプレイヤー(OBB)が衝突したときに壁沿りベクトルを使って壁を沿う処理を実装したいです。
現状では壁沿りベクトルを行っている関数内の計算が間違っているのか、設定する引数が間違っているのか、プレイヤーが斜めの壁に衝突したときにプレイヤーが原点(0,0,0)に(瞬間)移動してしまいます。

該当のソースコード

c++

1//壁沿りベクトル 2//front : 進行ベクトル 3//normal: 衝突点での法線ベクトル 4XMFLOAT3 CCollision::CalcWallScratchVector( XMFLOAT3& front, const XMFLOAT3& normal) 5{ 6 //XMFLOAT3 normal_n;//正規化した法線ベクトル 7 //XMFLOAT3 StaggeredNormal;//ずらした法線ベクトル 8 //XMFLOAT3 out;//戻り値 9 10 normal_n = GetMath()->Vector_Normalize(normal);//法線ベクトルを正規化 11 //進行ベクトルの逆ベクトルと法線ベクトルの内積 12 StaggeredNormal.x = GetMath()->Dot3DX(-front, normal_n); 13 StaggeredNormal.y = GetMath()->Dot3DY(-front, normal_n); 14 StaggeredNormal.z = GetMath()->Dot3DZ(-front, normal_n); 15 out.x = front.x + StaggeredNormal.x * normal.x; 16 out.y = front.y + StaggeredNormal.y * normal.y; 17 out.z = front.z + StaggeredNormal.z * normal.z; 18 return out; 19}

c++

1 2//実行部分 3//プレイヤー(OBB)と斜めの壁(OBB)の当たり判定 4if (GetCollision()->CollisionOBB3D(GetModel()->GetPos(),//プレイヤーの位置 5 GetModel()->GetSize(),//プレイヤーの当たり判定のサイズ 6 GetModel()->GetRot(),//プレイヤーの向き 7 GetFenceOutSide()->GetPosOBBNo1(),//壁の位置 8 GetFenceOutSide()->GetSizeOBBNo1(),//壁の当たり判定のサイズ 9 GetFenceOutSide()->GetRotOBBNo1(),//壁の向き 10 &GetFenceOutSide()->GetFenceNormal[0]))//壁の法線ベクトル 11 { 12 PrintDebugProc("[FenceOutSideOBBHitPlayeOBB : No1 : Hit]\n"); 13 //壁沿りベクトル 14    //引数1 : プレイヤーの進行ベクトル(正面ベクトル) 15 //引数2 : 壁の衝突時の法線ベクトル(CollisionOBB3D関数の7つ目の引数に設定した法線ベクトルを格納したもの) 16 *GetModel()->GetPos() += GetCollision()->CalcWallScratchVector(GetModel()->vecForward, GetCollision()->Obj2_Normalvector); 17 }

試したこと

↓参考にしたサイト
http://marupeke296.com/COL_Basic_No5_WallVector.html

補足情報(FW/ツールのバージョンなど)

Visual Studio Community 2019
Windows10
DirectX11

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

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

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

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

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

guest

回答2

0

自己解決

壁沿りベクトル関数内の計算と法線ベクトルの設定を上記のソースのように直しました。
一応は壁に沿って動くようになったので自己解決とさせていただきます。

投稿2021/01/31 04:21

編集2021/01/31 04:22
futonmin

総合スコア33

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

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

0

座標に正規化したベクトルを渡すと瞬間移動しますね。
その処理は座標(Pos)ではなく回転(Angle)の処理にするべきではないかと思います。
自動で進む方向のベクトルを用意し、座標と回転は追従するシステムを組んだ方が良いでしょう。

この場合ですとこのようにしてあげれば、原点に瞬間移動することはなくなると思います。

C++

1//+=のoperatorがあることを予めご確認下さい。 2*GetModel()->GetPos() += GetCollision()->CalcWallScratchVector(GetModel()->vecForward, GetCollision()->Obj2_Normalvector);

投稿2021/01/28 07:58

stdio

総合スコア3307

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

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

futonmin

2021/01/29 19:39

回答ありがとうございます。 +=のoperator関数の実装に時間がかかり返信遅くなりました。 今のところ*GetModel()->GetPos() += GetCollision()->CalcWallScratchVector(GetModel()->vecForward, GetCollision()->Obj2_Normalvector); でも瞬間移動してしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問