首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python opengl无法获取模型视图矩阵

Python opengl无法获取模型视图矩阵
EN

Stack Overflow用户
提问于 2016-12-23 19:51:38
回答 1查看 692关注 0票数 0

我想做一个3D星球模拟使用python,pyopengl和pygame。一切正常,但现在我想确定观察者的位置,这样他就可以在那里添加新的行星。我已经找到那篇文章了:

Using glGetFloatv to retrieve the modelview matrix in pyglet

但它对我不起作用。结合互联网上的一些东西,我有这个代码:

代码语言:javascript
复制
x=0;
y=0;
z=0;
mdl=(GLfloat * 16)()
glGetFloatv(GL_MODELVIEW_MATRIX, mdl);
x = -(mdl[0] * mdl[12] + mdl[1] * mdl[13] + mdl[2] * mdl[14]);
y = -(mdl[4] * mdl[12] + mdl[5] * mdl[13] + mdl[6] * mdl[14]);
z = -(mdl[8] * mdl[12] + mdl[9] * mdl[13] + mdl[10] * mdl[14]);

但当我尝试执行它时,它给出了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "Planets.py", line 372, in <module>
    main() 
  File "Planets.py", line 264, in main
    glGetFloatv(GL_MODELVIEW_MATRIX, mdl);
  File "/usr/lib/python2.7/dist-packages/OpenGL/latebind.py", line 45, in __call__
    return self._finalCall( *args, **named )
  File "/usr/lib/python2.7/dist-packages/OpenGL/wrapper.py", line 570, in wrapperCall
    pyArgs = tuple( calculate_pyArgs( args ))
  File "/usr/lib/python2.7/dist-packages/OpenGL/wrapper.py", line 347, in calculate_pyArgs
    args
ValueError: glGetFloatv requires 1 arguments (pname), received 2: (GL_MODELVIEW_MATRIX, <__main__.c_float_Array_16 object at 0x7f0d01f4e830>)

它说glGetFloatv只需要一个参数,但是它还应该如何工作呢?我已经试过了:

代码语言:javascript
复制
x=0;
y=0;
z=0;
mdl=(GLfloat * 16)()
glGetFloatv(mdl);
x = -(mdl[0] * mdl[12] + mdl[1] * mdl[13] + mdl[2] * mdl[14]);
y = -(mdl[4] * mdl[12] + mdl[5] * mdl[13] + mdl[6] * mdl[14]);
z = -(mdl[8] * mdl[12] + mdl[9] * mdl[13] + mdl[10] * mdl[14]);

这会产生以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "Planets.py", line 372, in <module>
    main() 
  File "Planets.py", line 264, in main
    glGetFloatv(mdl);
  File "/usr/lib/python2.7/dist-packages/OpenGL/latebind.py", line 45, in __call__
    return self._finalCall( *args, **named )
  File "/usr/lib/python2.7/dist-packages/OpenGL/wrapper.py", line 571, in wrapperCall
    cArgs = tuple(calculate_cArgs( pyArgs ))
  File "/usr/lib/python2.7/dist-packages/OpenGL/wrapper.py", line 374, in calculate_cArgs
    yield converter( pyArgs, index, self )
  File "/usr/lib/python2.7/dist-packages/OpenGL/converters.py", line 195, in __call__
    return self.arrayType.zeros( self.getSize(pyArgs) )
  File "/usr/lib/python2.7/dist-packages/OpenGL/converters.py", line 232, in getSize
    return self.lookup( specifier )
TypeError: ('unhashable type', 'Failure in cConverter <OpenGL.converters.SizedOutput object at 0x7f91788a9380>', (<__main__.c_float_Array_16 object at 0x7f915d804830>,), 1, <ctypes.glGetFloatv object at 0x7f917890c0e0>)

似乎还会有另一场争论...pname或诸如此类的东西。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2016-12-23 19:59:11

不要滥用OpenGL作为矩阵数学库!取而代之的是,获得一个适当的矩阵数学库,它具有3D图形所需的函数,并用它完成所有的矩阵数学运算。然后使用glLoadMatrix将准备好的矩阵加载到OpenGL中。这样做的结果是,您可以复制您准备的每个中间矩阵,并将其传递给以后的计算,例如您想要执行的计算。

这不仅使你的代码更容易理解,也使它成为未来的证明,因为从OpenGL-3.3核心开始,所有的矩阵操作都被删除了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41300978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档