Я пытаюсь понять реализацию gluLookAt , следует за Python.
import numpy as np
def lookAt(center, target, up):
f = (target - center); f = f/np.linalg.norm(f)
s = np.cross(f, up); s = s/np.linalg.norm(s)
u = np.cross(s, f); u = u/np.linalg.norm(u)
m = np.zeros((4, 4))
m[0, :-1] = s
m[1, :-1] = u
m[2, :-1] = -f
m[-1, -1] = 1.0
return m
# test case 1
center = np.array([0.0, 0.0, 0.0])
target = np.array([0.0, 0.0, -1.0])
up = np.array([0.0, 1.0, 0.0])
view = lookAt(center, target, up)
print('c: {}, t: {}, up: {}'.format(center, target, up))
print('view: \n', view)
print('forward: \n', -view[2, :-1])
print('\n')
# test case 2
center = np.array([0.0, 0.0, 0.0])
target = np.array([-1.0, 0.0, 0.0])
up = np.array([0.0, 1.0, 0.0])
view = lookAt(center, target, up)
print('c: {}, t: {}, up: {}'.format(center, target, up))
print('view: \n', view)
print('forward: \n', -view[2, :-1])
А вот вывод:
c: [0. 0. 0.], t: [ 0. 0. -1.], up: [0. 1. 0.]
view:
[[ 1. -0. 0. 0.]
[ 0. 1. 0. 0.]
[-0. -0. 1. 0.]
[ 0. 0. 0. 1.]]
forward:
[-0. -0. -1.]
c: [0. 0. 0.], t: [-1. 0. 0.], up: [0. 1. 0.]
view:
[[ 0. 0. -1. 0.]
[ 0. 1. 0. 0.]
[ 1. -0. -0. 0.]
[ 0. 0. 0. 1.]]
forward:
[ -1. -0. 0.]
Мой вопрос: почему, когда я указываю положение камеры [0, 0, 0], указывая на [0, 0, -1], с увеличением [0, 1, 0], я получаю матрицу преобразования, третий столбец которой[0, 0, 1, 0] вместо [0, 0, -1, 0]?Согласно следующей картинке, я ожидаю, что третий столбец будет представлять прямой вектор, который в упомянутом примере должен быть [0, 0, -1, 0].
Я надеялся, что смогу удобно извлечь третий столбец матрицы вида и использовать его в качестве вектора прямой для преобразования translate
, предполагая, что я хочу перевести свою камеру, например, в прямом направлении.