2012-01-10 3 views
0

OpenGL에서 카메라의 회전 기능을 직접 작성하려고하지만 실행할 수 없습니다. 내 카메라는 약간의 변화, flipcode에서 주로 :OpenGL에서 glRotate를 사용하지 않는 카메라 회전 glLookAt

카메라 코드 :

Camera::Camera(float x, float y, float z) { 
    memset(Transform, 0, 16*sizeof(float)); 
    Transform[0] = 1.0f; 
    Transform[5] = 1.0f; 
    Transform[10] = 1.0f; 
    Transform[15] = 1.0f; 
    Transform[12] = x; Transform[13] = y; Transform[14] = z; 

    Left=&Transform[0]; 
    Up=&Transform[4]; 
    Forward=&Transform[8]; 
    Position=&Transform[12]; 

    old_x = 0; 
    old_y = 0; 
} 

뷰마다 렌더링 프레임 전에 설정 : 내 문제에 대한 지금

void Camera::setView() { 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    float viewmatrix[16]={//Remove the three - for non-inverted z-axis 
          Transform[0], Transform[4], -Transform[8], 0, 
          Transform[1], Transform[5], -Transform[9], 0, 
          Transform[2], Transform[6], -Transform[10], 0, 

          -(Transform[0]*Transform[12] + 
          Transform[1]*Transform[13] + 
          Transform[2]*Transform[14]), 

          -(Transform[4]*Transform[12] + 
          Transform[5]*Transform[13] + 
          Transform[6]*Transform[14]), 

          //add a - like above for non-inverted z-axis 
          (Transform[8]*Transform[12] + 
          Transform[9]*Transform[13] + 
          Transform[10]*Transform[14]), 1}; 
    glLoadMatrixf(viewmatrix); 
} 

, 회전. 예를 들어 Y 축을 중심으로 회전을 고려하십시오. 이 회전 행렬 스택이다 :

// deg is the angle it is not working in degree or radiant 
void Camera::rotateLocal_y(float deg){ 
    glMatrixMode(GL_MODELVIEW); 

    glPushMatrix(); 
    glLoadMatrixf(Transform); 

    rotateMatrixf_y(Transform, deg); 



    glGetFloatv(GL_MODELVIEW_MATRIX, Transform); 
    glPopMatrix(); 
} 

내가 회전 기능을 보여려고하고 그래서 다음 :

//rotate a matrix around y axis 
void rotateMatrixf_y(float *aMatrix, float angle){ 
    //         x     y    z      t 
    float rotMatrix[] = {cos(angle),0,-1*sin(angle),0, 0, 1, 0, 0, sin(angle), 0, cos(angle), 0, 0, 0, 0, 1}; 

    multMatrixMatrix(rotMatrix,aMatrix); 

} 

그리고 마지막으로 행렬 곱셈 기능 :

void multMatrixMatrix(float* m_a, float* m_b){ 
    float m_c[16] = {m_a[0]*m_b[0]+m_a[4]*m_b[1]+m_a[8]*m_b[2]+m_a[12]*m_b[3], 
        m_a[0]*m_b[4]+m_a[4]*m_b[5]+m_a[8]*m_b[6]+m_a[12]*m_b[7], 
        m_a[0]*m_b[8]+m_a[4]*m_b[9]+m_a[8]*m_b[10]+m_a[12]*m_b[11], 
        m_a[0]*m_b[12]+m_a[4]*m_b[13]+m_a[8]*m_b[14]+m_a[12]*m_b[15], 

        m_a[1]*m_b[0]+m_a[5]*m_b[1]+m_a[9]*m_b[2]+m_a[13]*m_b[3], 
        m_a[1]*m_b[4]+m_a[5]*m_b[5]+m_a[9]*m_b[6]+m_a[13]*m_b[7], 
        m_a[1]*m_b[8]+m_a[5]*m_b[9]+m_a[9]*m_b[10]+m_a[13]*m_b[11], 
        m_a[1]*m_b[12]+m_a[5]*m_b[13]+m_a[9]*m_b[14]+m_a[13]*m_b[15], 

        m_a[2]*m_b[0]+m_a[6]*m_b[1]+m_a[10]*m_b[2]+m_a[14]*m_b[3], 
        m_a[2]*m_b[4]+m_a[6]*m_b[5]+m_a[10]*m_b[6]+m_a[14]*m_b[7], 
        m_a[2]*m_b[8]+m_a[6]*m_b[9]+m_a[10]*m_b[10]+m_a[14]*m_b[11], 
        m_a[2]*m_b[12]+m_a[6]*m_b[13]+m_a[10]*m_b[14]+m_a[14]*m_b[15], 

        m_a[3]*m_b[0]+m_a[7]*m_b[1]+m_a[11]*m_b[2]+m_a[15]*m_b[3], 
        m_a[3]*m_b[4]+m_a[7]*m_b[5]+m_a[11]*m_b[6]+m_a[15]*m_b[7], 
        m_a[3]*m_b[8]+m_a[7]*m_b[9]+m_a[11]*m_b[10]+m_a[15]*m_b[11], 
        m_a[3]*m_b[12]+m_a[7]*m_b[13]+m_a[11]*m_b[14]+m_a[15]*m_b[15] 
    }; 

    m_b = m_c; 

} 

