0

三人称視点でプレイヤーの周りにカメラを回転させる必要があります。(空想は何もありません)。

これが私が試した方法です:

// Forward, right, and position define the plane - they have x,y,z components.

void rotate ( float angle, Vector interestPoint )
{
    Vector oldForward ( Forward );

    forward = forward * cos(angle) + right * sin(angle);    
    forward.Normalize();

    right = forward.CrossProduct ( up );
    right.Normalize();

    position = ( position + old_forward * position.Distance( interestPoint ) ) - (forward * position.Distance( interestPoint ) );

    this->angle += angle;
}

問題は、たとえば左に大きく回転すると、オブジェクトとカメラの間の距離が長くなることです。

4

1 に答える 1

0

ほとんどのアドベンチャー ゲームと同様に、非常に単純なorbitカメラの場合、次の3rd person4 つのものが必要になります。

  • ターゲットの位置
  • ターゲットからの距離
  • 方位角
  • 極角

(カメラの向きをターゲットに対して常に相対的にしたい場合は、ターゲットの向きも指定する必要があります。この場合、単純にワールドの向きを使用します)

参照については、球座標系を参照してください。

水平方向のコントロールに方位角をマッピングし (そして に達したときにループするようにします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;
于 2012-11-28T03:42:46.833 に答える