在XNA上移动3D相机

时间:2010-09-11 09:03:02

标签: directx xna direct3d

我在XNA上做了一些练习,我创建了一个代表Camera的类。

我的目标是当用户按下某些键时,在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度以环绕我放在屏幕上的一个物体。

为了更好地解释相机运动,我在这里播放了一段关于youtube的视频,它使用了我试图描述的确切动作(参见14秒) http://www.youtube.com/watch?v=19mbKZ0I5u4

1 个答案:

答案 0 :(得分:3)

假设视频中的摄影机在轨道上行驶,那么您将在XNA中实现这一目标。

为了便于阅读,我们只使用向量而不是它们各自的组件。因此'目标'意味着它是包含TargetX,TargetY和&amp ;;的Vector3。 TargetZ。与相机的位置相同。您可以将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可以调节到适合你的旋转速度。