我有一台第三人称相机,它不直接看玩家,而是在他面前的某个地方。
当用户进入拍摄模式时,我希望相机转向播放器以面对目标。
在上图中。“ O”是玩家(来源),“ L”是角色,“ C”是摄像机位置,“ T”是目标。我想旋转后视线C-> L,以使其绕原点(“ O”)经过T(C'-> L'-> T')。
基本上,我需要找到在图片中以红色显示的角度alpha。
我将相机位置存储在这样的结构中:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
因此,如果可以找到所需的角度,则可以执行以下操作:
cam->absoluteRotation = cam->absoluteRotation * alpha;
为了让玩家始终注视目标。
如果look望通过原点,我可以简单地做
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;
但是,在上图中,由于旋转从原点偏移,因此无法完全正常工作。