2011年12月2日 星期五

iPhone 3D, How to ?

XCode 4.2 中的 template OpenGL ES, 只能表現出 2D 的圖;要有 3D 功能需加入:
(OpenGL ES 1.1 Only)

1、在 EAGLView.hprivate 區段中宣告 
      GLuint depthRenderbuffer;

2、在 EAGLView.m 的 createFramebuffer 中加入
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES
                                             framebufferWidth, framebufferHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES
                                                   GL_RENDERBUFFER_OES, depthRenderbuffer);

3、在 EAGLView.m 的 deleteFramebuffer 中加入
        if(depthRenderbuffer) {
            glDeleteRenderbuffersOES(1, &depthRenderbuffer);
            depthRenderbuffer = 0;
        }

4、3D 的 function 呼叫 (放在 viewController 的 - (void)drawFrame; 中)

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClearDepthf(1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        // start drawing 3D objects
        glEnable(GL_DEPTH_TEST);


        // Projection mode
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        // glOrthof(垂直模式) or glFrustumf(透視模式)
        glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 

        // tranform the camara for a better view
        glTranslatef(0.07f, 0.0f, 0.0f);
        glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);


        // Model mode
        glMatrixMode(GL_MODELVIEW);
        
        // enable GL states for texturing
        // this includes cube and 2D instructions and buttons
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnable(GL_TEXTURE_2D);


glTranslatef(1.5f, -0.5f, 3.0f);  --> 移動到某個位置
glScalef(0.3, 0.3, 0.3); --> 縮放比例
glRotatef(20, 1, 0, 0);  --> 旋轉 , 第一個參數為角度;其餘三個為 x, y, z 的量

以上三個都是對整個圖層做變動, 要保持每個圖層的獨立性,在繪製每個圖層時;
需叫用以下功能

glPushMatrix();
glLoadIdentity();
glPopMatrix();






(first Cube)

沒有留言:

張貼留言