2016-12-23 9 views
0

Я хочу создать 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 или такая вещь ...

Любая помощь будем очень благодарны!

+0

Для записей: ваше название говорит о получении матрицы проецирования, но то, что вы на самом деле делаете, это попытка получить матрицу просмотра модели. Эти два не совпадают. – BDL

+0

Спасибо. Я этого не заметил. – user7185318

+0

, если вы используете opengl 3 .x, у него нет стека матриц, и это приведет к сбою. oh, и существуют ранее существовавшие библиотеки, которые будут использоваться. withC++ обычно это glm. для python существует как минимум два и должен быть одним 3d-ориентированным libary, так как есть такой 3D-движок, как Panda3D – Swift

ответ

1

Не следует злоупотреблять OpenGL как матричной математической библиотекой! Вместо этого получите нужную библиотеку математической матрицы, которая имеет функции, необходимые для 3D-графики, и сделайте всю математическую матрицу с этим. Затем загрузите легко подготовленные матрицы в OpenGL, используя glLoadMatrix. В результате вы можете взять копии каждой промежуточной матрицы, которую вы готовите, и передать ее для последующих вычислений, например, той, которую вы хотите выполнить.

Не только делает этот код более удобным, но и делает его надежным, потому что все материалы для манипуляции матрицами были удалены из ядра OpenGL-3.3.

+0

Я уже думал об этом, но реализация этого займет много времени, и мне нужно отобразить его используя opengl, поэтому я думал, что исправление этой ошибки облегчит задачу вместо скопированной матрицы, которую я преобразую так же, как и с opengl-матрицей. – user7185318

+0

Я нашел эту статью: https://open.gl/transformations – user7185318

+0

@ user7185318: Вам не нужно выполнять всю математику самостоятельно. Вы можете использовать NumPy, или вы чувствуете, что это излишний Пирр. Смотрите это http://stackoverflow.com/questions/10162659/opengl-matrix-math-utilities-for-python – datenwolf