我正在尝试创建一个正视图矩阵,从场景中查看场景(从上到下的视图成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
返回正确的X轴坐标,但是Y轴坐标可能错位。这种方法适用于自上而下的视图。
答案 0 :(得分:0)
我想出来了。
基本上......旋转正交矩阵,就像那样有趣,不是正确的方法。
正确的方法看起来更像是这样:
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
视图矩阵。请注意,所有内容都被翻转(仍在继续工作,但这就是为什么我的向上矢量是负数而不是一个)