Week12
week12-1_glm_gundam_handA_handB
1. 先設定好環境
2. 安裝 freeglut 再把 lib\libfreeglut.a 複製成 libglut32.a
3. 安裝 opencv 2.1, 記得要 Add PATH, 不要設目錄
4. 關閉重開 CodeBlocks (才會把 PATH 設定設好 要記得存檔)
5. -Search directories 的 Compiler 對應 C:\OpenCV2.1\include
6. -Search directories 的 Linker 對應 C:\OpenCV2.1\lib
7. -Linker setting 要加 cv210 cxcore210 highgui210
8. 再把 GitHub 的程式下載, 再把 week11-2_glm_gundam_opencv_texture_lighting 拿來改
9. week11-2 複製目錄, 改目錄名為 week12-1_glm_gundam_handA_handB
10. 把 .cbp 檔, 改目錄名為 week12-1_glm_gundam_handA_handB.cbp
11. 用Notepad++ 開 .cbp 檔, 改 Title 為 week12-1_glm_gundam_handA_handB
12. CodeBlocks File-Open week12-1_glm_gundam_handA_handB.cbp
要修改的程式: 把今天考試的 T-R-T 設定正確
技巧1 : 把擋住的註解掉, 把旋轉註解掉
技巧2 : 把用來對照的座標原點, 用glutSolidSphere(0.1, 30, 30);
#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;
}
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
GLMmodel * handA = NULL;
GLMmodel * handB = NULL;
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/Gundam.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
}
void drawHandA(void)
{
if (!handA) {
handA = glmReadOBJ("data/handA.obj");
if (!handA) exit(0);
glmUnitize(handA);
glmFacetNormals(handA);
glmVertexNormals(handA, 90.0);
}
glmDraw(handA, GLM_SMOOTH | GLM_TEXTURE);
}
void drawHandB(void)
{
if (!handB) {
handB = glmReadOBJ("data/handB.obj");
if (!handB) exit(0);
glmUnitize(handB);
glmFacetNormals(handB);
glmVertexNormals(handB, 90.0);
}
glmDraw(handB, GLM_SMOOTH | GLM_TEXTURE);
}
void myBody() { ///我的身體
glPushMatrix(); ///備份矩陣
glColor3f(1, 0, 0);///紅色的
glutSolidCube(0.6);///myBody();
glPopMatrix(); ///還原矩陣
}
float angle = 0; ///加這行, 讓它轉動
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDisable(GL_TEXTURE_2D);
myBody();
glutSolidSphere(0.1, 30, 30);
glEnable(GL_TEXTURE_2D);
glColor3f(1,1,1);
glPushMatrix(); ///加這行, 讓它轉動
glTranslatef(0.3, 0.3, 0);
glRotatef(angle++, 0, 0, 1);///(2)對Z軸轉
glTranslatef(0, -0.3, 0);///(1)把選轉軸, 放在正中心
drawHandB(); //drawmodel(); //glutSolidTeapot( 0.3 );
glPopMatrix(); ///加這行, 讓它轉動
glPushMatrix(); ///加這行, 讓它轉動
glTranslatef(-0.3, 0.3, 0);
glRotatef(-angle++, 0, 0, 1);///(2)對Z軸轉
glTranslatef(0, -0.3, 0);///(1)把選轉軸, 放在正中心
drawHandA(); //drawmodel(); //glutSolidTeapot( 0.3 );
glPopMatrix(); ///加這行, 讓它轉動
glutSwapBuffers();
}
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, 5.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 };
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week11-2 Gundam");
glutDisplayFunc(display);
glutIdleFunc(display); ///加這行, 讓它轉動
myTexture("data/Diffuse.jpg");
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
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);
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();
}
week12-2_glm_gundam_upper_lower
目標 : 要把上手臂, 下手臂切好, 讀入
事先準備 : Maya 開起來, 把 handA.obj 讀入, 切割出 upperA.obj 和 lowerA.obj
1. 再把 week12-1_glm_gundam_handA_handB 複製成 week12-2_glm_gundam_upper_lower裡面的 .cbp 改檔名成week12-2_glm_gundam_upper_lower.cbp
2. 再用 Notepad++ 把 Title 和睦路, 也更新成 week12-2_glm_gundam_upper_lower
3. 加程式
GLMmodel * upperA = NULL;
GLMmodel * lowerA = NULL;
4. 再把 void drawHandA() 複製修改成 void drawUpperA() 和 void drawLowerB()
5. 讓手關節可以動
6. 讓手只在固度角度轉
week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle
1. 把 week12-2_glm_gundam_upperA_lowerA 複製成
week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle
float angle = 0, da = 1; ///剛剛的舊程式碼
void motion(int x, int y) ///加入mouse motion 對應的函式
{
angle = y; ///當我們的 mouse motion 時, y座標 對應角度
}
void display()
{
/// angle += da; ///不要自己動, 要用mouse motion 來動
/// if(angle>90) da = -1;
/// if(angle<0) da = +1;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
...
#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;
}
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
GLMmodel * handA = NULL;
GLMmodel * handB = NULL;
GLMmodel * upperA = NULL;
GLMmodel * lowerA = NULL;
void drawupperA(void)
{
if (!upperA) {
upperA = glmReadOBJ("data/upperA.obj");
if (!upperA) exit(0);
glmUnitize(upperA);
glmFacetNormals(upperA);
glmVertexNormals(upperA, 90.0);
}
glmDraw(upperA, GLM_SMOOTH | GLM_TEXTURE);
}
void drawlowerA(void)
{
if (!lowerA) {
lowerA = glmReadOBJ("data/lowerA.obj");
if (!lowerA) exit(0);
glmUnitize(lowerA);
glmFacetNormals(lowerA);
glmVertexNormals(lowerA, 90.0);
}
glmDraw(lowerA, GLM_SMOOTH | GLM_TEXTURE);
}
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/Gundam.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
}
void drawHandA(void)
{
if (!handA) {
handA = glmReadOBJ("data/handA.obj");
if (!handA) exit(0);
glmUnitize(handA);
glmFacetNormals(handA);
glmVertexNormals(handA, 90.0);
}
glmDraw(handA, GLM_SMOOTH | GLM_TEXTURE);
}
void drawHandB(void)
{
if (!handB) {
handB = glmReadOBJ("data/handB.obj");
if (!handB) exit(0);
glmUnitize(handB);
glmFacetNormals(handB);
glmVertexNormals(handB, 90.0);
}
glmDraw(handB, GLM_SMOOTH | GLM_TEXTURE);
}
void myBody() { ///我的身體
glPushMatrix(); ///備份矩陣
glColor3f(1, 0, 0);///紅色的
glutSolidCube(0.6);///myBody();
glPopMatrix(); ///還原矩陣
}
float angle = 0, da = 1; ///加這行, 讓它轉動
void motion(int x, int y)
{
angle = y;
}
void display()
{
/// angle+=da;
/// if(angle>90) da = -1;
/// if(angle<0) da = +1;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDisable(GL_TEXTURE_2D);
///myBody(); ///先註解掉身體
glutSolidSphere(0.1, 30, 30); ///圓球
glEnable(GL_TEXTURE_2D);
glColor3f(1,1,1);
glPushMatrix();
///glTranslatef(...); 掛在肩上
glRotatef(angle, 0, 0, 1);
glTranslatef(0, -0.07, 0);
drawupperA(); ///(3)上手臂放好
glPushMatrix(); ///(0)
glTranslatef(-0.02, -0.09, 0); ///(3) 再掛到上手臂的位置
///glRotatef(angle, 1, 0, 0); ///(2) x軸轉
glTranslatef(0, -0.21, 0); ///(1)
drawlowerA(); ///(0)
glPopMatrix(); ///(0)
glPopMatrix();
glutSwapBuffers();
}
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, 5.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 };
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week12-2 Gundam");
glutDisplayFunc(display);
glutIdleFunc(display); ///加這行, 讓它轉動
glutMotionFunc(motion);
myTexture("data/Diffuse.jpg");
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
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);
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();
}
沒有留言:
張貼留言