2023年4月19日 星期三

rita - week10 - 3D模型

         去到https://jsyeh.org/3dcg10/

        下載  1.[data]  2.[win32] 兩個檔案 並且解壓縮win32

        將data丟進解壓縮後的windows 開啟Transformation.exe


    去到data資料夾內點選角色  右鍵點選notepad++可以得知裏頭的座標以及面


    再去到https://jsyeh.org/3dcg10/     下載[source



    第一個程式

           1.file => new => project 開啟GLUT project
            2.點選點點點選擇桌面  將檔名改成week10_glm
            3.下載葉老師上課用軟體freeglut壓縮檔
            將裡面的freeglut檔案複製到桌面
            再將裡頭lib的libfreeglut.a複製並貼上
            將複製的改檔名為libglut32.a
    
             4.再回到上一步選擇位置  選擇桌面/freeglut資料夾

         #include <GL/glut.h>
         #include "glm.h"///下載source有glm.h放在week10目錄內
         void  display()
         {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glutSolidTeapot( 0.3 );
            glutSwapBuffers();
         }
         int main(int argc, char *argv[])
            { 
                glutInit(&argc, argv);
                glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                glutCreateWindow("week10");
        
                glutDisplayFunc(display);
                glutMainLoop();
    }
    加入glm.cpp檔案


    去到data資料夾 把檔案全部複製到freeglut/bin裡頭


    將glm.c  glh.h 加入week10_glm資料夾裡頭
    將glm.c改為cpp檔



    開始寫程式碼 讓我們的模型可以秀出
     #include <GL/glut.h>
     #include "glm.h"///下載source有glm.h放在week10目錄內
     ///glm.c改名為cpp檔放回week10目錄裡
     GLMmodel * pmodel = NULL;///有一個模型的指標 原先是空的
     void  display()
     {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        if(pmodel==NULL)
        {
            pmodel = glmReadOBJ("al.obj");
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel,90);
        }
        glmDraw(pmodel,GLM_MATERIAL);
        ///glutSolidTeapot( 0.3 );註解掉不用茶壺了
        glutSwapBuffers();
     }
     int main(int argc, char *argv[])
        {
            glutInit(&argc, argv);
            glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
            glutCreateWindow("week10");

            glutDisplayFunc(display);
            glutMainLoop();
        }


    開啟一個新專案

    第二個程式

     1.file => new => project 開啟GLUT project
     2.點選點點點選擇桌面  將檔名改成week10_glm_gundam
    
    將glm.c  glh.h 加入week10_glm_gundam裡頭
    將glm.c改為cpp檔



    加入glm.cpp檔案


    
   把上次week07教的關於貼圖的拿來用
    去到桌面/葉老師的上課用軟體/下載OpenCV 2.1  要選擇path
    設定setting-compiler
    把myTexture程式拿來用(去到gist,guthub.com/jshey)
    在glutCreateWindow()後加mytexture("Diffuse.jpg")
    
    將鋼彈的三個資料丟進freeglut/bin裡頭
    



    開始setting
C:\\OpenCV2.1\include
C:\\OpenCV2.1\lib


cv210,cxcore210,highgui210
      絕對不可以設錯不然就會壞掉!!!   
設定完後要再重開!!!!

去到https://gist.github.com/jsyeh  複製mytexture


        #include <GL/glut.h>
        #include "glm.h"///下載source有glm.h放在week10_glm_gundam目錄內
        ///glm.c改名為cpp檔放回week10_glm_gundam目錄裡
        GLMmodel * pmodel = NULL;///有一個模型的指標 原先是空的
        #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
        #include <opencv/cv.h>
            #include <GL/glut.h>
        int myTexture(char * filename)
        {
            IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
            cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
            glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
            GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
            glGenTextures(1, &id); /// 產生Generate 貼圖ID
            glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數,         超過包裝的範圖T, 就重覆貼圖
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數,         超過包裝的範圖S, 就重覆貼圖
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB,         GL_UNSIGNED_BYTE, img->imageData);
            return id;
        }
         void  display()
         {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            if(pmodel==NULL)
            {
                pmodel = glmReadOBJ("gundam.obj");
                glmUnitize(pmodel);
                glmFacetNormals(pmodel);
                glmVertexNormals(pmodel,90);
            }        
            glmDraw(pmodel,GLM_MATERIAL | GLM_TEXTURE);
            ///glutSolidTeapot( 0.3 );
            glutSwapBuffers();
         }
         int main(int argc, char *argv[])
            {
                glutInit(&argc, argv);
                glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                glutCreateWindow("week10");

                myTexture("Diffuse.jpg");
                glutDisplayFunc(display);
                glutMainLoop();
            }








沒有留言:

張貼留言