我在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
该解决方案存在一些小缺陷:1)旋转速率应该乘以该帧的经过时间。 2)我会建议积累角度的旋转,而不是相机的位置本身 - 为了好的衡量,我可能会在角度上使用“WrapAngle”。 – 2010-09-12 02:59:52
@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
@Steve恐怕我不同意。虽然您一般不会将角度用于计算,但使用角度放置轨道摄像机是完全有效的。你必须从一个角度创建一个旋转矩阵,以便找出一个圆(你自己这样做)。我只是建议一个更好的方法来存储它。 Shawn的文章的主旨是像'CreateLookAt'这样的实现不应该使用角度和三角函数,而应该使用点和交叉产品(它会这样做)。 – 2010-09-13 14:12:41