前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。