Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
Ios 在OpenGL ES中应用变换和缩放后,如何从矩阵中获得更新的坐标?_Ios_Opengl Es_Matrix - Fatal编程技术网

Ios 在OpenGL ES中应用变换和缩放后,如何从矩阵中获得更新的坐标?

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上的程序中执行相同的

我正在iPhone中的opengl层上应用一些变换和缩放。我想知道的是,在应用glTranform和glScale之后,是否有任何api来检索矩形坐标


我找到了一个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);
要使用它,您需要:

  • 要变换的坐标位于对象中。您将一次变换矩形的一个坐标
  • 模型视图矩阵,您将通过前面提到的
    glGetFloatv
    调用获得该矩阵。您需要将其转换为GLKMatrix4(见下文)
  • 投影矩阵,也可以通过
    glGetFloatv
    获得,但可以通过
    GL\u projection\u matrix
    参数获得
  • 视口的坐标,即要绘制到的窗口中的位置。如果尚未调用glViewport,则视口是一个int数组,其中包含元素[0,0,窗口宽度,窗口高度]
要获得作为GLKMatrix4的矩阵,您应该能够执行以下操作:

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版本。”