Я видел, что вы используете библиотеку GLM для матричных операций, поэтому из кода GLM реализация LookAt выглядит следующим образом:
mat4x4 lookAt(vec3 const & eye, vec3 const & center, vec3 const & up)
{
vec3 f = normalize(center - eye);
vec3 u = normalize(up);
vec3 s = normalize(cross(f, u));
u = cross(s, f);
mat4x4 Result(1);
Result[0][0] = s.x;
Result[1][0] = s.y;
Result[2][0] = s.z;
Result[0][1] = u.x;
Result[1][1] = u.y;
Result[2][1] = u.z;
Result[0][2] =-f.x;
Result[1][2] =-f.y;
Result[2][2] =-f.z;
Result[3][0] =-dot(s, eye);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
return Result;
}
Вы сначала нормализовать векторы вы будете использовать (f - это направление, на которое вы смотрите, u вверх и s - это правильный вектор). Затем, чтобы убедиться, что вверх вектор перпендикулярно направлению и правых векторов вы пересчитывать его в качестве кросс продукта, потому что, когда вы даете вектор до вы не можете убедиться, что его перпендикулярно глаза -центр вектора (вид в направлении), они просто образуют плоскость, которая дает вам правый вектор.
Матрица построена из этих. Для более подробной информации, как это работает, проверьте страницу http://www.songho.ca/opengl/gl_transform.html. Вкратце: это матрица, которая создает вам новую систему координат, поэтому coloumns - это оси. Затем при последнем coloumn применяется матрица перевода.
(Посмотрите на единичную матрицу:
AXIS TRANSFORM
x y z transl.
1, 0, 0, 0
0, 1, 0, 0,
0, 0, 1, 0
0, 0, 0, 1
Это дает стандарт системы координат без перевода.)
Затем умножить это с проекционными и модели матриц (р * v * м) , порядок важен. Когда вы пишете свою реализацию, убедитесь, что вы используете основные матрицы coloumn, из-за opengl или транспонируете их.
Надеюсь, это поможет.