2012-01-29 1 views
2

iOS 5 설명서는 GLKMatrix4MakeLookAtgluLookAt과 동일하게 작동 함을 나타냅니다.iOS : GLKMatrix4MakeLookAt 결과 내의 카메라 정보에 대한 질문

정의는 여기에 제공됩니다

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

나는이에서 카메라 정보를 추출하기 위해 노력하고있어 :


  1. :

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

    이 두 가지 질문이 있습니다 Look-At Vector는 무효로 보인다. d가 (center - eye)이 아닌 (eye - center)을 수행하기 때문에 정의한대로. 사실, 카메라 위치가 (0,0,-10)이고 중심이 (0,0,1)GLKMatrix4MakeLookAt으로 전화를하면 추출 된 모양은 입니다. 즉, 내가 예상 한 것보다 부정적인 것입니다. 내가 추출한 것을 부정해야합니까?

  2. 카메라 위치 I 추출은 뷰 회전 행렬을 미리 곱한 뷰 변환 행렬의 결과이므로, 정의에서 점 제품을 나타냅니다. 나는 이것이 틀렸다는 것을 믿는다 - 누군가는 나가 그 위치를 계산해야하는 다른 방법을 제안 할 수 있는가? 시간에 대한


많은 감사합니다.

답변

2

its documentation 당 gluLookAt는 중심 눈을 계산하고, 중간 단계를 위해 그것을 사용하고, 결과 행렬에 배치하기 위해 음수를 사용합니다. 따라서 중심 눈을 뒤로 돌리기를 원한다면 부정적인 결과가 분명히 맞습니다.

반환되는 결과는 결과의 회전 부분이있는 multMatrix와 동일하며 그 뒤에 glTranslate by -eye가옵니다. 전통적인 OpenGL 행렬 연산 곱셈이 곱하기 때문에 gluLookAt는 회전에 변환을 곱하는 것을 의미합니다. 따라서 Apple의 구현은 정확합니다. 처음에는 카메라를 움직이고 똑같은 방향으로 회전시키는 것과 똑같습니다.

그래서 R = (명령의 회전 부분을 정의하는 행렬), T = (변환 아날로그)를 정의하면 R.T. T를 추출하려면 R의 역행렬을 미리 곱하여 결과를 최종 열에서 추출 할 수 있습니다. 행렬 곱셈은 연관성이 있기 때문에 가능합니다.

보너스로 R은 직교 좌표이기 때문에 이항은 단지 전치 일뿐입니다.

+0

나는'm' 정의에서 부정을 발견하지 못했습니다. 나머지는 자세히 설명해 주셔서 감사 드리며 현재 진행 상황을 완전히 이해하고 있습니다. 많은 정말로 감사합니다 :) – KomodoDave

+0

링크가 끊어졌습니다. – aledalgrande