Функция "Look at" возвращает матрицу вида с неправильной позицией вперед?(Реализация Python) - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь понять реализацию 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].

enter image description here

Я надеялся, что смогу удобно извлечь третий столбец матрицы вида и использовать его в качестве вектора прямой для преобразования translate, предполагая, что я хочу перевести свою камеру, например, в прямом направлении.

1 Ответ

0 голосов
/ 27 февраля 2019

Код, который вы показали, использует правую систему координат, где направление обзора (в системе камеры) вдоль отрицательного z.Вот почему существует

m[2, :-1] = -f

Итак, просто отмените эту запись, чтобы получить прямое направление.

Имейте в виду, что функции просмотра обычно создают матрицу представления, которая является обратной кматрица модели камеры.Тогда прямое направление будет фактически отрицательным третьим рядом (а не третьим столбцом).Кстати, именно это и делает ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...