相对于一个点旋转相机

Posted

技术标签:

【中文标题】相对于一个点旋转相机【英文标题】:Rotate camera relative to a point 【发布时间】:2012-11-28 01:08:33 【问题描述】:

我需要从第三人称视角围绕玩家旋转相机。 (没什么花哨的)。

这是我的尝试:

// 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;

问题是,如果我们说左转很多次,物体和相机之间的距离就会增加。

【问题讨论】:

听起来您需要为相机与物体的距离添加另一个参数,或者可能是距离和方向? 【参考方案1】:

对于一个非常简单的orbit 相机,就像大多数3rd person 冒险游戏一样,你需要 4 样东西:

目标的位置 与目标的距离 方位角 极角

(如果您希望您的相机在方向上始终相对于目标,您还需要提供目标的方向,在这种情况下,我将简单地使用世界方向)

参考Spherical coordinate systems。

您应该将您的方位角映射到您的水平控件上(并在您到达2 * PI 时使其循环)并且您的极角应该映射到您的垂直控件上(或者如果玩家选择该选项并使其被夹住则反转在 -PIPI 之间 - 如果你平行于它(-PIPI),请注意基于世界 Up 向量的计算

距离可以是固定的,也可以由样条线驱动,在这种情况下,我们将假设一个固定的距离。

所以,要计算你的位置,你从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);

此时,您有一个可以围绕目标水平旋转的相机,现在要添加另一个轴,您只需使用极角旋转再次进行变换:

Matrix verticalRotation = Matrix.CreateRotationY(polar); // assuming Y is right
Vector finalRotatedVector = verticalRotation.Transform(horizontalRotationPosition);

现在,我们有一个unit vector,它指向相机应该在的位置,如果你将它乘以你想要远离目标的distance并加上你的目标位置,你应该得到你的最终position。请记住,如果取反,此单位向量表示您的相机的 forward 向量。

Vector cameraPosition = targetPosition + finalRotatedVector * distanceFromTarget;

【讨论】:

以上是关于相对于一个点旋转相机的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL相机的相对旋转

Three.js如何让对象相对于另一个旋转?

Unity3d怎么获得孙物体相对于父物体的旋转坐标

使用 Aruco Markers 获取相机位置和旋转

推导坐标旋转公式

罗德里格斯相对于向量的一组点的旋转