Найти Up-Vector для LookAt Matrix (2 вращения) - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь установить матрицу lookAt, чтобы смотреть на точку {0,0,0} из глаза в {5,5,10}. Я успешно реализовал матрицу LookAt для глаза в {5,0,10}, но второй угол (направление y) отбрасывает мой вектор «вверх», поэтому он больше не равен {0,1,0}. Может ли кто-нибудь помочь мне определить, каким должен быть вектор «вверх» с точки зрения матрицы глаз? Я бы хотел, чтобы ось х была параллельна горизонту.

Я использую Mathematica, но собираюсь реализовать на Python ...

Ниже приведен код для использования глаза в {5,0,10}, но я бы хотел изменить глаз на {5,5,10} и найти правильный вектор «вверх»


   `eye = {5, 5, 10};
   l = {0, 0, 0};
   Mt = IdentityMatrix[4];
   F = l - eye;
   Mt[[1 ;; 3, 4]] = -eye;

   >>>Mt={{1, 0, 0, -5}, {0, 1, 0, 0}, {0, 0, 1, -10}, {0, 0, 0, 1}}

   forward = Normalize[F];
   up = Normalize[{0, 1, 0}];
   left = Cross[up, forward];
   Mr = IdentityMatrix[4];
   Mr[[1, 1 ;; 3]] = left;
   Mr[[2, 1 ;; 3]] = up;
   Mr[[3, 1 ;; 3]] = forward;
   >>> Mr={{-0.894427, 0., 0.447214, 0.}, {0., 1., 0., 0.}, {-0.447214, 
  0., -0.894427, 0.}, {0., 0., 0., 1.}}

   >>>Mr.Mt={{-0.894427, 0., 0.447214, 0.}, {0., 1., 0., 0.},    {-0.447214, 
  0., -0.894427, 11.1803}, {0., 0., 0., 1.}}`

1 Ответ

0 голосов
/ 13 июня 2019

Вам необходимо повторно ортогонализировать ваш вектор роста:

up = Cross[forward, left];
...