gluLookAt
определяет матрицу преобразования просмотра 4 * 4 для использования OpenGL.
"Математическая" матрица 4 * 4 выглядит следующим образом:
c0 c1 c2 c3 c0 c1 c2 c3
[ Xx Yx Zx Tx ] [ 0 4 8 12 ]
[ Xy Yy Zy Ty ] [ 1 5 9 13 ]
[ Xz Yz Zz Tz ] [ 2 6 10 14 ]
[ 0 0 0 1 ] [ 3 7 11 15 ]
Нообраз памяти матрицы OpenGL 4 * 4 выглядит следующим образом:
[ Xx, Xy, Xz, 0, Yx, Yy, Yz, 0, Zx, Zy, Zz, 0, Tx, Ty, Tz, 1 ]
См. Язык затенения OpenGL 4.6, 5.4.2 Векторные и матричные конструкторы, стр. 101 и OpenGL ES Shading Language 3.20 Спецификация, 5.4.2 Векторные и матричные конструкторы, стр. 100 :
Чтобы инициализировать матрицу путем указания векторов или скаляров, компоненты назначаютсяматричные элементы в главном порядке столбцов .
mat4(float, float, float, float, // first column
float, float, float, float, // second column
float, float, float, float, // third column
float, float, float, float); // fourth column
Обратите внимание, по сравнению с математической матрицей, где столбцы пишутся сверху вниз, что выглядит естественно, наинициализация матрицы OpenGL, столбцы пишутся слева направо.Это привело к тому, что компоненты x, y, z оси или перевода находятся в прямой последовательности в памяти.Это большое преимущество при доступе к векторам оси или вектору трансляции матрицы.См. Также Тип данных (GLSL) - конструкторы матриц .
Это означает, что вам нужно «поменять» столбцы и строки (транспонировать) матрицы:
def get_lookat_matrix(position_vector, front_vector, up_vector):
m1 = np.zeros([4, 4], dtype=np.float32)
m2 = np.zeros([4, 4], dtype=np.float32)
z = normalize_vector(-front_vector)
x = normalize_vector(np.cross(up_vector, z))
y = np.cross(z, x)
m1[0, :3] = x
m1[1, :3] = y
m1[2, :3] = z
m1[3, 3] = 1.0
m2[0, 0] = m2[1, 1] = m2[2, 2] = 1.0
m2[3, :3] = -position_vector
m2[3, 3] = 1.0
return np.matmul(m1, m2)
def get_projection_matrix(near, far):
aspect = 1.0
fov = 1.0 # 90 Degrees
m = np.zeros([4, 4], dtype=np.float32)
m[0, 0] = fov/aspect
m[1, 1] = fov
m[2, 2] = (-far+near)/(far-near)
m[3, 2] = (-2.0*near*far)/(far-near)
m[2, 3] = -1.0
return m