나는이 반드시 생각을 그래도 근본적으로 잘못된 것이있는 것처럼 보인다. 그것은 전혀 움직이지 않는다. 카메라가 올바르게 설정되었습니다. 방법 순서는 cam.rotate이고 다음은 cam.setView입니다.

Flipcodes originial 회전 기능 :

void Camera::rotateLoc(float deg, float x, float y, float z) { 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadMatrixf(Transform); 

    glRotatef(deg, x,y,z); 

    glGetFloatv(GL_MODELVIEW_MATRIX, Transform); 
    glPopMatrix(); 
} 
+0

왜이 작업을 수행 하시겠습니까? – Ali

+0

C++을 사용하고 있으므로 벡터 및 행렬 계산에 GLM을 사용하는 것이 좋습니다. –

+0

@ Ali :이 방법으로 시도하고 싶습니다. x와 y에 대해 glRotatef 만 사용했을 때 z 축 주위로의 회전도 발생했습니다. @Martinho : No – Knut

답변

2

코드는 꽤 지저분하고 불완전하다.

나는 당신의 문제에 대해 생각 :

glPushMatrix(); 
glLoadMatrixf(Transform);     // give the Transform matrix to GL (why?) 

rotateMatrixf_y(Transform, deg);    // modify the Transform matrix 

glGetFloatv(GL_MODELVIEW_MATRIX, Transform); // (3) retrieve the original Tranform matrix 
glPopMatrix(); 

(3) 당신이 'rotateMatrixf_y'를 호출하여 '변환'에 해왔 던대로 변경 취소합니다.

추가 한 플립 코드 코드는 glRotatef '를 호출하고 OpenGL을 사용하여 Tranform 행렬을 업데이트하고 결과를 다시 읽는 것입니다. 메서드 코드에서 OpenGL에 대한 모든 참조를 제거하고 모든 작업을 자체적으로 수행하는 rotateMatrixf_y를 계속 호출해야합니다.

GL 매트릭스 스택의 용도가 무엇인지 정말로 알고 있습니까? GL 기능 만 사용하거나 자신 만의 기능을 사용하여 기본으로 되돌아 가야하지만 사용법을 혼합하기 전에 어떤 방식으로 작동하는지 이유를 알 수 있습니다.

+0

그리고 (3)이 모든 것을 취소하지 않은 경우에도 결국에는 'glPopMatrix'가됩니다. –

+0

@R. Martinho는'rotateLocal_y'의 의미에 따라,이 메소드가 무엇을해야 하는지를 정말로 이해하지 못합니다. 단지'Transform' 행렬을 업데이트해야한다는 인상을 받았지만, 틀릴 수도 있습니다. – rotoglup

+0

@ R and M : II는 GlGet 방법을 없앴습니다. 그러나 변화가 없습니다. 뒤집기/팝 : glPushMatrix 전에, 단위 행렬이 스택에 있습니다. 그런 다음 푸시를 수행하고 변형 행렬을 저장합니다. 항등 매트릭스가있는 객체를 그리는 팝이 계속됩니다. 보기를 설정할 때 변환 행렬을 직접 가져옵니다. 나는 질문을 편집했다. 플립 코드 (flipcode)의 원래 함수가 있는데,이 함수는 같은 함수 호출을 갖고 있지만 회전 함수이다. – Knut