2024年4月15日 星期一

Yweek09

week09
 
下載上課範例

jsyeh.org/3dcg10

下載 source data win32

用notepad++ 研究 soccerball.obj   soccerball.mtl

範例

開一個專案

先將 source.zip裡的glm.h和glm.c解壓縮,再把glm.c改成 glm.cpp File-New-Project, GLUT專案

將glm.h和glm.cpp 放入專案同一目錄

CodeBlocks的專案按右鍵,Add把glm.cpp 加入

把11行 GLUT程式,放進來

把glm 使用時,需要的3段程式放進來 

開專案目錄後 把工作目錄改成[    .     ]一個點

小數點代表現在專案的目錄

把 gundam.obj libfreeglut.dll (在bin裡面)都放到專案目錄裡面


程式碼

#include <GL/glut.h>

#include "glm.h"

GLMmodel * pmodel = NULL;


void drawmodel(void)
{
    if (!pmodel) {
        pmodel = glmReadOBJ("gundam.obj");
        if (!pmodel) exit(0);
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}



void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面

    drawmodel();

    glutSwapBuffers();///畫好提交
}

int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("第7周的程式");///開GLUT視窗
    glutDisplayFunc(display);
    glutMainLoop();
}



貼圖


安裝OpenCV-2.1, 要選PATH
重開 Codeblocks,設定貼圖的3個設定 Settings-Compiler
Compiler 加入 C:\OpenCV2.1\include
Linker 加入 C:\OpenCV.21\lib
在Linker settings裡,加入 cv210 cxcore210 highgui210


貼圖程式碼

#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); 
    cvCvtColor(img,img, CV_BGR2RGB); 
    glEnable(GL_TEXTURE_2D); 
    GLuint id; 
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    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;
}

成果

程式碼

#include <opencv/highgui.h>
#include <GL/glut.h>
#include <opencv/cv.h>
#include "glm.h"

GLMmodel * pmodel = NULL;


int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); 
    cvCvtColor(img,img, CV_BGR2RGB); 
    glEnable(GL_TEXTURE_2D); 
    GLuint id; 
    glGenTextures(1, &id); 
    glBindTexture(GL_TEXTURE_2D, id);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    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 drawmodel(void)
{
    if (!pmodel) {
        pmodel = glmReadOBJ("gundam.obj");
        if (!pmodel) exit(0);
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE);
}


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

    drawmodel();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("第7周的程式");
    glutDisplayFunc(display);
    myTexture("Diffuse.jpg");
    glutMainLoop();
}





沒有留言:

張貼留言