创建 Side-On 正交视图矩阵的正确方法

Proper method of creating a Side-On orthographic view matrix

我正在尝试创建一个从场景(从 top-down 视图成 90 度角)查看场景的正交视图矩阵。

这是我当前尝试的代码:

        ortho = Matrix4.CreateOrthographicOffCenter(-500f / side_zoom + (float)side_translate.X, 500f / side_zoom + (float)side_translate.X,
            500f / side_zoom + (float)side_translate.Y, -500f / side_zoom + (float)side_translate.Y, -100000, 100000) * Matrix4.CreateRotationX(90);

基本上,CreateOrthographicOffCenter() * RotationX(90)

乍一看,这符合预期。但是当你放大近距离或平移到侧面时,形状会严重扭曲。

这是标准缩放下的场景,按预期渲染:

这是放大后的样子:

如您所见,尽管呈现的是静态模型,但镶嵌矩形已分为三角形和多边形。场景的所有其他视角保持不变。其他值得注意的是,所有模型都停在到达顶部的 1/4 处。再多的努力也无法将他们带到底线之上,他们的底线总是止于此。它在那里呈现线条,即使您希望线条超出限制并停止呈现。

还有最后一点,Ortho.inverted() * screen_coord_of_mouse returns 正确的 X-axis 坐标,但是 Y-axis 坐标错位得可怕。同样的方法非常适用于 top-down 视图。

我想通了。

基本上...旋转正交矩阵虽然有趣,但并不是正确的方法。

正确的方法应该是这样的:

        Matrix4 view = Matrix4.LookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, -1));
        ortho = view * Matrix4.CreateOrthographicOffCenter(-500f / side_zoom + (float)side_translate.X, 500f / side_zoom + (float)side_translate.X,
            500f / side_zoom + (float)side_translate.Y, -500f / side_zoom + (float)side_translate.Y, -100000, 100000);

基本上,在正交矩阵后面乘以一个lookAt视图矩阵。请注意,一切都被翻转了(仍在努力,但这就是为什么我的上向量是负一而不是负一)