将真实世界坐标映射到OpenGL坐标系

时间:2017-11-14 04:52:25

标签: android opengl-es coordinate-transformation

我目前正在尝试实施基于室内地图的AR浏览器,但我遇到了几个问题,让我们来看看这个数字: enter image description here

在这张图中,我已经将坐标更改为OpenGL的右手坐标系。

在我们的真实场景中,

如果角度 FOV / 2 且相机高度 h 那么我可以得到最接近的可见点 P(0,0,-n)

鉴于角度 B 且相机高度 h ,我可以在最近的位置得到 Q(0,0,-m)点可见点和最长的可见点。

出现问题:当我完成设置我的顶点(包括P和Q)并使用方法Matrix.setLookAtM之类的

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的坐标系?

2 个答案:

答案 0 :(得分:1)

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

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

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

    视图矩阵可以通过Matrix.setLookAtM

  • 进行设置
  • 投影矩阵:
    投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间转换到剪辑空间,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)通过用剪辑坐标的w分量进行划分。
    在Perspective Projection中,投影矩阵描述了从针孔摄像机到视口的2D点看世界中3D点的映射。
    相机平截头体(截头金字塔)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。

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

  • 设置

enter image description here



您可以设置单独的视图矩阵和单独的投影矩阵,最后将它们相乘。宽高比和视野是[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);

答案 1 :(得分:0)

感谢@ Rabbid76的支持,我终于弄明白了。

图1:现实场景 enter image description here

图2:OpenGL场景 enter image description here

在现实生活中,如果我们面向北方,我们的坐标系就像:

  • 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. 最后,我们用现实生活中的相机高度计算纵横比,并计算C,C&C;在OpenGL中,并将其应用于其他坐标。
  4. 通过以上操作,我们可以神奇地将真实世界的坐标映射到OpenGL坐标系。