【问题标题】:Python opengl cant get modelview matrix [duplicate]Python opengl无法获取模型视图矩阵[重复]
【发布时间】:2016-12-23 11:51:38
【问题描述】:

我想使用 python、pyopengl 和 pygame 制作一个 3D 行星模拟。一切正常,但现在我想确定观众的位置,以便他可以在那里添加新的行星。我已经找到那个帖子了:

Using glGetFloatv to retrieve the modelview matrix in pyglet

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

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]);

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

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 只接受一个参数,但它应该如何工作?我已经试过了:

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]);

这会产生以下错误:

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 或这样的东西...

任何帮助将不胜感激!

【问题讨论】:

  • 记录:您的标题谈到检索投影矩阵,但您实际上所做的是尝试获取模型视图矩阵。这两个不一样。
  • 谢谢。我没注意到。
  • 如果您使用的是 opengl 3 .x,它没有矩阵堆栈,并且 get 将失败。哦,还有一些预先存在的库可供使用。 withc++ 通常是 glm。对于 python,至少有两个并且应该是一个面向 3d 的库,因为有像 Panda3D 这样的 3d 引擎
  • 感谢您的帮助,快

标签: python opengl pygame simulation pyopengl


【解决方案1】:

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

这不仅使您的代码更易于遵循,而且还使其面向未来,因为所有矩阵操作的东西都已从 OpenGL-3.3 核心中移除。

【讨论】:

  • 我已经想过这样做,但是实现它需要很长时间,而且我需要使用 opengl 显示它,所以我认为修复这个错误会很容易,而不是我转换的复制矩阵与我使用 opengl 矩阵的方式相同。
  • 我找到了这篇文章:open.gl/transformations
  • @user7185318:您不必自己实现所有数学运算。你可以使用 NumPy,或者你觉得 Pyrr 太过分了。看到这个stackoverflow.com/questions/10162659/…
  • 我已经开始实现一个简单的相机类...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多