#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
GLuint id1, id2; ///TODO:增加2個 貼圖ID
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);
glBindTexture(GL_TEXTURE_2D, id1);
glutSolidTeapot(0.3);
glBindTexture(GL_TEXTURE_2D, id2);
glBegin(GL_POLYGON);
glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
glEnd();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week08 ");
glutDisplayFunc(display);
id1 = myTexture("Diffuse.jpg");
id2 = myTexture("bg.jpg");
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
opencv要下載settings的complier要改內容
要進入freeglut的bin檔把freeglut.dll放入這次的檔案中
把diffuse bg放入檔案資料夾內
再下載notepad++
將這次的profile檔案用notepad++開啟
把working_dir後面改成"."即可執行

接下來把gundam檔案解壓縮 並把gundam檔案放入資料夾內
下載source檔案並解壓縮把glm.c glm.h transformation.c複製到資料夾
再用notepad++開啟transformation
複製這段void
drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/porsche.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
再進去改程式碼
pmodel = glmReadOBJ("data/porsche.obj");改pmodel = glmReadOBJ("gundam.obj");
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);改glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
display把茶壺改成鋼彈
最後程式碼
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"//使用外掛
GLMmodel*pmodel=NULL;//glm模型指標
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_TEXTURE);
}
GLuint id1, id2; ///TODO:增加2個 貼圖ID
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);
glBindTexture(GL_TEXTURE_2D, id1);
drawmodel();
glBindTexture(GL_TEXTURE_2D, id2);
glBegin(GL_POLYGON);
glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
glEnd();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week08 ");
glutDisplayFunc(display);
id1 = myTexture("Diffuse.jpg");
id2 = myTexture("bg.jpg");
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
把Diffuse的圖片用小畫家轉360度
出來的圖片才會正常

在程式碼display這邊加上angle讓他做轉動即可成功旋轉
修正貼圖因為機器人會被背景削到所以要調整背景修正貼圖 將glvertex2f改成3f
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"//使用外掛
GLMmodel*pmodel=NULL;//glm模型指標
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_TEXTURE);
}
GLuint id1, id2; ///TODO:增加2個 貼圖ID
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;
}
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, id1);
glPushMatrix();
glRotatef(angle,0,1,0);
drawmodel();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, id2);
glBegin(GL_POLYGON);
glTexCoord2f( 0, 0 ); glVertex3f( -1, -1,+0.8 );
glTexCoord2f( 0, 1 ); glVertex3f( -1, +1,+0.8 );
glTexCoord2f( 1, 1 ); glVertex3f( +1, +1,+0.8 );
glTexCoord2f( 1, 0 ); glVertex3f( +1, -1,+0.8 );
glEnd();
glutSwapBuffers();
angle++;
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week08 ");
glutDisplayFunc(display);
glutIdleFunc(display);
id1 = myTexture("Diffuse.jpg");
id2 = myTexture("bg.jpg");
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
即可成功

把gundam檔案裏面的body arm hand放入資料夾
程式碼裡面要加GLMmodel*(body arm hand)=NULL;基礎至少三份指標
用gundam資料夾的main.cpp看會發現說直接把四肢放進去畫會太大但我們目標是-1~+1所以用glmDimensions去查模型原來的長寬高再用求得的值去進行縮放
接下來把arm正確轉動TRT 手臂掛回肩上做轉動 要先把手臂的選轉軸移動到正中間
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"//使用外掛
GLMmodel*pmodel=NULL;//glm模型指標
GLMmodel*body=NULL;
GLMmodel*arm1=NULL;
GLMmodel*arm2=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_TEXTURE);
}
GLuint id1, id2; ///TODO:增加2個 貼圖ID
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;
}
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, id1);
glPushMatrix();
glTranslatef(0,-1,0);
//glRotatef(angle,0,1,0);
//drawmodel();
glmDraw(body,GLM_SMOOTH|GLM_TEXTURE);
glPushMatrix();
glTranslatef(-0.35,+0.68+1,0);
glRotatef(angle,0,0,1);
glTranslatef(+0.35,-0.68-1,0);
glmDraw(arm1,GLM_SMOOTH|GLM_TEXTURE);
glPopMatrix();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, id2);
glBegin(GL_POLYGON);
glTexCoord2f( 0, 0 ); glVertex3f( -1, -1,+0.8 );
glTexCoord2f( 0, 1 ); glVertex3f( -1, +1,+0.8 );
glTexCoord2f( 1, 1 ); glVertex3f( +1, +1,+0.8 );
glTexCoord2f( 1, 0 ); glVertex3f( +1, -1,+0.8 );
glEnd();
glutSwapBuffers();
angle++;
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week08 ");
glutDisplayFunc(display);
glutIdleFunc(display);
id1 = myTexture("Diffuse.jpg");
id2 = myTexture("bg.jpg");
body=glmReadOBJ("body.obj");
arm1=glmReadOBJ("arm1.obj");
arm2=glmReadOBJ("arm2.obj");
pmodel=glmReadOBJ("gundam.obj");
float dimensions[3];
glmDimensions(pmodel,dimensions);
glmScale(pmodel,dimensions[1]);
glmScale(body,2.0/dimensions[1]);
glmScale(arm1,2.0/dimensions[1]);
glmScale(arm2,2.0/dimensions[1]);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}


成功轉動
沒有留言:
張貼留言