2016-12-23 5 views
0

私はpython、pyopenglとpygameを使用して3D Planet Simulationを作成します。すべて正常に動作しますが、今では視聴者の位置を決めて、そこに新しい惑星を追加することができます。Python OpenGL cantモデルビュー行列を取得

Using glGetFloatv to retrieve the modelview matrix in pyglet

しかし、それは私の作品のdoesnt:私はすでにその記事を見つけました。私はこのコードを持って、インターネットからいくつかのものと組み合わせること:

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は一個の引数を取ると言っています、それ以外はどうすればよいのでしょうか?すべてのヘルプは

...でしょう

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のか、そのような事別の引数が期待されているようです:

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

これは、次のエラーを与える:私はすでにことを試してみました大変感謝しています!

+0

レコードについて:あなたのタイトルは投影行列の取得について語りますが、実際にはモデルビュー行列を取得しようとしています。これらの2つは同じではありません。 – BDL

+0

ありがとうございます。私は気付かなかった。 – user7185318

+0

OpenGL 3xを使用している場合は、スタックスタックを持たず、getが失敗します。ああ、使用する既存のライブラリがあります。 withC++通常はglmです。 Pythonのためには、少なくとも2つがあり、1つの3d指向の図書館でなければなりませんPanda3D – Swift

答えて

1

OpenGLを行列演算ライブラリとして悪用しないでください!代わりに、3Dグラフィックスに必要な機能を持つ適切なマトリックス数学ライブラリを取得し、そのすべての行列計算を行います。その後、容易に準備されたマトリックスをglLoadMatrixを使用してOpenGLにロードします。その結果、準備しているすべての中間マトリックスのコピーを取って、実行したい計算のような後の計算のために渡すことができます。

これはコードを順応しやすくするだけでなく、すべてのマトリックス操作がOpenGL-3.3以降のコアから削除されているため、将来の証明にもなります。

+0

私はすでにそれを考えていましたが、 OpenGLを使っているので、私はこのエラーを修正すると、コピーされた行列ではなく、OpenGL行列と同じ方法で変換するのが簡単になると思った。 – user7185318

+0

私はこの記事を見つけました:https://open.gl/transformations – user7185318

+0

@ user7185318:自分ですべての数学を実装する必要はありません。あなたはNumPyを使うことができます。またはあなたはそれがPyrrの過度な使用であると感じます。これを参照してくださいhttp://stackoverflow.com/questions/10162659/opengl-matrix-math-utilities-for-python – datenwolf

関連する問題