【问题标题】:XNA View Matrix IssuesXNA 查看矩阵问题
【发布时间】:2014-06-11 20:27:54
【问题描述】:

我一直在研究加载游戏几何图形并跟踪玩家位置和视图的东西,但我遇到了一个问题:如果所有轴都被打乱,我无法旋转视图。

以下是俯仰角和偏航角为 0 的程序截图(就像游戏的客户端一样): http://i.stack.imgur.com/DXhIr.jpg

这是我的视图矩阵代码:

public void UpdateViewMatrix()
{
        Vector3 pos = Position;
        pos.X *= -1;
        pos.Y *= -1;
        pos.Z *= -1;

        this.ViewMatrix = Matrix.CreateScale(1) * Matrix.CreateLookAt(Vector3.Zero, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) * Matrix.CreateTranslation(pos) * Matrix.CreateFromYawPitchRoll(-MathHelper.PiOver2, -MathHelper.PiOver2, MathHelper.Pi);

        this.Frustum.Matrix = (this.ViewMatrix * this.ProjectionMatrix);
        if (this.CameraUpdated != null) this.CameraUpdated(this, new EventArgs());
}

我不确定为什么在更新视图矩阵之前还要翻转所有坐标。

提前致谢!

【问题讨论】:

  • 我不确定它为什么会发生,但它一定与描述视图的矩阵与描述世界的矩阵混合有关。如果你想解决它,那么不要将旋转矩阵与视图相乘,而是使用它来转换目标向量的外观。

标签: c# matrix xna


【解决方案1】:

我不确定为什么我必须先翻转所有坐标 更新视图矩阵

你可能不知道。

在 Xna 第一人称射击游戏中,处理摄像机视图矩阵以跟随角色的一种简单方法是创建该角色的世界矩阵的副本,将其偏移到后面和稍上方,然后将其反转。这样,为玩家完成的所有旋转和位置操作都不必为相机复制。这是一个简单的例子:

//player moved and rotated and player's world matrix is determined

Matrix cameraWorld = playerWorld;
cameraWorld.Translation += (cameraWorld.Backward * followingDistance) +
                           (cameraWorld.Up * verticalOffset);
ViewMatrix = Matrix.Invert(cameraWorld);

现在摄像机视图矩阵的方向与玩家相同,并且会像胶水一样粘在他身上。

【讨论】:

  • playerWorld矩阵会是玩家Vector3位置的变换矩阵吗?
  • 它是玩家的旋转和位置的组合。然后,它与您在渲染播放器时设置 effect.World 的矩阵相同。
  • 这最终帮助了我——我发现在渲染地图的顶点时,我不小心使用了我的原始视图矩阵(我第一次更新它时)作为我的世界矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多