是否有必要使用这样的投影矩阵:
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);
围绕z轴做一个简单的2d(精灵)旋转我没有遇到麻烦。
我迄今为止取得的最大成功是操纵旋转矩阵(旋转和平移)并将其直接传递给顶点着色器。
它并不完美,带有一些剪切/歪斜/扭曲但至少它允许我移动四边形的“枢轴”/中心点。如果我把上面的线放在整个东西中,我会得到各种奇怪的结果。
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?
谢谢!
答案 0 :(得分:0)
OpenGL是一个C API,但许多框架将其功能包装到其他功能中,以使生活更轻松。例如,在OpenGL ES 2.0中,您必须创建矩阵并将其传递给OpenGL。但是OpenGL没有为您提供实际构建和计算这些矩阵的任何工具。这是存在许多其他库来为您创建矩阵的地方,然后将这些构造的矩阵传递给OpenGL - 或者在进行计算之后,函数可以很好地将矩阵传递给OpenGL。只是取决于图书馆。
您可以轻松地使用这些框架并自行完成,这是学习3D图形数学的好方法 - 数学对于该领域的所有内容都非常关键。
我确信您可以直接访问Android中的OpenGL API,但是您选择使用Android本身提供的库(类似于Apple提供的GLKit,这是他们的iOS框架的最新成员)。但这并不意味着必须使用该库,但如果您知道库正在做什么,它可能会提供更快的开发。
在这种情况下,上面的三个函数似乎是非常通用的矩阵/图形实用程序。您有一个截头函数可以在3D空间中设置投影。你有lookAt功能,可以确定相机的视图是什么 - 它在哪里看,相机在它看起来在哪里。
你有一个矩阵乘法函数,因为最后所有矩阵必须先组合才能应用到3D对象的顶点。
重要的是要了解典型的模型视图矩阵将包括相机方向/位置,但它还将包括对象的旋转和缩放。因此,仅仅发送基于相机的模型视图(来自LookAt)是不够的,除非您希望对象保持在屏幕的中心,没有旋转。
如果要扩展矩阵乘法的所有数学运算,对于典型设置,它可能看起来像这样:
Frustum * Camera * Translation * Rotation * Vertices
那些中间的三个,相机,平移,旋转,通常组合在一起进入你的模型视图,所以将它们相加到那个特定的矩阵,然后将模型视图乘以平截头体投影矩阵,这整个结果可以应用于你的顶点
你必须非常小心矩阵乘法的顺序。通过模型视图乘以平截头体并不等于将模型视图乘以平截头体。
现在你提到倾斜,扭曲等。一个可能的原因是你的视口。我确定您的API中的某个位置可以设置视口的高度和宽度,通常是屏幕的高度和宽度。如果它们设置不同,您将获得不正确的宽高比和一些您看到的倾斜。只是一个可能的解释。或者可能是你的截头体的参数不太正确,因为这肯定会影响像歪斜之类的东西。