Подтвердить что ты не робот

Понимание glm:: lookAt()

Я следую учебнику, чтобы изучить OpenGL, в котором они использовали функцию glm::lookAt() для создания представления, но я не могу понять работу glm::lookAt() и, по-видимому, нет подробной документации GLM. Может ли кто-нибудь помочь мне понять параметры и работу glm::lookAt(), пожалуйста?

Документация GLM гласит:

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt   
(   
    detail::tvec3< T > const &  eye,
    detail::tvec3< T > const &  center,
    detail::tvec3< T > const &  up 
)

Мое настоящее понимание заключается в том, что камера находится в eye и обращена к center. (И я не знаю, что такое up)

4b9b3361

Ответ 1

Вы пытаетесь понять внутреннюю работу или просто параметры?

Вектор up в основном представляет собой вектор, определяющий направление вашего "вверх". Почти во всех нормальных случаях это будет вектор (0, 1, 0) т.е. К положительному Y. eye - положение точки зрения камеры, а center - это то место, где вы смотрите (позиция). Если вы хотите использовать вектор направления D вместо центрального положения, вы можете просто использовать eye + D как центральное положение, где D может быть, например, единичным вектором.

Что касается внутренней работы или более подробной информации, это общая основная функция для построения матрицы представлений. Попробуйте прочитать документы для gluLookAt(), который является функционально эквивалентным.

Ответ 2

Здесь вектор Up определяет направление "вверх" в вашем 3D-мире (для этой камеры). Например, значение vec3(0, 0, 1) означает, что точки оси Z вверх.

Eye - это точка, в которой находится виртуальная 3D-камера.

И Center - точка, на которую смотрит камера (в центре сцены).

Лучший способ понять что-то - сделать это самостоятельно. Вот как преобразование камеры может быть построено с использованием 3 векторов: Eye, Center и Up.

LMatrix4 LookAt( const LVector3& Eye, const LVector3& Center, const LVector3& Up )
{
    LMatrix4 Matrix;

    LVector3 X, Y, Z;

Создайте новую систему координат:

    Z = Eye - Center;
    Z.Normalize();
    Y = Up;
    X = Y.Cross( Z );

Пересчитать Y = Z cross X:

    Y = Z.Cross( X );

Длина поперечного произведения равна площади параллелограмма, которая равна < 1,0 для неперпендикулярных векторов длины единицы; поэтому нормализуем X, Y здесь:

    X.Normalize();
    Y.Normalize();

Поместите все в полученную матрицу 4x4:

    Matrix[0][0] = X.x;
    Matrix[1][0] = X.y;
    Matrix[2][0] = X.z;
    Matrix[3][0] = -X.Dot( Eye );
    Matrix[0][1] = Y.x;
    Matrix[1][1] = Y.y;
    Matrix[2][1] = Y.z;
    Matrix[3][1] = -Y.Dot( Eye );
    Matrix[0][2] = Z.x;
    Matrix[1][2] = Z.y;
    Matrix[2][2] = Z.z;
    Matrix[3][2] = -Z.Dot( Eye );
    Matrix[0][3] = 0;
    Matrix[1][3] = 0;
    Matrix[2][3] = 0;
    Matrix[3][3] = 1.0f;

    return Matrix;
}

Ответ 3

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt   
(   
    detail::tvec3< T > const &  //eye position in worldspace
    detail::tvec3< T > const &  //the point where we look at
    detail::tvec3< T > const &  //the vector of upwords(your head is up)
)

Это не сложно, может быть, вам нужно просмотреть три координаты: Координаты объектов (или модели), Координаты мира и Координаты камеры (или вида).