2015-07-06 5 views
0

Я работаю над проектом единства, в котором я должен вычислить экранные координаты точки мира «вручную». (Поэтому я не могу использовать Camera.WorldToScreen() и т. Д.)матрицы преобразования строк и столбцов

На данный момент я смущен и даже не знаю, что делать, чтобы разъяснить это.

Я начал с this учебником и построен методом, который создает матрицу преобразования камеры, как этого

right_x, right_y, right_z, 0; 
up_x,  up_y,  up_z,  0; 
forward_x, forward_y, forward_z, 0; 
0,   0,   0,   1; 

Это не работало, пока я не использовал отрицаются вперед-вектор.

right_x, right_y, right_z, 0; 
up_x,  up_y,  up_z,  0; 
-forward_x, -forward_y, -forward_z, 0; 
0,   0,   0,   1; 

После этого изменения все было в порядке.

Позже я использовал this tutorial для всех недостающих шагов. Автор создает другую матрицу:

left_x, up_x, forward_x, 0; 
left_y, up_y, forward_y, 0; 
left_z, up_z, forward_z, 0; 
0,  0, 0,   1; 

Все остальные уроки, которые я нашел, пытаясь понять это также использовать этот вид матрицы. Они вставляют векторы в виде столбцов вместо строк. Хотя оба учебника предназначены для openGL, для меня работает только один из них.

Может кто-нибудь объяснить мне разницу? Почему это так? И может кто-нибудь объяснить, почему я должен инвертировать мой вектор вперед?

Я предполагаю, что оба вопроса связаны с тем, как openGL использует правша, а Unity использует левую систему координат. Но в этом случае я не понимаю, почему существуют два разных учебника OpenGL?

ответ

1

В двух учебниках, которые вы связали, описываются две разные вещи.

  1. olgdev.atspace.co.uk учебника о камере или вида матрице классического LookAt(). Эта матрица описывает перевод из мирового пространства в пространство камеры.

  2. songho.ca описывает матрицы преобразования в целом. Давайте проигнорируем, что то, что они обозначают как «левое», на самом деле должно быть «правильным». Они указывают, что они пытаются сделать здесь, что можно легко декодировать, что делает матрица аффинного преобразования, просто глядя на столбцы: x-Axis будет отображаться на то, что говорит самый левый colum, y-ось ко второму столбцу, z к третьему, а оригинал будет переведен в четвертый столбец.

right, up и forward матрицы определены в мировом пространстве в случае 1. Тем не менее, в случае второго урока, они обозначают полученный базис в пространстве глаз. Итак, концептуально, один обратный друг к другу. Матричные примеры, которые вы указали, игнорируют часть перевода. Остается только поворотные матрицы (все 3 вектора образуют ортонормированный базис), поэтому полученная матрица просто ортогональна. И обратная ортогональная матрица - это просто ее транспонирование.

(x_eye) (r_x_eye u_x_eye f_x_eye)  (x_world) 
(y_eye) = (r_y_eye u_y_eye f_y_eye) * (y_world) 
(z_eye) (r_z_eye u_z_eye f_z_eye)  (z_world) 

      (r_x_world r_y_world r_z_world)  (x_world) 
     = (u_x_world u_y_world u_z_world) * (y_world) 
      (f_x_world f_y_world f_z_world)  (z_world) 
+0

Я проигнорировал перевод, потому что сначала вычитал положение своей камеры из своей точки мира.Спасибо за ваш ответ – user2699453

+0

Я до сих пор не понимаю, почему это работает только с '- forward'. Не могли бы вы объяснить это? – user2699453

+1

Если для этого требуется '-forward' или' + forward', это зависит от того, как вы настроите матрицу проекции. Классические проекционные матрицы в GL (например, созданные теперь отмененными функциями glOrtho или 'glFrustum' /' gluPerspective' будут определять '-z_eye' как направление просмотра (но это всего лишь соглашение), так что ваши матрица представления должна преобразовать сцену таким образом, чтобы ваше «форвардное» направление в мировом пространстве трансформировалось в '-z_eye' (или, иначе говоря,' -forward' должно быть преобразовано в 'z_eye') – derhass

Смежные вопросы