2011-01-20 3 views
0

나는 회전하는 3D 입방체 (glFrustumf 설정)에서 작업하고 큐브가 계속 회전 할 수 있도록 이전 행렬에 현재 행렬을 곱합니다.Iphone OpengGL : MODELVIEW_MATRIX 편집

/* save current rotation state */ 
GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix); 

/* re-center cube, apply new rotation */ 
glLoadIdentity(); 

glRotatef(self.angle, self.dy,self.dx,0); 

glMultMatrixf(matrix); 

문제는 (내가 카메라를 가진 것처럼) 나는이에서 돌아 단계로 필요하다 아래를 참조하십시오. 행렬을 편집하려고 시도했지만 그런 종류의 작업은 잡음을 발생시킵니다. 큐브가 주위를 뛰어 넘는다.

matrix[14] = -5.0; 
    matrix[13] = 0; 
    matrix[12] =0; 

현재 행렬을 편집하여 다른 행렬을 곱하여 큐브의 위치를 ​​설정할 수있는 방법이 있습니까?

+0

가능한 [아이폰 OpenGL : glOrthof 대 glFrustumf. 3D가 아니야?] (http://stackoverflow.com/questions/4749786/iphone-opengl-glorthof-vs-glfrustumf-is-glorthof-not-3d) – genpfault

답변

1

OpenGL을 장면 그래프 또는 수학 라이브러리로 잘못 해석해서는 안됩니다. 즉, 행렬을 다시 읽지 않고 임의로 역행 시키십시오. 대신 렌더링 패스를 수행 할 때마다 전체 매트릭스 스택을 새로 작성하십시오. 나는 OpenGL-4에서 모든 행렬 함수가 이 제거되었음을 지적해야한다고 생각한다.. 대신 매트릭스를 유니폼으로 제공해야합니다. @ Burf2000에 의해

언급으로 인해 편집 :

draw_object(): 
    # bind VBO or plain VertexArrays (you might even use immediate mode, but that's deprecated) 
    # draw the stuff using glDrawArrays or better yet glDrawElements 

render_subobject(object, parent_transform): 
    modelview = parent_tranform * object.transform 
    if OPENGL3_CORE: 
     glUniformMatrix4fv(object.shader.uniform_location[modelview], 1, 0, modelview) 
    else: 
     glLoadMatrixf(modelview) 
    draw_object(object) 
    for subobject in object.subobjects: 
     render_subobject(subobject, modelview) 

render(deltaT, window, scene): 
    if use_physics: 
     PhysicsSimulateTimeStep(deltaT, scene.objects) 
    else: 
     for o in scene.objects: 
      o.animate(deltaT) 

    glClearColor(...) 
    glClearDepth(...) 
    glViewport(0, 0, window.width, window.height) 
    glDisable(GL_SCISSOR_TEST); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT) 

    # ... 

    # now _some_ objects' render pass - others may precede or follow, like for creating reflection cubemaps or water refractions. 

    glViewport(0, 0, window.width, window.height) 
    glEnable(GL_DEPTH_TEST) 
    glDepthMask(1) 
    glColorMask(1,1,1,1) 

    if not OPENGL3_CORE: 
     glMatrixMode(GL_PROJECTION) 
     glLoadMatrixf(scene.projection.matrix) 

    for object in scene.objects: 
     bind_shader(object.shader) 
     if OPENGL3_CORE: 
      glUniformMatrix4fv(scene.projection_uniform, 1, 0, scene.projection.matrix) 

    # other render passes 

    glViewport(window.HUD.x, window.HUD.y, window.HUD.width, window.HUD.height) 
    glStencil(window.HUD.x, window.HUD.y, window.HUD.width, window.HUD.height) 
    glEnable(GL_STENCIL_TEST) 
    glDisable(GL_DEPTH_TEST) 

    if not OPENGL3_CORE: 
     glMatrixMode(GL_PROJECTION) 
     glLoadMatrixf(scene.HUD.projection.matrix) 
    render_HUD(...) 

등 : 전형적인 렌더링 핸들러는이 (의사)과 같이 보일 것입니다. 나는 당신이 일반적인 아이디어를 얻길 바랍니다. OpenGL은 장면 그래프가 아니며 행렬 조작 라이브러리도 아닙니다.

+0

iPhone이 OpenGL 4를 지원하지 않는다고 생각합니다. – genpfault

+0

그렇다면 객체에서 되돌아 오는 방법 – Burf2000

+0

@genpfault - OpenGL ES 2.0의 쉐이더 독점 사용은 결국 동일한 것을 요구합니다. 행렬은 쉐이더에 유니폼으로 전달됩니다. –

관련 문제