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

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

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

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

DirectX

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

Q&A

1回答

2126閲覧

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

futonmin

総合スコア33

C++

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

DirectX

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

0グッド

0クリップ

投稿2021/02/02 15:06

前提・実現したいこと

directx11でプレイヤーが斜めに傾いた壁との衝突時に、壁沿りベクトルを使って壁に沿って移動するようにしたいです。
現状ではプレイヤー(OBB)と斜めの壁(OBB)との衝突時に、プレイヤーの進行ベクトルに沿って動くようになったのですが、プレイヤーの進行ベクトルに沿って動くので壁を突き抜けてしまいます。
壁沿りベクトル関数内の計算を壁に沿うように変えたいです。

該当のソースコード

c++

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

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ページで確認できます。

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

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

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

ikadzuchi

2021/02/11 08:15

Dot3DX・Y・Zのあたりがおかしいと思いますが、これは検索しても見つからなかったのですが自作の関数ですか? そうであればその中身まで書かなければ回答のしようがありません。
futonmin

2021/02/11 18:24

内積の式をx,y,zに分けただけです。 front.x*normal_n.xのように。 自作関数です。一応コメントに内積の計算と書いたのですが分かりづらいですよね。 申し訳ありません。
guest

回答1

0

内積の式をx,y,zに分けただけです。

なるほど。たぶんベクトルを成分に分けるのと混同しているのでしょうが、内積はスカラーです。
前と法線の内積をとった1つの数を、法線の各成分に掛け前の各成分に足します。
StaggeredNormalという意味のわからない変数名もたぶん意味を勘違いして名付けたのでしょう。

ところで壁ずりのことを「壁沿り」と言っていますが、そのような日本語は見つかりません。何か勘違いされていませんか?

投稿2021/02/13 04:20

ikadzuchi

総合スコア3047

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問