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;

听起来你们需要添加另一个参数来表示相机和物体的距离,或者距离和方向?