Я хочу создать 3D-моделирование планет с использованием python, pyopengl и pygame. Все работает отлично, но теперь я хочу определить позицию зрителей, чтобы он мог добавлять туда новые планеты. Я уже нашел этот пост:Python opangl can not get modelview matrix
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 или такая вещь ...
Любая помощь будем очень благодарны!
Для записей: ваше название говорит о получении матрицы проецирования, но то, что вы на самом деле делаете, это попытка получить матрицу просмотра модели. Эти два не совпадают. – BDL
Спасибо. Я этого не заметил. – user7185318
, если вы используете opengl 3 .x, у него нет стека матриц, и это приведет к сбою. oh, и существуют ранее существовавшие библиотеки, которые будут использоваться. withC++ обычно это glm. для python существует как минимум два и должен быть одним 3d-ориентированным libary, так как есть такой 3D-движок, как Panda3D – Swift