Android 投影矩阵与否?(OpenGL ES 2.0)
是否有必要使用这样的投影矩阵:Android 投影矩阵与否?(OpenGL ES 2.0),android,matrix,rotation,opengl-es-2.0,projection,Android,Matrix,Rotation,Opengl Es 2.0,Projection,是否有必要使用这样的投影矩阵: Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); and Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); // Calculate the projection and view transformation and store results in mMVPMatrix Matrix.multip
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
and
Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate the projection and view transformation and store results in mMVPMatrix
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
我在做一个简单的2d(精灵)绕z轴旋转时遇到了很多麻烦
到目前为止,我取得的最大成功是操纵旋转矩阵(旋转和平移),并将其直接传递给顶点着色器
它不是完美的,带有一些剪切/扭曲/变形,但至少它允许我移动四边形的“枢轴”或中心点。如果我把上面几行放在整个过程中,我会得到各种奇怪的结果
What is the actual purpose of the lines above (I have read the android docs but I dont understand them) and are they necessary? Do people write OpenGl apps without them?
谢谢 OpenGL是一个C API,但许多框架会将其函数封装到其他函数中,以简化操作。例如,在OpenGL ES 2.0中,必须创建矩阵并将其传递给OpenGL。但是OpenGL并没有提供任何工具来实际构建和计算这些矩阵。这是许多其他库为您创建矩阵的地方,然后您将这些构造的矩阵传递给OpenGL——或者在进行计算后,函数很可能会为您将矩阵传递给OpenGL。这取决于图书馆 你可以很容易地不用这些框架,自己动手做,这是学习3D图形数学的一个很好的方法——数学对这一领域的一切都很关键 我相信你可以直接访问Android中的OpenGL API,但你选择使用Android本机提供的库(类似于苹果提供GLKit的方式,这是他们iOS框架的最新添加)。但这并不意味着您必须使用该库,但如果您知道该库正在做什么,它可能会提供更快的开发 在本例中,上述三个函数似乎是非常通用的矩阵/图形实用程序。您有一个平截函数,用于设置三维空间中的投影。您可以使用lookAt函数来确定相机的视图是什么——它在看什么,以及相机在那里看什么 还有一个矩阵乘法函数,因为最终所有矩阵都必须在应用到3D对象的顶点之前进行组合 重要的是要了解,典型的modelview矩阵将包括摄影机方向/位置,但也包括对象的旋转和缩放。因此,仅基于摄影机(从LookAt)发送模型视图是不够的,除非您希望对象保持在屏幕的中心,而不旋转 如果要展开矩阵乘法的所有数学运算,典型设置可能如下所示: 平截头体*摄影机*平移*旋转*顶点 中间的三个,摄影机、平移和旋转,通常组合到模型视图中,因此将它们乘以特定矩阵,然后将模型视图乘以平截头体投影矩阵,整个结果可以应用到顶点 你必须非常小心矩阵乘法的顺序。将平截头体乘以modelview与将modelview乘以平截头体不同
现在您提到了倾斜、扭曲等。其中一个可能的原因是您的视口。我确信API中的某个地方有一个选项可以设置视口的高度和宽度,通常是屏幕的高度和宽度。如果设置不同,您将看到不正确的纵横比和一些倾斜。只有一个可能的解释。或者可能是你的平截头体的参数不太正确,因为这肯定也会影响像歪斜这样的东西。你的眼睛位置的z是3,平截头体的近平面距离也是如此。如果你的精灵的z=0,那么它们会直接停在近平面上,这可能会造成一些影响。你可以试着减少你的近平面距离或者把你的精灵移向neg。z、 请在投票时发表评论。这个(不加评论的向下投票)对任何人都没有帮助。嘿@SebbyJohanns,谢谢你的回答和解释:-)我真的需要一个吗?我问的原因是,最初(没有应用平截头体(或正交投影)和摄影机,我的坐标从-1到+1,代码工作正常,但是,由于我应用了它们,范围发生了变化(-1.7到+1.7)-这仅适用于X轴,y轴似乎不受影响。因此我想知道在没有这些的情况下编写OpenGL代码是正常的做法吗?还是人们总是实现这些?你需要在3d图形中实现一个平截头体,是的,否则你或图形引擎如何知道3d空间的哪些区域将实际出现在屏幕上?也许你是我们的库如果您自己不提供投影,ing将为您创建默认正交投影。我强烈建议您学习一些有关3d工作原理的基础知识,这样您就可以更好地控制该过程。盲编码不是一个好方法。这里有一个很好的资源:和