2020年5月5日 星期二

第十(十一?)週使用OBJ的卡小

先到 點我辣!這個網站
然後下載datawin32glut32.dllsource
將windows解壓縮,glut32.dll跟data的資料放進去
點開data並開啟OBJ檔
可以看到模型是怎麼做的

v=頂點 vn=打光法向量
f=面 g=group 
一個group用一個顏色


解壓縮source,注意glm.c跟glm.h還有transformation.c
打開code:block開啟GLUT的project
glm.c跟glm.h丟進專案裡
然後glm.c變成cpp檔




自己做模型!

先把main裡面的函式都刪掉
然後複製貼上基本需要的程式碼
接著就開始自己動手打做出模型的程式碼了!

他會變醬,只有黑白色,醜醜ㄉ
程式碼附給你
----------------------------------------
#include <GL/glut.h>
#include "glm.h"///用glm外掛,glm.h放在跟專案同一個目錄裡
GLMmodel * model = NULL;///glm的資料結構,先NULL空
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(model==NULL){///如果沒有模型
        model = glmReadOBJ("data/Al.obj");///讀入模型
        glmUnitize(model);///Unit單位大小 -1...+1
        glmFacetNormals(model);///計算面的法向量
        glmVertexNormals(model,90);///推算頂點法向量
    }
    glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);///畫模型
    glutSwapBuffers();
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("weeeeeeeeeeeeeeeek11_DIY!");

    glutDisplayFunc(display);
    glutMainLoop();
}
----------------------------------------

加上打光的程式碼!

要讓模型看起來式立體ㄉ!
可以先到我第五週的文章複製打光的程式碼
全部貼上之後跑程式

