0

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

这是我尝试的方法:

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

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

4

1 回答 1

0

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

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

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

有关参考,请参阅球坐标系

你应该将你的方位角映射到你的水平控制上(并在你到达时让它循环2 * PI)并且你的极角应该映射到你的垂直控制上(或者如果玩家选择该选项并将其夹在-PI和之间则倒置PI- 注意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你想要远离你的目标并加上你的目标的位置,你应该得到你的 final position。请记住,如果取反,此单位向量表示forward您的相机的向量。

Vector cameraPosition = targetPosition + finalRotatedVector * distanceFromTarget;
于 2012-11-28T03:42:46.833 回答