繁体   English   中英

相对于点旋转相机

[英]Rotate camera relative to a point

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

这是我尝试的方法:

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

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

对于非常简单的orbit摄像机,像大多数3rd person冒险游戏一样,您需要做以下四件事:

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

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

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

您应该在水平控件上映射方位角(并在达到2 * PI时使其成环旋转),而极角应在垂直控件上进行映射(如果玩家选择了该选项并将其夹在-PI之间,则应该反转和PI如果与世界Up向量平行( -PIPI ), -PI注意基于世界向量的计算

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

因此,要计算您的位置,请从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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM