-1

是否有必要使用这样的投影矩阵:

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?

谢谢!!

4

1 回答 1

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,通常被组合到你的模型视图中,所以将它们相乘以获得那个特定的矩阵,然后将模型视图乘以你的平截头体投影矩阵,整个结果可以应用于你的顶点。

您必须非常小心矩阵乘法的顺序。将平截头体乘以模型视图与将模型视图乘以平截头体不同。

现在您提到了倾斜、扭曲等。造成这种情况的一个可能原因是您的视口。我确定您的 API 中的某处是设置视口高度和宽度的选项,通常是屏幕的高度和宽度。如果它们设置不同,您将看到不正确的纵横比和一些倾斜。只是一种可能的解释。或者可能是您的截锥体参数不太正确,因为这肯定也会影响偏斜之类的事情。

于 2013-04-06T00:25:17.140 回答