2010-09-11 140 views
1

我在XNA上做了一些练习,并创建了一个代表摄像头的类。在XNA上移动3D摄像头

我的目标是,当用户按下某些键在X轴上对摄像机(不是目标)进行90度翻译(以查看从不同角度放置在场景中的对象)。到目前为止,我在X,Y和Z移动相机没有任何问题。

其实设置我的相机我用下面的代码行:

public void SetUpCamera() 
{ 
      #region ## SET DEFAULTS ## 
      this.FieldOfViewAngle = 45.0f; 
      this.AspectRatio =1f; 
      this.NearPlane = 1.0f; 
      this.FarPlane = 10000.0f; 
      #endregion 

      this.ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(this.FieldOfViewAngle), 16/9, this.NearPlane, this.FarPlane); 
      this.ViewMatrix = Matrix.CreateLookAt(new Vector3(this.PositionX, this.PositionY, this.PositionZ), new Vector3(this.TargetX, this.TargetY, this.TargetZ), Vector3.Up); 
} 

我有这样的方法,将摄像机:在游戏中(更新事件处理程序

public void UpdateView() 
{ 
    this.ViewMatrix = Matrix.CreateLookAt(new Vector3(this.PositionX, this.PositionY, this.PositionZ), new Vector3(this.TargetX, this.TargetY, this.TargetZ), Vector3.Up); 
} 

然后我有以下代码)

if (keyboardstate.IsKeyDown(Keys.NumPad9)) 
{ 
    this.GameCamera.PositionZ -= 1.0f; 
} 
if (keyboardstate.IsKeyDown(Keys.NumPad3)) 
{ 
    this.GameCamera.PositionZ += 1.0f; 
} 
this.GameCamera.UpdateView(); 

我想知道如何使这台摄像机翻译90度s将我放置在屏幕上的一个物体翻转过来。

解释我自己对这里的摄影机运动更好的是,它使用即时通讯试图描述的精确运动在YouTube上的视频(见14秒) http://www.youtube.com/watch?v=19mbKZ0I5u4

回答

3

假设相机在视频绕汽车,这里是你如何在XNA中实现这一点。

为了便于阅读,我们将使用矢量而不是其各个组件。所以'目标'意味着它是一个包含TargetX,TargetY,& TargetZ的Vector3。与相机的位置相同。您可以将X,Y,Z值分解为字段,并将Vector3s分解出来,以便稍后再插入此代码中,但对于您最好是在矢量级别而不是组件级别下工作。

//To orbit the car (target) 
cameraPosition = Vector3.Transform(cameraPosition – target, Matrix.CreateRotationY(0.01f)) + target; 
this.ViewMatrix = Matrix.CreateLookAt(cameraPosition, target, Vector3.Up); 

由于所有矩阵旋转作用大约相交世界原点,用旋转矩阵来旋转摄像机周围的汽车的轴,旋转对象具有被移位,使得目标(并且因此旋转轴)位于世界原点。 CameraPosition - 目标完成。现在cameraPosition可以旋转一点点。一旦cameraPosition旋转一点点,它就需要被发送回手边的场景,这就是线路末尾的'+目标'。

0.01f可以调整到任何适合您的转速。

+0

该解决方案存在一些小缺陷:1)旋转速率应该乘以该帧的经过时间。 2)我会建议积累角度的旋转,而不是相机的位置本身 - 为了好的衡量,我可能会在角度上使用“WrapAngle”。 – 2010-09-12 02:59:52

+0

@Andrew。 1)我在实践中同意,但是为了简化算法,我有意地留下了“逝去的时间”,以便可以更好地对其进行可视化和理解。也许不是一个好的选择,我不知道。 2)我不同意这个。在3D中,存储角度与旋转/方向不一样是不好的。在2D中,存储某个东西方向的角度表示是很好和适当的。在3D中,这很糟糕。查看此链接,重点放在博客文章的最后一段:http://blogs.msdn.com/b/shawnhar/archive/2010/02/12/doing-math-in-2d-vs-3d。 aspx – 2010-09-13 13:12:04

+0

@Steve恐怕我不同意。虽然您一般不会将角度用于计算,但使用角度放置轨道摄像机是完全有效的。你必须从一个角度创建一个旋转矩阵,以便找出一个圆(你自己这样做)。我只是建议一个更好的方法来存储它。 Shawn的文章的主旨是像'CreateLookAt'这样的实现不应该使用角度和三角函数,而应该使用点和交叉产品(它会这样做)。 – 2010-09-13 14:12:41