他背對著我們
可能討厭我們ㄅ嗚嗚
但我還是想看看他的容貌
所以我們就用Rotate讓他轉向我們ㄅ
強制轉向啦嘿(*´▽`*)
嘿喲!我們看到他的正臉ㄌ!
這邊附上程式碼給你
----------------------------------------
#include <GL/glut.h>
#include "glm.h"///用glm外掛,glm.h放在跟專案同一個目錄裡
GLMmodel * model = NULL;///glm的資料結構,先NULL空

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 3.0f, -5.0f, 0.0f };///光源位置

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };


void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(model==NULL){///如果沒有模型
        model = glmReadOBJ("data/Al.obj");///讀入模型
        glmUnitize(model);///Unit單位大小 -1...+1
        glmFacetNormals(model);///計算面的法向量
        glmVertexNormals(model,90);///推算頂點法向量
    }
    glPushMatrix();
        glRotatef(180,0,1,0);///針對Y軸轉向
        glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);///加上貼圖就可以看到貼圖ㄌ
    glPopMatrix();
    glutSwapBuffers();
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("weeeeeeeeeeeeeeeek11_DIY!");

    glutDisplayFunc(display);

    ///打光需要3Dㄉdepth test
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    ///打光1:要開啟光線,原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    ///打光2:要設定光的設定值(前面有陣列,這裡拿來用)
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    ///打光2.2:要把物體也設定好它的matreial
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

}

下面4作業ㄉ程式碼





#include <GL/glut.h>
#include <stdio.h>
#include "glm.h" ///使用glm外掛 glm.h在專案同一目錄裡
GLMmodel *model=NULL; ///這是glm的資料結構 NULL為空
GLMmodel *model2=NULL;
GLMmodel *model3=NULL;
GLMmodel *model4=NULL;
GLMmodel *model5=NULL;
GLMmodel *model6=NULL;
GLMmodel *arm=NULL;

///打光第0步:宣告陣列,裡面有光的屬性值
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 0.0f, 1.0f, -5.0f, 0.0f };///光源位置

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

float angle=0,angle_y=0,angle1=0,angle2=0,angle4=0.25,angle5=0.25,angle6=0.25,angle7=0.25;
float d=0.5,dy=0,d1=0,d2=0,d4=0,d5=0,d6=0,d7=0;
float y=0,z=1;
int t=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///以前畫茶壺,今天畫3D模型
    if(model==NULL){///如果沒有模型
        model = glmReadOBJ("hand.obj"); ///讀入模型
        glmUnitize(model); ///Unit單位大小 -1...+1
        glmFacetNormals(model); ///算面facet法向量
        glmVertexNormals(model, 90); ///在推算出vertex法向量
    } ///離開if就有模型
    if(model2==NULL){///如果沒有模型
        model2 = glmReadOBJ("hand2.obj"); ///讀入模型
        glmUnitize(model2); ///Unit單位大小 -1...+1
        glmFacetNormals(model2); ///算面facet法向量
        glmVertexNormals(model2, 90); ///在推算出vertex法向量
    }///離開if就有模型
    if(model3==NULL){///如果沒有模型
        model3 = glmReadOBJ("hand3.obj"); ///讀入模型
        glmUnitize(model3); ///Unit單位大小 -1...+1
        glmFacetNormals(model3); ///算面facet法向量
        glmVertexNormals(model3, 90); ///在推算出vertex法向量
    }///離開if就有模型
    if(model4==NULL){///如果沒有模型
        model4 = glmReadOBJ("hand4.obj"); ///讀入模型
        glmUnitize(model4); ///Unit單位大小 -1...+1
        glmFacetNormals(model4); ///算面facet法向量
        glmVertexNormals(model4, 90); ///在推算出vertex法向量
    }///離開if就有模型
    if(model5==NULL){///如果沒有模型
        model5 = glmReadOBJ("hand5.obj"); ///讀入模型
        glmUnitize(model5); ///Unit單位大小 -1...+1
        glmFacetNormals(model5); ///算面facet法向量
        glmVertexNormals(model5, 90); ///在推算出vertex法向量
    }///離開if就有模型
    if(model6==NULL){///如果沒有模型
        model6 = glmReadOBJ("hand6.obj"); ///讀入模型
        glmUnitize(model6); ///Unit單位大小 -1...+1
        glmFacetNormals(model6); ///算面facet法向量
        glmVertexNormals(model6, 90); ///在推算出vertex法向量
    }///離開if就有模型
    if(arm==NULL){///如果沒有模型
        arm = glmReadOBJ("arm.obj"); ///讀入模型
        glmUnitize(arm); ///Unit單位大小 -1...+1
        glmFacetNormals(arm); ///算面facet法向量
        glmVertexNormals(arm, 90); ///在推算出vertex法向量
    }///離開if就有模型

    glPushMatrix();///arm
        glTranslatef(0,-0.5,0);
        glRotatef(180, 0,1,0);
        glRotatef(angle, 0,0,1);
        glRotatef(angle_y, 0,1,0);
        glTranslatef(0,0.4,0);

        glScalef(0.6,0.6,0.6);
        glmDraw(arm, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();///1
            glTranslatef(-0.025,1,0.2);
            glRotatef(angle1, 1,0,0);
            glScalef(0.3,0.3,0.3);
            glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();///2
            glTranslatef(0.15,1,0);
            glRotatef(angle2, 1,0,0);
            glTranslatef(0,0.3,0);
            glScalef(0.9,0.9,0.9);
            glmDraw(model2, GLM_SMOOTH | GLM_MATERIAL);

                glPushMatrix();///4
                    glTranslatef(-0.03,0.6,-0.25);
                    glRotatef(angle4, 1,0,0);
                    glTranslatef(0,0.2,0.2);
                    glScalef(1.8,1.8,1.8);
                    glmDraw(model4, GLM_SMOOTH | GLM_MATERIAL);

                    glPushMatrix();///5
                        glTranslatef(-0.02,0.1,0);
                        glRotatef(angle5, 1,0,0);
                        glTranslatef(0,0.2,0);
                        glScalef(1.28,1.28,1.28);
                        glmDraw(model5, GLM_SMOOTH | GLM_MATERIAL);
                    glPopMatrix();///5

                glPopMatrix();///4

        glPopMatrix();///2

        glPushMatrix();
            glTranslatef(-1.1,0.5,0.3);
            glRotatef(angle6, 0.5,1,0);
            glScalef(1,1,1);
            glmDraw(model6, GLM_SMOOTH | GLM_MATERIAL);

            glPushMatrix();
                glTranslatef(-0.24,0.2,0);
                glRotatef(angle7, 0,1,0);
                glTranslatef(0,0.2,0);
                glScalef(0.94,0.94,0.94);
                glmDraw(model6, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();///6-2

        glPopMatrix();///6

        glPopMatrix();///1

    glPopMatrix();///arm

    angle+=d;
    angle_y+=dy;
    angle1+=d1;
    angle2+=d2;
    angle4+=d4;
    angle5+=d5;
    angle6+=d6;
    angle7+=d7;
    if(angle==30) d=-0.5;
    if(angle==-30) d=+0.5;
    if(angle==0) t++;
    if(t==3) {
        d=0;
        d1=0.25;
    }
    if(angle1==40) {
        d1=0;
        d2=0.25;
    if(angle2==40) {
        d2=0;
        d4=0.25;
        d6=0.25;
        if(angle4==70) {
        d4=0;
        d6=0;
        d5=0.25;
        d7=0.25;
        if(angle5==70) {
        d5=0;
        d7=0;
        }
        }
    }
    }

    if(angle5==70){
        y=1,z=0;
        dy=0.5;
    }
    if(angle_y==180) dy=0;
    glutSwapBuffers();


}
static void idle(void)
{

    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(400,400);
    glutCreateWindow("自己做模型!");

    glutDisplayFunc(display);
    glutIdleFunc(idle);

     ///打光需要3Dㄉdepth test
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    ///打光1:要開啟光線,原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    ///打光2:要設定光的設定值(前面有陣列,這裡拿來用)
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    ///打光2.2:要把物體也設定好它的matreial
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

}



沒有留言:

張貼留言