2016-02-06 1 views
0

мне нужна помощь с расчетом метода LookAt Вот мой методLWJGL Матрица LookAt метод

public void lookAt(Vector3f position, Vector3f direction, Vector3f up) { 
    Vector3f f = new Vector3f(); 
    Vector3f u = new Vector3f(); 
    Vector3f s = new Vector3f(); 
    Vector3f.sub(direction, position, f); 
    f.normalise(f); 
    up.normalise(u); 
    Vector3f.cross(f, u, s); 
    s.normalise(s); 
    Vector3f.cross(s, f, u); 

    this.setIdentity(); 
    this.m00 = s.x; 
    this.m10 = s.y; 
    this.m20 = s.z; 
    this.m01 = u.x; 
    this.m11 = u.y; 
    this.m21 = u.z; 
    this.m02 = -f.x; 
    this.m12 = -f.y; 
    this.m22 = -f.z; 
    this.m30 = -Vector3f.dot(s, position); 
    this.m31 = -Vector3f.dot(u, position); 
    this.m32 = Vector3f.dot(f, position); 
} 

, но когда я проверить это, как этот camera.lookAt(position, new Vector3f(1, 0 ,0), new Vector3f(0, -1, 0)); моей камеры смотрит вниз, конец, если только я сделать это camera.lookAt(position, new Vector3f(10000, 0 ,0), new Vector3f(0, -1, 0));, камера смотрит вперед. Вы можете помочь?

P.S. извините за мой английский

ответ

0

Второй параметр функции lookAt обычно не является тем направлением, в котором вы хотите посмотреть, но точкой, на которую вы хотите посмотреть. Насколько я вижу, расчет вашего метода также ожидает вторую точку, а не направление (которое рассчитывается из двух точек и сохраняется в f).

В заключение, результаты, которые вы получите, выглядят корректно для меня, за исключением того, что вы передали неправильные параметры функции.

Как создать функцию, которая создает матрицу из точки и направление

вращения требуется один, который отображает минус Z-направление на вектор вида. Кроме того, мы хотим, чтобы x-вектор отображался таким образом, чтобы он был перпендикулярен плоскости, натянутой по виду и вектору вверх. Это можно относительно легко достичь, написав -view в третьей строке матрицы 3x3. Остальные два вектора затем могут быть вычислены как перекрестные произведения вида и вектора вверх, что приводит к правому вектору, на который должна отображаться ось х. Последний вектор (целевое отображение для оси y) затем вычисляется поперечным произведением вида и правого вектора. Поперечные продукты для последнего вектора используется, так как мы знаем, что все матрицы вращения имеют базовые векторы, перпендикулярные:

viewv = normalize(-view) 
rightv = normalize(cross(view, up)) 
upv = normalize(cross(view, up)) 

         -- rightv -- 
rotation_matrix = [ -- upv -- ] 
         -- viewv -- 

Когда камера находится в начале координат, то мы сделали в настоящее время. Но так как это вообще не так, нам нужно добавить часть перевода, которая преобразует сцену таким образом, что камера является источником. Таким образом, t = -camera.

Конечная матрица теперь состоит из первого перевода пространство, а затем вращая его в соответствии с нашей расчетной матрицы:

lookat_matrix = rotation_matrix * translate(-camera) 

Поскольку это довольно поздно здесь и в зависимости от нотации вы используете это может быть, матрица поворота должна быть транспонирована и что некоторые знаки должны быть скорректированы.

+0

Хорошо, как сделать метод для матрицы, который будет выглядеть в направлении? – Rcoinb

+0

Обновленный вопрос – BDL