C ++ / DirectX9で3人称カメラを実装する最も簡単な方法は何ですか


8

C ++とDirectX9は初めてなので、サードパーソンカメラを実装したいと思います。Quaternionベースのカメラについて読んだ後、私はそれを実装してみることにしました。しかし、それは本当に私の心を吹き飛ばすので、TPカメラを実装する最も簡単な方法は何ですか?

カメラがすべきことは次のとおりです。

  • 3DVector(x、y、z)に保存されている座標を追跡する

  • オブジェクトを中心に回転(スムーズ)

  • たぶんいくつかのタイプの「スプリング」=回転後、オブジェクトの後ろの通常の位置にゆっくりと戻ります

私の悪い英語をお詫び申し上げます:私はドイツ人で、まだ学校にいます!

前もって感謝します!

編集:

いくつか試した後、私はそれを手に入れました。

私が検討した最大の問題は、ワールドマトリックスから「方向」ベクトルを正しく抽出することでした。

私の研究中に、私はほとんどこのようなものを見つけました:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

それは私にはうまくいきません!代わりに私はこれをしました:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

スケーリングの場合:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

位置の設定:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

回転の場合は、(ターゲットの位置から)一時的なワールドマトリックスを作成し、希望どおりに回転させて方向を抽出する必要があります。

ローテーションのスムージングは​​実際にゲームに依存します!

この種の3人称カメラは非常に簡単に作成できます。

正解をくれた「ジェリコ」さん、本当にありがとうございました!


必要なものを実際に説明するための+1はめったにありません(たとえば、3番目の点がより詳細である可能性があっても、自由に回転していることを暗示していませんでしたか?)。
ワンドラ、2015年

はい、それは自由に回転するはずですが、回転が終わった後、プレイヤーの後ろのポイントにゆっくり戻って欲しいです!
匿名匿名

回答:


1

フォローするオブジェクトの変換行列を用意するのに役立ちます。この行列から前向きベクトルを抽出できます-座標系と行列の利き手に応じて、これは4番目のコンポーネントが削除された行または列の1つになります(4x4変換行列を使用し、スケール係数がない場合)-スケール係数は恐ろしいです多くの理由...しかし、倍率がある場合は、4番目のコンポーネントを削除した後で行/列を正規化できます。)

これを取得したら、オブジェクトの位置からこれを差し引くことで、オブジェクトの真後ろにカメラを配置できます。カメラを内外に移動するには、ベクトルをスケーリングし、オブジェクトの周りを回転させるには、オブジェクト行列のコピーに適用するxとyの回転(または、利き手などに応じてxz / zyなど)を行います。順方向を抽出する前。

最後に、動きをスムーズにするための最も簡単な解決策は、以前のオフセットと角度を追跡し、a ^(b.dt)で記述されたフレームレートに依存する量だけそれらに近づくことです。ここで、dtはデルタ時間で、a、bは選択したパラメーターです。a = 0.9とb = 30は、30 fpsでフレームごとに行うかのように、位置に向かって90%移動する効果を与えます。これは「無限インパルス応答」フィルターと呼ばれ、この種の平滑化のための古典的なハックです。

これは理想的ではないかもしれません。最小距離を選び、角度も制限したい場合があります。そうしないと、カメラがオブジェクトを通過する可能性があります。密集した世界の内部にいる場合は、介在するオブジェクトに対してクリッピングまたはフェードインが重要になります。

申し訳ありませんが、これは長いですが、ご存じのように、ささいな問題ではありません。

お役に立てれば。必要に応じて、より詳細な情報を提供できます。

(ps四元数は必要ありません-実際にはこの問題には役立ちません)


どうもありがとうございました!あなたはこれを行う方法についていくつかのアイデアをくれました。しかし、よろしければ、いくつかのコード例をいただければ幸いです。そして、なぜ四元数を使用しないのですか?私はそれらがこの種のものを行うために一般的に使用されていることを読みました(en.wikipedia.org/wiki/Quaternion)。
匿名匿名

あなたが説明したようにそれをやろうとしましたが、まだいくつかの問題があります。カメラはPlayerの後ろにプローベではありませんが、少なくとも彼の側のどこかにあります!XとYの回転があるパーツがわかりません。何を回転する必要がありますか ワールドマトリックス、方向ベクトル、またはプレーヤーの位置ベクトルのコピー?そして、どのように回転させるのですか?あなたが私を助けることができることを願っています!
匿名匿名

方向ベクトルまたはそれから抽出した行列(オブジェクトの変換行列であり、ワールドやビューの行列ではない)を回転させて回転させる軸角度回転行列を作成して乗算するか、三角法を使用する...
jheriko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.