Что такое вектор UP в функции LookAt OpenGL?

Это связано с целевым местоположением LookAt, не имеет значения, если это z = 0 или z = 1000 или -1000?

Я старался

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.0f);

и все работает нормально, и теперь я меняю 3-й ряд (вектор UP), последний номер на 0.8:

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.8f);

и это точно так же... затем я попробовал и изменил 3-ю строку, первый номер 0.8:

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);

Теперь вид как будто повернут на 45 градусов влево. Как работает этот вектор UP?

4 ответа

Решение

Восходящий вектор используется для создания перекрестного произведения между глазом и вектором центра, предоставленным в gluLookAt.

Из заголовков GLKit на iOS вы можете увидеть реализацию как:

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
{
    GLKVector3 ev = { eyeX, eyeY, eyeZ };
    GLKVector3 cv = { centerX, centerY, centerZ };
    GLKVector3 uv = { upX, upY, upZ };
    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
    GLKVector3 v = GLKVector3CrossProduct(n, u);

    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
        u.v[1], v.v[1], n.v[1], 0.0f,
        u.v[2], v.v[2], n.v[2], 0.0f,
        GLKVector3DotProduct(GLKVector3Negate(u), ev),
        GLKVector3DotProduct(GLKVector3Negate(v), ev),
        GLKVector3DotProduct(GLKVector3Negate(n), ev),
        1.0f };

    return m;
}

Принятый ответ на этот вопрос Как правильно использовать gluLookAt? дает хорошее описание того, что на самом деле влияет вектор вверх.

(Интуиция за вектором "вверх" в gluLookAt проста: посмотрите на что угодно. Теперь наклоните голову на 90 градусов. Там, где вы находитесь, не изменилось, направление, на которое вы смотрите, не изменилось, но изображение на вашем Сетчатка явно имеет. Какая разница? Куда указывает верхняя часть вашей головы. Это восходящий вектор.)

Вектор вверх определяет направление вверх. Думайте об этом как о видеокамере... если вы держите камеру "правильно", то воображаемая линия, идущая вверх от центра камеры к верхней части камеры, может быть представлена ​​вектором (0,1,0), Если наклонить камеру на 45 градусов вправо, воображаемая линия, идущая от центра камеры к "вершине" камеры, теперь будет представлена ​​новым вектором (1,1,0). Если вы затем немного наклоните камеру назад, ваш вектор "вверх" теперь станет (1,1,1) [или (1,1,-1)... Я всегда получаю полярность оси z обратная].

Итак, вкратце, вектор UP описывает поворот камеры, говоря, какая точка находится "вверх" в ориентации камеры.

Надеюсь, это поможет.:)

(отредактируйте, чтобы исправить резюме согласно комментарию)

Первые два параметра gluLookAt - это положение камеры и цель камеры. Только с этими двумя камера не полностью ограничена. Представьте, что вы стоите где-то с камерой. Вы можете держать камеру горизонтально, чтобы сделать пейзаж, или вы можете держать камеру вертикально, чтобы сделать портретное изображение. В обоих случаях положение камеры и положение объекта на снимке совпадают. Вы можете повернуть камеру на любой угол, и эти два значения не изменятся. Третий параметр, вектор увеличения, выбирает ориентацию камеры.

Это работает точно так, как это выглядит, как это работает.

Представь, что ты в какой-то точке пространства. И они воображают, что вы смотрите на некоторые 2000 единиц прямо в направлении -Z от вас.

Существует бесконечное количество возможных камер с этими характеристиками, но они отличаются только тем, что имеют разное направление "вверх". Таким образом, разные направления "вверх" соответствуют разной ориентации вокруг направления обзора.

Вектор вверх - это векторное направление, которое выровнено с направлением "вверх", которое должно иметь камера. То есть, если бы вы нарисовали вектор вверх из точки камеры, вы бы увидели прямую вертикальную линию, направленную вверх.

Теперь вернитесь к вашему воображаемому виду и посмотрите на эту вертикальную линию. Не могли бы вы сказать, движется ли эта вертикальная линия к вам или от вас? Нет; это просто вертикальная линия. Поэтому не имеет значения, если вектор вверх частично указывает в направлении обзора. Важно то, что направление вверх не точно указывает направление обзора.

Когда вы задаете направление вверх ненулевой координатой Z, оно теперь частично указывает в направлении просмотра (то есть на ось Z). Эта часть в конечном итоге не имеет отношения к направлению вверх, которое вы получаете, поэтому она игнорируется. Когда вы задаете направление вверх ненулевой координатой X, это не в направлении просмотра, поэтому оно имеет значение.

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

Другие вопросы по тегам