1

カメラのかなり単純なシナリオだと思いますが、穴居人の脳は 2 次元以上のことを考えることを拒否しています。

3D カメラをオブジェクトの後ろに配置する必要があります。このオブジェクトは任意のサーフェスにくっつくことができるため、「上」とは何かというカメラの考えは、任意のベクトルになる可能性があります。この質問と非常によく似ていますが、「プレーヤー」オブジェクトを直接制御しておらず、代わりに CreateLookAt を使用しようとしているため、解決策を理解するのに苦労しています:クォータニオン カメラを使用しているときに回転を計算するにはどうすればよいですか? ?

テストを簡単にするために、オブジェクトが球体上にあると仮定しましょう。

私は現在持っています:

  • 3D 空間でのターゲット オブジェクトの絶対位置。
  • オブジェクトが現在置かれているサーフェスの法線を表す単位ベクトル。この場合、球上の三角形の法線。
  • カメラがオブジェクトを周回する方法を表す X 角度と Y 角度。

必要なのはこれだけだと思いますが、うまく機能するようにすべてをまとめる方法がわかりません。オブジェクトのnorによって角度付きカメラを変換する必要があることはわかっています。私の最善の試みは次のとおりです。

Matrix orientation = Matrix.CreateRotationY(OrbitYaw) * Matrix.CreateRotationX(OrbitPitch);

orientation.Up = CurrentNormal;
orientation.Right = Vector3.Cross(orientation.Forward, orientation.Up);
orientation.Right = Vector3.Normalize(orientation.Right);
orientation.Forward = Vector3.Cross(orientation.Up, orientation.Right);
orientation.Forward = Vector3.Normalize(orientation.Forward);

Vector3 Target = ObjectPosition;

Vector3 Position = Vector3.Transform(new Vector3(0,50,0), orientation);

Matrix View = Matrix.CreateLookAt(Position, Target, CurrentNormal);

ポジショニング コードは正しいように見えますが、2 番目の問題があるため、見分けるのは非常に困難です。位置が変わると、カメラが「回転」しているように見えます。これは理にかなっています。カメラが知っているのはその位置とどこを見るかだけであり、カメラ自体をどのように回転させるべきかを明示的に伝えていません。これは、オブジェクトを追跡している間、カメラが一定の位置合わせを維持するために必要なことです (カメラを同じ相対位置に保つために必要なことは別として)。

4

1 に答える 1

0

Tim S が彼のコメントで言ったことを少し拡張すると、カメラが追従しているオブジェクトから向きのいくつかの側面を借りて、カメラの向きを変えることができます。

cameraPosition = objectPosition + (objectOrientation.Backward * 50);
cameraTarget = objectPosition;

Matrix cameraArc = Matrix.CreateFromAxisAngle(objectOrientation.Up, orbitYaw) * Matrix.CreateFromAxisAngle(objectOrientation.Right, orbitPitch);//assumes objectOriention is a ortho-normal matrix

cameraPosition = Vector3.Transform(cameraPosition - cameraTarget, cameraArc) + cameraTarget;

view = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up);

最後の行にプラグインVector3.Upしても (あなたの場合はそうすべきです)、ビュー マトリックスのアップ ベクトルはオブジェクトのアップ ベクトルと一致します。

于 2013-03-19T13:44:34.880 に答える