我目前正在尝试实施基于室内地图的AR浏览器,但我遇到了几个问题,让我们来看看这个数字:
在这张图中,我已经将坐标更改为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的坐标系?
答案 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
您可以设置单独的视图矩阵和单独的投影矩阵,最后将它们相乘。宽高比和视野是[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.5米且其视野为68度,我们可以参考最近的可见点位于P(0,2.223,0)。我们可以将角度B设置为89度,因此段QP将成为智能手机屏幕上的可见地面。
我们如何将现实生活的坐标映射到OpenGL坐标系?我发现我们必须经历几个步骤:
通过以上操作,我们可以神奇地将真实世界的坐标映射到OpenGL坐标系。