【问题标题】:Mapping real-world coordinate to OpenGL coordinate system将真实世界坐标映射到 OpenGL 坐标系
【发布时间】:2017-11-14 04:52:25
【问题描述】:

我目前正在尝试实现一个基于室内地图的AR-browser,但是遇到了几个问题,我们看一下图:

在这个图中,我已经把坐标改成了 OpenGL 的右手坐标系。

在我们的真实场景中,

给定角度 FOV/2 和相机高度 h 然后我可以得到最近的可见点 P(0,0,-n).

给定角度 B 和相机高度 h 然后我可以得到最近的点 Q(0,0,-m)可见点和最长可见点。

这里有一个问题:当我完成设置我的顶点(包括 P 和 Q)并使用方法 Matrix.setLookAtM like

Matrix.setLookAtM(modelMatrix, 0, 0f,h,0f,0f,-2000f,0f,0f,1f,0f);

纵横比不正确。 如果相机高度h设置为0.92,FOV设置为68度,n应该是1.43,但是在OpenGL中的坐标最近的点不是 (0,0,-1.43f)。所以我想知道如何解决这个问题,如何将真实世界的坐标映射到OpenGL的坐标系?

【问题讨论】:

    标签: android opengl-es coordinate-transformation


    【解决方案1】:

    在一次渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。

    • 模型矩阵:
      模型矩阵定义了场景中网格的位置、方向和相对大小。模型矩阵将网格的顶点位置转换到世界空间。

    • 查看矩阵:
      视图矩阵描述了观察场景的方向和位置。视图矩阵从世界空间转换到视图(眼睛)空间。在视口上的坐标系统中,X 轴指向左侧,Y 轴向上,Z 轴在视图外(注意在右手系统中,Z 轴是 X-轴的叉积)轴和 Y 轴)。

      可以通过Matrix.setLookAtM设置视图矩阵

    • 投影矩阵:
      投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图空间变换到剪辑空间,剪辑空间中的坐标变换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的归一化设备坐标 (NDC)通过与剪辑坐标的w 分量相除。
      在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
      相机平截头体(截断的金字塔)中的眼睛空间坐标映射到立方体(标准化设备坐标)。

      可以通过Matrix.perspectiveM设置透视投影矩阵



    您可以设置一个单独的视图矩阵和一个单独的投影矩阵,最后将它们相乘。纵横比和视野是 [Matrix.perspectiveM] 的参数:

    Matrix viewM = new Matrix();
    Matrix.setLookAtM(viewM, 0, 0, 0, 0f, 0f,-2000f, 0f, 0f, 1.0f, 0.0f);
    
    Matrix prjM = new Matrix();
    Matrix.perspectiveM(prjM, 0, fovy, aspect, zNear, zFar);
    
    Matrix viewPrjM = new Matrix();
    Matrix.multiplyMM(viewPrjM, 0, prjM, 0, viewM, 0);
    

    【讨论】:

      【解决方案2】:

      感谢@Rabbid76的支持,我终于自己搞定了。

      图 1:真实场景

      图 2:OpenGL 场景

      在现实生活中,如果我们面向北方,我们的坐标系会是这样的:

      • x 指向东方
      • y 指向北方
      • z 指向天空

      所以给定一个用户持有的相机,假设它的高度是 1.5 米,它的视野是 68 度,我们可以参考最近的可见点位于 P(0,2.223,0)。我们可以将角度 B 设置为 89 度,因此 QP 段将成为智能手机屏幕上的可见地面。

      我们如何将现实生活中的坐标映射到 OpenGL 坐标系?我发现我们必须经过几个步骤:

      1. 将相机位置指定为原点(例如图 2 中的 C)。
      2. 由于 OpenGL 总是从 (1,1) 到 (-1,-1) 绘制,我们必须将 C 到 C' 的距离指定为 1,使得 C' 为 (0, -1, 0) .
      3. 最后,我们用现实生活中的相机高度和 OpenGL 中的段 C、C' 计算纵横比,并将其应用于其他坐标。

      通过上述操作,我们可以神奇地将真实世界坐标映射到 OpenGL 坐标系。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        相关资源
        最近更新 更多