Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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 投影矩阵与否?(OpenGL ES 2.0)_Android_Matrix_Rotation_Opengl Es 2.0_Projection - Fatal编程技术网

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工作原理的基础知识,这样您就可以更好地控制该过程。盲编码不是一个好方法。这里有一个很好的资源:和