Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将投影矩阵X44分解为左、右、下、上、近和远边界值_Android_Opengl Es_Qcar Sdk - Fatal编程技术网

Android 将投影矩阵X44分解为左、右、下、上、近和远边界值

Android 将投影矩阵X44分解为左、右、下、上、近和远边界值,android,opengl-es,qcar-sdk,Android,Opengl Es,Qcar Sdk,有人能帮我从投影矩阵X44中得到左、右、下、上、近、远边界值吗 首先,您可以查看这些矩阵是如何为和(或框架中的类似函数)的相应调用定义的。接下来的步骤取决于投影的类型,即正交投影(例如从glOrtho)或透视投影(例如从glrustum或glupperspective),可以通过查看第三列来确定 现在对于正交矩阵,很容易得到两个方程: right - left = 2 / m11 right + left = -2 * m14 / m11 通过这些,你可以很容易地计算出right=(1-m14

有人能帮我从投影矩阵X44中得到左、右、下、上、近、远边界值吗

首先,您可以查看这些矩阵是如何为和(或框架中的类似函数)的相应调用定义的。接下来的步骤取决于投影的类型,即正交投影(例如从
glOrtho
)或透视投影(例如从
glrustum
glupperspective
),可以通过查看第三列来确定

现在对于正交矩阵,很容易得到两个方程:

right - left = 2 / m11
right + left = -2 * m14 / m11
通过这些,你可以很容易地计算出
right=(1-m14)/m11
left=right-2/m11
(你可以重新检查我的心算中是否有错误)。其他两对参数也类似(注意符号
m33

对于透视投影,应首先使用
m33
m34
计算
near
far
。然后您可以计算
right/left
bottom/top
,类似于上述情况,但使用计算出的
near


总而言之,一旦你知道了基于参数的矩阵公式,它就可以归结为一组简单的2x2方程组,很容易求解。一个更有趣的问题是,为什么实际上需要从投影矩阵计算这些参数。如果你真的需要它们,你应该存储它们(因为你是构建矩阵的人)。否则,它听起来像是另一个使用OpenGL进行更多事情(如场景管理)的实例,而不是它的实际用途,只是一个简单的绘图API。

以下是所述方程系统的分辨率:

对于正交矩阵:

near   =  (1+m34)/m33;
far    = -(1-m34)/m33;
bottom =  (1-m24)/m22;
top    = -(1+m24)/m22;
left   = -(1+m14)/m11;
right  =  (1-m14)/m11;
对于透视矩阵:

near   = m34/(m33-1);
far    = m34/(m33+1);
bottom = near * (m23-1)/m22;
top    = near * (m23+1)/m22;
left   = near * (m13-1)/m11;
right  = near * (m13+1)/m11;

可以用文档中定义的公式替换M11、M12等值,并检查其正确性。

< P>以供参考,我在下面的复制中用C++中的接近、远等值对OPENGL用0索引列主投影矩阵:

进行复制。
float near = m_projectionMatrix[3][2] / (m_projectionMatrix[2][2] - 1.0f);
float far = m_projectionMatrix[3][2] / (m_projectionMatrix[2][2] + 1.0f);
logStderr(VERBOSE, "near, far %5.2f, %5.2f...\n", near, far);

float nearBottom = near * (m_projectionMatrix[2][1] - 1) / m_projectionMatrix[1][1];
float nearTop = near * (m_projectionMatrix[2][1] + 1) / m_projectionMatrix[1][1];
float nearLeft = near * (m_projectionMatrix[2][0] - 1) / m_projectionMatrix[0][0];
float nearRight = near * (m_projectionMatrix[2][0] + 1) / m_projectionMatrix[0][0];
logStderr(VERBOSE, "nearLeft, nearRight, nearTop, nearBottom %5.2f, %5.2f, %5.2f, %5.2f...\n", nearLeft, nearRight, nearTop, nearBottom);

float farBottom = far * (m_projectionMatrix[2][1] - 1) / m_projectionMatrix[1][1];
float farTop = far * (m_projectionMatrix[2][1] + 1) / m_projectionMatrix[1][1];
float farLeft = far * (m_projectionMatrix[2][0] - 1) / m_projectionMatrix[0][0];
float farRight = far * (m_projectionMatrix[2][0] + 1) / m_projectionMatrix[0][0];
logStderr(VERBOSE, "farLeft, farRight, farTop, farBottom %5.2f, %5.2f, %5.2f, %5.2f...\n", farLeft, farRight, farTop, farBottom);

实际上我必须这样做。帮助我实现。@user779554我对您所说的那些库没有任何经验,但作为您可能不知道的一般信息,您不必从矩阵中提取
glOrtho
glFrustum
调用的参数,以便将相同的投影矩阵导入OpenGL。您只需使用
glLoadMatrix
glMultMatrix
函数直接输入矩阵即可。不确定这是否是您想要实现的,因为我不完全理解其他问题。仅供参考,此答案使用(1索引)行主矩阵坐标,OpenGL默认使用列主矩阵坐标。如果不转置坐标,
m34
将是一个常量值。