2012-10-08 50 views
0

如何渲染.obj文件(3d)?如何爲此添加顏色?我在OS X上,並使用XCode 4.這是我的小測試實驗室。如何使用OpenGL和GLUT渲染3d .obj文件? (Mac OS X,XCode 4)

#include <GLUT/glut.h> 
#include <iostream> 

void render(void); 

void keyboard(unsigned char c, int x, int y); 

void mouse(int button, int state, int x, int y); 

int main(int argc, char ** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("Simple GLUT Application"); 

    glutDisplayFunc(render); 
    glutKeyboardFunc(keyboard); 
    glutMouseFunc(mouse); 

    glutMainLoop(); 
} 

void keyboard(unsigned char c, int x, int y) { 
    if (c == 27){ 
     exit(0); 
    } 
} 

void mouse(int button, int state, int x, int y) { 
    if (button == GLUT_RIGHT_BUTTON){ 
     exit(0); 
    } 
} 

void render(void) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //RENDER STUFF HERE 
    glBegin(GL_POLYGON); 
    glVertex3f( 0.0, -0.8, 0.5); 
    glVertex3f( 0.0, 0.2, 0.5); 
    glVertex3f( 0.5, 0.8, -0.5); 
    glVertex3f( 0.5, -0.2, -0.5); 
    glEnd(); 

    glutSwapBuffers(); 
} 

回答

4

OpenGL是一個低級別的3D API。它沒有像加載模型文件那樣的高級功能。因此,爲了呈現.obj文件,您將編寫代碼來自己加載數據,然後編寫繪製已加載的多邊形的OpenGL代碼。

有幾種方法可以爲您繪製的OpenGL圖元添加顏色和紋理。您當前的代碼在「即時模式」下使用OpenGL,添加顏色的即時模式方法是在生成頂點之前使用glColor*()函數設置顏色。

glBegin(GL_TRIANGLES); 
glColor3f( 1.0, 0.0, 0.0); 
glVertex3f( 0.0, -0.8, 0.5); 
glColor3f( 0.0, 1.0, 0.0); 
glVertex3f( 0.0, 0.2, 0.5); 
glColor3f( 0.0, 0.0, 1.0); 
glVertex3f( 0.5, 0.8, -0.5); 
glEnd(); 

在過去的幾年裏,已經到了OpenGL的API一些顯著的變化。您在網上找到的OpenGL教程經常包含使用OpenGL的舊方法。我強烈建議您閱讀本書的最新版本OpenGL SuperBible:綜合教程和參考。它詳細介紹了OpenGL的現代使用(即非即時模式),其中包括有關使用OS X的本機窗口API Cocoa的OpenGL章節。

儘管OpenGL Superbible的第5版(寫作本文時是最新版本)在OS X支持新的OpenGL東西之前寫了一些,但新功能已被添加。您需要閱讀Apple的文檔,以便在Cocoa中啓用「OpenGL核心配置文件」或者在OS X的GLUT實現中使用它們。

+0

對,我可以做顏色,但自定義紋理怎麼樣,意思是加載.png文件到多邊形的面上?或者是在SuperBible中? –

+0

要創建OpenGL紋理,您必須自己將圖像加載到OpenGL支持的特定格式的緩衝區中,然後要求OpenGL創建紋理對象,將OpenGL指向放置圖像數據的緩衝區。然後使用立即模式下的紋理在OpenGL中打開紋理,然後在每個頂點上設置紋理座標(或啓用自動紋理座標生成)...是的,OpenGL SuperBible覆蓋了紋理,但不在立即模式下使用它們(因爲即時模式是過時,如果可以避免則不應使用)。 – bames53