Вопрос по opengl – Что такое вектор UP в функции LookAt OpenGL?

17

это связано сМестоположение цели 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   ответа
21

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

Итак, короче говоря, вектор UP описывает поворот камеры, говоря, какая точка является «вверх»; в ориентации камеры.

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

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

Это может быть Старый, но спасибо за это, это пока первое объяснение, которое имеет смысл для меня!
"So, in short, the UP vector describes the pitch, yaw, and roll of the camera by saying which point is "up" in the camera's orientation." Неправильно. Вверх - это только крен (рыскание и угол наклона ограничены точкой, на которую смотрит камера).
3

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

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

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

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

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

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

то, что я говорю, если вы почти лежите, то результат точно такой же, как если бы вы сидели на стуле прямо перед собой Jeremy L
@JeremyL: потому что, если вы ложитесь лицом в небо, вы больше не будете смотреть на свой iPad. Видишь проблему? Функция должна выяснить, какие являются наиболее важными ограничениями. Положение камеры и положение просмотра превосходит направление вверх с точки зрения принятия решенияwhere Вы ищете. Направление вверх используется строго для ориентацииafter решить, где вы ищете. Изменение направления вверх никогда не изменится, где вы ищете, толькоhow Вы смотрите в этом направлении.
Если я сижу на стуле и смотрю прямо перед собой, держу iPad прямо перед моими глазами, то моя голова направлена вверх по небу, поэтому(0, 1, 0)... как насчет того, чтобы изменить его на(0, 0.00001, 1), так что это означает, что я почти лежу, теперь мое лицо и глаза смотрят в небо ... так почему же результат будет таким же, если я использую(0, 1, 0)? Jeremy L
5

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

30

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

(The intuition behind the "up" vector in gluLookAt is simple: Look at anything. Now tilt your head 90 degrees. Where you are hasn't changed, the direction you're looking at hasn't changed, but the image in your retina clearly has. What's the difference? Where the top of your head is pointing to. That's the up vector.)

Похожие вопросы