這周我們不會再將貼圖只用於茶壺上,我們要實際導入模型。
先開啟一個新的GLUT專案,先執行一下確認產生出圖形後...
到https://jsyeh.org/3dcg10/ 下載[source] 資料包
裡面的glm.h跟glm.c放到專案資料夾裡面
因為程式語言的關係,要將glm.c改名為glm.cpp
確認glm.cpp加入後點OK
路徑及檔案設定完成,接下來是程式碼
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.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 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_TEXTURE);
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week11_1");
glutDisplayFunc(display);
myTexture("Diffuse.jpg");
glutMainLoop();
}
Diffuse.jpg的存放地點和路徑要注意!
現在畫面上應該可以生出一隻鋼彈模型了,而且貼圖包裝也很完美。
如果可以轉動的話會更好?
跟地球一樣,加入angle參數就可以了
別忘了如果轉速太慢或是太快在angle+=0.1;都可以做調整
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
float angle=0;
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 display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(pmodel==NULL){
pmodel=glmReadOBJ("Gundam.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel,90);
}
glPushMatrix();
glRotatef(angle,0,1,0);
glmDraw(pmodel,GLM_TEXTURE);
glPopMatrix();
angle+=0.1;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week11_1");
glutDisplayFunc( display );
glutIdleFunc(display);
myTexture("Diffuse.jpg");
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}







沒有留言:
張貼留言