将第三人称相机旋转到目标


10

我有一台第三人称相机,它不直接看玩家,而是在他面前的某个地方。

当用户进入拍摄模式时,我希望相机转向播放器以面对目标。

我在说什么的例子

在上图中。“ 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;

但是,在上图中,由于旋转从原点偏移,因此无法完全正常工作。

Answers:


1

有一天对自己的回答是否有帮助:

SFDKT具有将目标点投影到当前相机外观方向的正确想法。

但是,我最大的问题是找到这一点P。结果证明,有一些三角函数可以解决这个问题。

考虑由三点CPO形成的三角形:

  1. 因为我知道长度LO,OC和CL,所以我可以计算C处的角度。

  2. 现在我知道了角度C以及OC和PO的长度。使用正弦定律,您可以找到O处的角度。(我发现此网站对于查找缺失的角度非常有用)

  3. 然后,我可以找到最后一个缺失角P并再次使用正弦定律来找到长度CP。

  4. 采取外观方向posC + normalized(CL)* lengthCP给我P的位置。

  5. 一旦有了PI,就可以计算OP和OT之间的最短旋转,这给了我旋转相机所需的四元数。

我确实对3D意外滚动有些麻烦,但我只是解决了Z = 0的问题,然后计算了丢失的俯仰旋转以保持相机的向上矢量笔直。


0

此图片增加了解决问题所需的对称性。

在此处输入图片说明

只要项目L沿向量CL使|P-O|=|T-O|

现在显然只有两个相同的三角形(CPOC'TO)旋转了所需的角度。IE浏览器ang(OT)-ang(OP)

C'L'CL旋转大约O相同的量之后相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.