Ios 在OpenGL ES中应用变换和缩放后,如何从矩阵中获得更新的坐标?
我正在iPhone中的opengl层上应用一些变换和缩放。我想知道的是,在应用glTranform和glScale之后,是否有任何api来检索矩形坐标Ios 在OpenGL ES中应用变换和缩放后,如何从矩阵中获得更新的坐标?,ios,opengl-es,matrix,Ios,Opengl Es,Matrix,我正在iPhone中的opengl层上应用一些变换和缩放。我想知道的是,在应用glTranform和glScale之后,是否有任何api来检索矩形坐标 我找到了一个apiglGetFloatV(GL\u MODELVIEW\u MATRIX,MATRIX)。此api返回描述矩阵信息的16个元素的数组。我可以从中检索更新的坐标吗?有没有其他api可以提供帮助?我认为这是不可能的。即使是这样,它也可能不是应用程序的最佳选择,因为这意味着从GPU检索数据 最简单的解决方案是在CPU上的程序中执行相同的
我找到了一个api
glGetFloatV(GL\u MODELVIEW\u MATRIX,MATRIX)
。此api返回描述矩阵信息的16个元素的数组。我可以从中检索更新的坐标吗?有没有其他api可以提供帮助?我认为这是不可能的。即使是这样,它也可能不是应用程序的最佳选择,因为这意味着从GPU检索数据
最简单的解决方案是在CPU上的程序中执行相同的转换,例如通过实现矩阵乘法函数
如果你没有时间重新发明轮子,有一个叫做的库可以让你做矩阵乘法,它是基于OpenGL的,所以使用起来应该不会太难。您所要做的就是创建与当前使用的相同的变换矩阵,除非您使用GLM函数而不是OpenGL函数(或除了OpenGL函数之外)。然后,只需将所需的矩形顶点与GLM矩阵相乘,即可得到变换后的点
请记住,使用此方法时,如果您打算变换许多顶点,则会遇到性能问题(因为您将在CPU上按顺序进行变换,而不是在GPU上并行进行变换)。如果您只想获得几个矩形的变换顶点,这应该是您的最佳选择。在iOS上,最简单的方法可能是使用
GLKMathProject
函数。函数签名如下所示:
GLKVector3 GLKMathProject(GLKVector3 object, GLKMatrix4 model, GLKMatrix4 projection, int *viewport);
GLMatrix4 modelviewMat;
glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMat.m);
要使用它,您需要:
- 要变换的坐标位于对象中。您将一次变换矩形的一个坐标
- 模型视图矩阵,您将通过前面提到的
调用获得该矩阵。您需要将其转换为GLKMatrix4(见下文)glGetFloatv
- 投影矩阵,也可以通过
获得,但可以通过glGetFloatv
参数获得GL\u projection\u matrix
- 视口的坐标,即要绘制到的窗口中的位置。如果尚未调用glViewport,则视口是一个int数组,其中包含元素[0,0,窗口宽度,窗口高度]
GLKVector3 GLKMathProject(GLKVector3 object, GLKMatrix4 model, GLKMatrix4 projection, int *viewport);
GLMatrix4 modelviewMat;
glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMat.m);
希望这有帮助!GLM库也很有用,但如果使用GLKit,则不必向项目中添加任何其他文件,只需导入GLKit框架。是的,我使用的是1.0。这是一个旧项目。OpenGL ES 1.0未被弃用
EAGLContext
仍然为keagrenderingapiopengles1
提供有效的EAGLRenderingAPI
@EagleContext提供的CaptainRedmuff只是为了向后兼容。但是ES 1不应该因为很多原因而被使用。文档中没有任何地方表明OpenGL ES 1被弃用,也不应该被避免。“如果你正在维护OpenGL ES 1.1应用程序,你应该考虑更新你的代码来更新OpenGL ES版本。”