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

Что такое вектор UP в OpenGL LookAt?

это связано с Место назначения 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);

и это точно то же самое... Далее я попытался и изменил третью строку, первое число до 0.8:

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

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

4b9b3361

Ответ 1

Вектор вверх используется для создания поперечного продукта между вектором и вектором центра, переданным 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 градусов. Где вы не изменились, направление, на которое вы смотрите, не изменилось, но изображение в вашей сетчатке ясно имеет. Какая разница? Где указана верхняя часть вашей головы. Этот вектор вверх.)

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Он работает точно так, как будто он работает.

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

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

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

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

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

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