ほとんどのアドベンチャー ゲームと同様に、非常に単純なorbit
カメラの場合、次の3rd person
4 つのものが必要になります。
- ターゲットの位置
- ターゲットからの距離
- 方位角
- 極角
(カメラの向きをターゲットに対して常に相対的にしたい場合は、ターゲットの向きも指定する必要があります。この場合、単純にワールドの向きを使用します)
参照については、球座標系を参照してください。
水平方向のコントロールに方位角をマッピングし (そして に達したときにループするようにします2 * PI
)、垂直方向のコントロールに極角をマッピングする必要があります (または、プレーヤーがそのオプションを選択して と の間で固定する場合は反転します-PI
-PI
気を付けてください)Up
あなたがそれに平行に行く場合、ワールドベクトルに基づく計算(-PI
またはPI
)
距離は、固定することも、スプラインによって駆動することもできます。この場合、固定距離を想定します。
したがって、位置を計算するには、 から始めますWorldForward
。これは、unit vector
たとえば、一般的に前方と見なされる軸のポインティングです(1,0,0)
(ここで、相対カメラを作成する場合は、ターゲットの前方ベクトルを使用します)。それは(* -1
)「ターゲットから」「あなたのカメラへ」行くことです。
(以下はテストされていない擬似コードですが、要点を理解する必要があります-また、単純化できることに注意してください。わかりやすくするために行っただけです)
次のステップはrotate
、カメラの水平方向コンポーネントである方位角を使用して、このベクトルを作成することです。何かのようなもの:
Vector toCamera = WorldForward * -1;
Matrix horizontalRotation = Matrix.CreateRotationZ(azimuth); // assuming Z is up
Vector horizontalRotationPosition = horizontalRotation.Transform(toCamera);
この時点で、ターゲットの周りを水平に回転できるカメラができました。もう 1 つの軸を追加するには、極角回転を使用して再び変換するだけです。
Matrix verticalRotation = Matrix.CreateRotationY(polar); // assuming Y is right
Vector finalRotatedVector = verticalRotation.Transform(horizontalRotationPosition);
今、私たちが持っているのはunit vector
、カメラがあるべき位置を指す です。これにdistance
、ターゲットから保持したい を掛けて、ターゲットの位置を追加すると、最終的な が得られますposition
。この単位ベクトルを否定するforward
と、カメラのベクトルを表すことに注意してください。
Vector cameraPosition = targetPosition + finalRotatedVector * distanceFromTarget;