【问题标题】:Proper method of creating a Side-On orthographic view matrix创建 Side-On 正交视图矩阵的正确方法
【发布时间】:2015-03-23 00:00:01
【问题描述】:

我正在尝试创建一个正交视图矩阵,从场景中查看场景(自上而下视图的 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 轴坐标位置严重错位。同样的方法也适用于自上而下的视图。

【问题讨论】:

    标签: c# opengl matrix graphics opentk


    【解决方案1】:

    我想通了。

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

    正确的方法看起来更像这样:

            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 视图矩阵。请注意,一切都被翻转了(仍在努力,但这就是为什么我的向上向量是负一而不是一)

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2019-10-03
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2012-03-23
      • 2019-09-20
      • 1970-01-01
      • 2013-08-29
      相关资源
      最近更新 更多