3人称カメラをターゲットに向けて回転させる


10

私はプレーヤーを直接見ない3人称カメラを持っていますが、彼の前のどこかにあります。

ユーザーが撮影モードに入ると、カメラがプレイヤーを振り向いてターゲットに向かいます。

私が話していることの例

上の画像。「O」はプレーヤー(原点)、「L」はルックアット、「C」はカメラの位置、「T」はターゲットです。ルックアットラインC-> Lを回転させて、原点( "O")を中心にT(C '-> L'-> T ')を通過するようにします。

基本的には、画像に赤で表示した角度アルファを見つける必要があります。

私はカメラの位置をそのような構造に保存します:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

だから私が探している角度を見つけることができれば私は次のようなことをすることができます:

cam->absoluteRotation = cam->absoluteRotation * alpha;

プレイヤーに常にターゲットを見させる。

LookatがOriginを通り過ぎていた場合、私は簡単にできます

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

ただし、上の図では、回転が原点からオフセットされているため、これはまったく機能しません。

回答:


1

それが誰か他の人を助けてくれるかどうか自分に答える:

SFDKTは、ターゲットポイントを現在のカメラの視線方向に投影するという正しい考えを持っています。

しかし、私の最大の問題は、この点を見つけることでした。P。少し三角法でそれを解決できたことがわかりました。

3つのポイントCPOによって形成される三角形を考えます。

  1. LO、OC、CLの長さを知っているので、Cでの角度を計算できます。

  2. これで、角度CとOCおよびPOの長さがわかりました。サインの法則を使用すると、Oでの角度を見つけることができます(このウェブサイトは、欠けている角度を見つけるのに非常に役立ちました)。

  3. 次に、最後の欠落している角度Pを見つけ、再度正弦の法則を使用して長さCPを見つけます。

  4. 視線方向を取るposC +正規化(CL)* lengthCPは、Pの位置を示します。

  5. PIを取得したら、OPとOTの間の最短回転を計算できます。これにより、カメラを回転する必要があるクォータニオンが得られます。

3Dの不要なロールで少し問題がありましたが、Z = 0の問題を解決してから、欠落しているピッチ回転を計算して、カメラのアップベクトルをまっすぐに保ちました。


0

この図は、質問を簡単に解決するために必要な対称性を追加します。

ここに画像の説明を入力してください

Lベクトルに沿って投影するだけCLです|P-O|=|T-O|

これで、明らかに2つの同一の三角形(CPOおよびC'TO)が希望の角度で回転しただけになります。IEang(OT)-ang(OP)

C'およびとL'同じですがCL回転後Oも同じ量だけ回転します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.