WEEK16
複習前幾周的上課https://github.com/jsyeh/2023graphicsa
可從教授的網站找不對程式的錯誤跟程式碼
| #include <GL/glut.h> | |
| #include <stdio.h> | |
| #include "glm.h" | |
| GLMmodel * gundam = NULL; | |
| float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0; | |
| void mouse(int button, int state, int x, int y) { | |
| oldX = x; | |
| oldY = y; | |
| } | |
| void motion(int x, int y) { | |
| teapotX = (x-150) / 150.0; | |
| teapotY = (150-y) / 150.0; | |
| angle += x - oldX; | |
| oldX = x; | |
| printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY); | |
| glutPostRedisplay(); | |
| } | |
| void display() { | |
| glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); | |
| glPushMatrix(); | |
| glColor3f(1,0,0); | |
| glScalef(0.03, 0.03, 0.03); | |
| glmDraw(gundam, GLM_MATERIAL); | |
| glPopMatrix(); | |
| glColor3f(0,1,0); | |
| glutSolidTeapot( 0.01 ); | |
| glutSwapBuffers(); | |
| } | |
| int main(int argc, char** argv) | |
| { | |
| glutInit(&argc, argv); | |
| glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); | |
| glutCreateWindow("week16"); | |
| glutDisplayFunc(display); | |
| glutMotionFunc(motion); | |
| glutMouseFunc(mouse); | |
| gundam = glmReadOBJ("model/gundam.obj"); | |
| glutMainLoop(); | |
| } |
codeblocks更改不同的模式
week_16
第九部 step09.1t
移動模型不要用跟老師一樣的鋼彈模型!!
下周期末作業展示
git push. 儲存程式 把模型關節全部弄出來 讓動畫可以動
脖子 手臂兩個關節 total 22個關節+動畫
s存檔 r讀檔 舞步跟動畫可以編排
""
開codeblocks
File->New->project->GLUT專案->打上專案名稱
1.專案Notepad++
2.working_dir改成小數點
3.複製freeglut裡的dll檔案貼上到專案
opencv的設定()
貼上10行程式碼
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char *argv[])//main()主函式 進階版
{
glutInit(&argc,argv);//把參數送給glutInit初始化
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
glutCreateWindow("第02週的程式喔!!");//開GLUT視窗
glutDisplayFunc(display);//顯示用的函式
glutMainLoop();
}
最後總程式碼#include <stdio.h> #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> #include "glm.h" GLMmodel * head = NULL; GLMmodel * body = NULL; ///GLMmodel * gundam = NULL; GLMmodel * arm1 = NULL, * arm2 = NULL; GLMmodel * hand1 = NULL, * hand2 = NULL; GLMmodel * bot = NULL; GLMmodel * leg1 = NULL, * leg2 = NULL; GLMmodel * knee1 = NULL, * knee2 = NULL; GLMmodel * foot1 = NULL, * foot2 = NULL; 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 teapotX=0, teapotY=0, oldX=0, oldY=0; ///有不同 float angle[20]={}, angle2[20]={}; int ID=0; ///0:head, 1,2:left, 3,4:right hand, 5,6,7:left leg, 8,9,10:right leg void keyboard(unsigned char key, int x, int y) { if(key=='0') ID=0; if(key=='1') ID=1; if(key=='2') ID=2; if(key=='3') ID=3; if(key=='4') ID=4; if(key=='5') ID=5; if(key=='6') ID=6; if(key=='7') ID=7; if(key=='8') ID=8; if(key=='9') ID=9; } void mouse(int button, int state, int x, int y) { oldX = x; oldY = y; }
void motion(int x, int y) { teapotX += (x - oldX)/10.0; ///有不同 teapotY += (oldY - y)/10.0; ///有不同 angle[ID] += x - oldX; angle2[ID] += y - oldY; ///有不同 oldX = x; oldY = y; ///有不同 printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY); glutPostRedisplay(); } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glScalef(2,2,2); glTranslatef(0, -0.4, 0); glPushMatrix(); glColor3f(1,1,1);///glColor3f(1,0,0); glScalef(0.03, 0.03, 0.03); glRotatef(90, 0, 1, 0); glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix(); glTranslatef(0.000 , +22.300 , 0 ); glRotatef(angle[0], 0, 1, 0); glRotatef(angle2[0], 1, 0, 0); glTranslatef(0.000 , -22.300 , 0 ); glmDraw(head, GLM_MATERIAL | GLM_TEXTURE); glPopMatrix();
glPushMatrix(); glTranslatef(-3.800 , +21.200 , 0 ); glRotatef(angle[1], 0, 1, 0); glRotatef(angle2[1], 1, 0, 0); glTranslatef(3.800 , -21.200 , 0 ); glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE); glPushMatrix(); glTranslatef(-4.300 , +18.600 , 0 ); glRotatef(angle[2], 0, 1, 0); glRotatef(angle2[2], 1, 0, 0); glTranslatef(4.300 , -18.600 , 0 ); glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE); glPopMatrix(); glPopMatrix();
glPushMatrix(); glTranslatef(+3.800 , +21.200 , 0 ); glRotatef(angle[3], 0, 1, 0); glRotatef(angle2[3], 1, 0, 0); glTranslatef(-3.800 , -21.200 , 0 ); glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE); glPushMatrix(); glTranslatef(+4.300 , +18.600 , 0 ); glRotatef(angle[4], 0, 1, 0); glRotatef(angle2[4], 1, 0, 0); glTranslatef(-4.300 , -18.600 , 0 ); glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE); glPopMatrix(); glPopMatrix();
glmDraw(bot, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix();///左大腿 glTranslatef(-2.000 , +14.100 , 0 ); glRotatef(angle[5], 0, 1, 0); glRotatef(angle2[5], 1, 0, 0); glTranslatef(2.000 , -14.100 , 0 ); glmDraw(leg1, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix(); glTranslatef(-2.000 , +10.500 , 0 ); glRotatef(angle[6], 0, 1, 0); glRotatef(angle2[6], 1, 0, 0); glTranslatef(2.000 , -10.500 , 0 ); glmDraw(knee1, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix(); glTranslatef(-2.000 , +3.000 , 0 ); glRotatef(angle[7], 0, 1, 0); glRotatef(angle2[7], 1, 0, 0); glTranslatef(2.000 , -3.000 , 0 ); glmDraw(foot1, GLM_MATERIAL | GLM_TEXTURE); glPopMatrix(); glPopMatrix(); glPopMatrix();
glPushMatrix();///右大腿 glTranslatef(+2.000 , +14.100 , 0 ); glRotatef(angle[8], 0, 1, 0); glRotatef(angle2[8], 1, 0, 0); glTranslatef(-2.000 , -14.100 , 0 ); glmDraw(leg2, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix(); glTranslatef(+2.000 , +10.500 , 0 ); glRotatef(angle[9], 0, 1, 0); glRotatef(angle2[9], 1, 0, 0); glTranslatef(-2.000 , -10.500 , 0 ); glmDraw(knee2, GLM_MATERIAL | GLM_TEXTURE);
glPushMatrix(); glTranslatef(+2.000 , +3.000 , 0 ); glRotatef(angle[10], 0, 1, 0); glRotatef(angle2[10], 1, 0, 0); glTranslatef(-2.000 , -3.000 , 0 ); glmDraw(foot2, GLM_MATERIAL | GLM_TEXTURE); glPopMatrix(); glPopMatrix(); glPopMatrix();
glPopMatrix(); glColor3f(0,1,0);///中心點的位置 glutSolidTeapot( 0.01 );///中心點的位置 glPopMatrix();
glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("week16");
glutDisplayFunc(display); glutMotionFunc(motion); glutMouseFunc(mouse); glutKeyboardFunc(keyboard);
head = glmReadOBJ("model/head.obj"); body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj"); arm1 = glmReadOBJ("model/arm1.obj"); arm2 = glmReadOBJ("model/arm2.obj"); hand1 = glmReadOBJ("model/hand1.obj"); hand2 = glmReadOBJ("model/hand2.obj"); bot = glmReadOBJ("model/bot.obj"); leg1 = glmReadOBJ("model/leg1.obj"); leg2 = glmReadOBJ("model/leg2.obj"); knee1 = glmReadOBJ("model/knee1.obj"); knee2 = glmReadOBJ("model/knee2.obj"); foot1 = glmReadOBJ("model/foot1.obj"); foot2 = glmReadOBJ("model/foot2.obj"); myTexture("model/Diffuse.jpg"); glEnable(GL_DEPTH_TEST);
glutMainLoop(); }

沒有留言:
張貼留言