iOS: вопросы об информации камеры в результате GLKMatrix4MakeLookAt - PullRequest
2 голосов
/ 29 января 2012

Документация по iOS 5 показывает, что GLKMatrix4MakeLookAt работает так же, как gluLookAt.

Здесь приведено определение:

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;
}

Я пытаюсь извлечь информацию о камере изthis:

1. Read the camera position
    GLKVector3 cPos = GLKVector3Make(mx.m30, mx.m31, mx.m32);
2. Read the camera right vector as `u` in the above
    GLKVector3 cRight = GLKVector3Make(mx.m00, mx.m10, mx.m20);
3. Read the camera up vector as `u` in the above
    GLKVector3 cUp = GLKVector3Make(mx.m01, mx.m11, mx.m21);
4. Read the camera look-at vector as `n` in the above
    GLKVector3 cLookAt = GLKVector3Make(mx.m02, mx.m12, mx.m22);

Есть два вопроса:


  1. Кажущийся вектор выглядит отрицательным, как они его определили, так как они скорее выполняют (eye - center)чем (center - eye).Действительно, когда я звоню GLKMatrix4MakeLookAt с положением камеры (0,0,-10) и центром (0,0,1), мой извлеченный взгляд на (0,0,-1), то есть отрицательный результат того, что я ожидаю.Так что я должен отрицать то, что я извлекаю?

  2. Положение камеры, которое я извлекаю, является результатом матрицы преобразования вида, предварительно умножающей матрицу вращения вида, отсюда и продукты точек в их определении.Я считаю, что это неправильно - кто-нибудь может подсказать, как еще мне рассчитать позицию?


Большое спасибо за ваше время.

1 Ответ

2 голосов
/ 29 января 2012

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

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

Итак, если вы определите R = (матрица, определяющая вращательную часть вашей инструкции), T = (переводной аналог), вы получите R.T. Если вы хотите извлечь T, вы можете предварительно умножить на число, обратное к R, а затем извлечь результаты из последнего столбца, поскольку умножение матриц является ассоциативным.

В качестве бонуса, поскольку R ортонормирован, обратное - это просто транспонирование.

...