我需要从第三人称视角围绕播放器旋转相机。 (没什么好看的。)
这是我尝试的方式:
// 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;
}
问题在于,如果让我们左转很多,物体和相机之间的距离会增加。
答案 0 :(得分:0)
对于非常简单的orbit
相机,与大多数3rd person
冒险游戏一样,您需要4件事:
(如果你希望你的相机总是相对于目标方向,你需要提供目标的方向,在这种情况下我将简单地使用世界方向)
请参阅Spherical coordinate systems以获取参考。
您应该在水平控制上映射方位角(并在到达2 * PI
时使其环绕)并且您的极角应该映射到垂直控制上(如果玩家选择该选项并使它夹在-PI
和PI
之间 - 根据世界Up
向量进行计算,如果你与它平行(-PI
或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;