2014年5月8日 星期四

Week 12 葉正聖示範

今天的目標: 做出會動的木頭人偶

1. 今天先用一個 T-R-T 對特定軸轉動的小考, 來讓同學複習這個關鍵技術
1.1. 洩題: 用 LINE 饅頭人, 來進行考試
1.2. 最後答案:
glPushMatrix();
  glTranslatef( -0.5, 0.5, 0 ); //Step 3
  glRotatef( -30,  0, 0, 1);// Step 2 (有陷阱哦!)
  glTranslatef( -0.4, 0, 0);// Step 1
  drawHand();
glPopMatrix();

2. 我們開始用木頭人的圖, 進行示範
2.1. 上網找出一張木頭人, 開始裁出 n 張圖

3. 寫出程式的內容 (可以剪貼哦!)
3.1. 安裝 glut 及 opencv 的 DevPak 讓 Dev C++ 可以寫有貼圖的程式
3.2. 在 blog 裡面找一下程式來剪貼啦 (ex. tag: 000葉正聖老師, 然後找裡面的 texture 及上週的程式碼)
3.3. 請注意, 要把排版 TAB 設定好
3.4. link error 時, 要把 Alt-P (Project-Option設定) 裡面的 Link 設定好, 加入咒語 -lcv -lcxcore -lhighgui
(要小心要用空格與後面的格開哦!)
3.5. 執行時出現 dll 檔的錯誤時, 請把 c:\dev-cpp\bin\opencv\ 目錄裡面所有的 .dll 檔案, 都放到 c:\windows\system32 裡面

但有些電腦不能接受你把一堆 dll 檔死命地往 c:\windows\system32 丟, 所以你可能要改放在 "同一個目錄中", 像在你桌面的那個專案目錄裡面!




#include <GL/glut.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <stdio.h>
//IplImage *img1, *img2, *img3, *img4;
//GLuint id1, id2, id3, id4;
IplImage * img[40];//技巧1: 可以把重覆的東西, 用陣列來簡化
GLuint id[40];//技巧1: 可以把重覆的東西, 用陣列來簡化
float angleX=0;
void myPrepareTexture(int i)//用參數來配, 找對應正確的變數
{//技巧3: 可以把重覆的東西, 用函式來簡化
cvCvtColor(img[i], img[i], CV_BGR2RGB);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &id[i]);
glBindTexture(GL_TEXTURE_2D, id[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img[i]->width, img[i]->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img[i]->imageData);
}
void myTexture()
{
img[0]=cvLoadImage("imgbody.png");
img[1]=cvLoadImage("imgHand1.png");
img[2]=cvLoadImage("imgLeg1.png");
for(int i=0;i<3;i++){//技巧2: 可以把重覆的東西, 用迴圈來簡化
myPrepareTexture(i);
}
}
void myPolygon(int num){//技巧3: 可以把重覆的東西, 用函式來簡化
glPushMatrix();
glScalef(0.3, 0.8, 0.8);
glBindTexture(GL_TEXTURE_2D, id[num]);
glBegin(GL_POLYGON);
glTexCoord2f(0, 0);   glVertex3f( -0.5,  0.5, 0);
glTexCoord2f(1, 0);   glVertex3f(  0.5,  0.5, 0);
glTexCoord2f(1, 1);   glVertex3f(  0.5, -0.5, 0);
glTexCoord2f(0, 1);   glVertex3f( -0.5, -0.5, 0);
glEnd();
glPopMatrix();
}
void myBody(){
myPolygon(0);
}
void myLeg(){
myPolygon(1);
}
void myHand(){
myPolygon(2);
}
void display()
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
myBody();
glPushMatrix();
glTranslatef(0.2,0,0);//右手
glRotatef(angleX, 0,0,1);
glTranslatef(0, -0.4, 0);
myHand();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.2,0,0);//左手
glRotatef(-angleX, 0,0,1);
glTranslatef(0, -0.4, 0);
myHand();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.2,-0.3,0);//左腿
glRotatef(-angleX, 0,0,1);
glTranslatef(0, -0.4, 0);
myLeg();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='a') angleX+=3;
if(key=='b') angleX-=3;
glutPostRedisplay();

}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);
glutCreateWindow("week12");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
myTexture();//不要忘了加哦!
glutMainLoop();
}

八卦: http://www.ptt.cc/bbs/GameDesign/M.1398537892.A.2FE.html

沒有留言:

張貼留言