私はプレーヤーを直接見ない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;
ただし、上の図では、回転が原点からオフセットされているため、これはまったく機能しません。