相对于一个点旋转相机

时间:2012-11-28 01:08:34

标签: c++ graphics camera glut

我需要从第三人称视角围绕播放器旋转相机。 (没什么好看的。)

这是我尝试的方式:

// 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 个答案:

答案 0 :(得分:0)

对于非常简单的orbit相机,与大多数3rd person冒险游戏一样,您需要4件事:

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

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

请参阅Spherical coordinate systems以获取参考。

您应该在水平控制上映射方位角(并在到达2 * PI时使其环绕)并且您的极角应该映射到垂直控制上(如果玩家选择该选项并使它夹在-PIPI之间 - 根据世界Up向量进行计算,如果你与它平行(-PIPI

距离可以固定或由样条驱动,对于这种情况,我们将假设一个固定的距离。

因此,要计算您的排名,请先从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;