我在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
答案 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可以调节到适合你的旋转速度。