2012-11-28 77 views
0

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

这是我尝试:

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

这听起来像你需要添加另一个参数的距离相机从物体,或者距离和方向? – user1118321

回答

0

对于一个非常简单的orbit相机,最喜欢的3rd person冒险游戏,你将需要4两件事:

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

(如果你想让你的相机始终处于关闭状态您需要提供目标的方向,在这种情况下,我将简单地使用世界方向)

请参阅Spherical coordinate systems以供参考。

您应该将您的方位角映射到您的水平控制上(并在到达2 * PI时使其旋转),并且您的极角应该映射到您的垂直控制上(或者如果玩家选择该选项并使其夹紧-PIPI - 注意立足于世界Up矢量计算,如果你去它平行(-PIPI

的距离可以固定或通过花键驱动,对于这种情况,我们假设一个固定的距离。

所以,要计算你的位置哟你开始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;