相对于一个点旋转相机
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
时使其循环)并且您的极角应该映射到您的垂直控件上(或者如果玩家选择该选项并使其被夹住则反转在 -PI
和 PI
之间 - 如果你平行于它(-PI
或 PI
),请注意基于世界 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;
【讨论】:
以上是关于相对于一个点旋转相机的主要内容,如果未能解决你的问题,请参考以下文章