C++ 相对于点旋转摄影机
我需要从第三人称视角围绕播放器旋转相机。(没什么特别的) 下面是我如何尝试的:C++ 相对于点旋转摄影机,c++,graphics,camera,glut,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
// 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件事:
- 目标的位置
- 距离目标的距离
- 方位角
- 极角
(如果您希望您的相机在方向上始终相对于目标,则还需要提供目标的方向,在本例中,我将仅使用世界方向)
请参阅以获取参考
您应该将方位角映射到平面控件上(并在到达2*PI
时使其循环),极轴角应该映射到垂直控件上(或者,如果玩家选择该选项并将其夹在-PI
和PI
之间,则将其反转-如果与世界向上
向量平行,请注意基于该向量的计算(-PI
或PI
)
距离可以是固定的,也可以由样条曲线驱动,在这种情况下,我们将假设一个固定的距离
<> P> >,为了计算你的位置,你可以从<代码> Work前进开始,这是一个<代码>单位向量<代码>,指向你通常认为是你前进的轴,例如<代码>(1,0,0)< /代码>(这里,如果我们正在构建一个相对的摄像头,我们将使用我们的目标的前向向量),你将它反转(<代码> *-1 < /COD>)去。“从目标”“到您的相机”
(以下是未经测试的伪代码,但您应该了解要点-另外,请注意,它可以简化,我只是为了清楚起见)
下一步是使用方位角旋转此矢量,方位角是相机的水平方向组件。类似于:
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);
现在,我们有一个单位向量
,它指向相机应该在的位置,如果你将它乘以你想要远离目标的距离
,再加上你目标的位置,你应该得到你的最终位置
。记住,这个单位向量,如果取反,代表forward
摄像机的矢量
Vector cameraPosition = targetPosition + finalRotatedVector * distanceFromTarget;
听起来你们需要添加另一个参数来表示相机和物体的距离,或者距离和方向?