OpenGL в Python и перенасыщение рендеринга неверные результаты, какие-либо предложения, почему? - PullRequest
0 голосов
/ 24 июня 2019

Обращаясь к чтению файла формата SMB OpenGL Superbible , где находится исходный код, я создал программу с некоторой помощью. Теперь я сравниваю результаты с тем, что на самом деле получаю.

Что я получаю: enter image description here

Как должен выглядеть результат: enter image description here

Любые предложения относительно того, почему вывод неверен? Я в тупике на этом этапе. Спасибо.

1 Ответ

1 голос
/ 24 июня 2019

Тор ограничен ближней плоскостью проекции.

Изменить матрицу проекции:

proj_matrix = m3dPerspective(m3dDegToRad(60.0), float(self.width) / float(self.height), 0.1, 100.0);

и матрица вида:

mv_matrix = (GLfloat * 16)(*identityMatrix)
m3dRotationMatrix44(mv_matrix, currentTime * m3dDegToRad(45.0), 1.0, 0.0, 0.0)
m3dTranslateMatrix44(mv_matrix, 0.0, 0.0, -3.0)

Если вы хотите объединить разные матрицы, то вам нужно реализовать матрицу «умножение»:

def m3dMultiply(A, B):
    C = (GLfloat * 16)(*identityMatrix)
    for k in range(0, 4):
        for j in range(0, 4):
            C[k*4+j] = A[0*4+j] * B[k*4+0] + A[1*4+j] * B[k*4+1] + \
                       A[2*4+j] * B[k*4+2] + A[3*4+j] * B[k*4+3]
    return C

например. Объединить матрицу перевода и матрицы вращения вокруг осей x и y:

T = (GLfloat * 16)(*identityMatrix)
m3dTranslateMatrix44(T, 0, 0, -4)

RX = (GLfloat * 16)(*identityMatrix)
m3dRotationMatrix44(RX, currentTime * m3dDegToRad(17.0), 1.0, 0.0, 0.0)

RY = (GLfloat * 16)(*identityMatrix)
m3dRotationMatrix44(RY, currentTime * m3dDegToRad(13.0), 0.0, 1.0, 0.0)

mv_matrix = m3dMultiply(T, m3dMultiply(RY, RX))


Обратите внимание, что если вы хотите использовать numpy.matmul вместо m3dMultiply, тогда вам нужно .reshape из 16-элементного массива в 2-мерный массив 4x4. e.g.:

R = np.matmul(np.array(RX).reshape(4,4), np.array(RY).reshape(4,4))
mv_matrix = np.matmul(R, np.array(T).reshape(4,4))

или numpy.matrix и оператор *:

mv_matrix = np.matrix(RX).reshape(4,4) * np.matrix(RY).reshape(4,4) * np.matrix(T).reshape(4,4)

См. Также Python: Как заставить куб вращаться и двигаться в примере OpenGL Superbible

...