Ошибка при использовании glLoadMatrix и glm.value_ptr () - PullRequest
1 голос
/ 28 апреля 2020

В настоящее время я работаю над модулем камеры в стиле FPS в python, используя OpenGL и GLM. Используя glm, я генерирую матрицу вида с gluLookAt(). Когда я пытаюсь загрузить его в OpenGL, используя glm.value_ptr(), он возвращает ошибку:

AttributeError: ("'CtypesPointerHandler' object has no attribute 'arrayByteCount'", <function asArrayTypeSize.<locals>.asArraySize at 0x0000021D3BD0CD08>)

Вот мой код:

viewMatrix = glm.lookAt(self.position, self.position + self.front, self.upVector)
glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(glm.value_ptr(viewMatrix))

Скажите, пожалуйста, что я делаю неправильно, и, возможно, объяснить, что glm.value_ptr() возвращает точно? Заранее спасибо!

1 Ответ

0 голосов
/ 28 апреля 2020

Когда вы используете PyOpenGL, вам нужно преобразовать матрицу в список. См. PyOpenGL - glLoadMatrix:

viewMatrix = glm.lookAt(self.position, self.position + self.front, self.upVector)
matList = [viewMatrix[i][j] for i in range(4) for j in range(4)]

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(matList)

В качестве альтернативы glLoadMatrix принимает массив ctypes.c_float. См. ctypes - Типы данных Например:

matArray = (ctypes.c_float *16).from_buffer(viewMatrix)

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(matArray)

Можно даже использовать numpy.array

matArray = np.array(viewMatrix, dtype=np.float32)

glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(matArray)
...