#Week13
# Week13
- week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle
- freeglut 安裝
- OpenCV 2.1 安裝
- 重開 CodeBlocks,設定 Compiler-Setting 的3個設定
- C:\OpenCV2.1\include
- C:\OpenCV2.1\lib
- cv210 cxcore210 highgui210
- 再把上週的
- week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle 拿來用
- 程式碼:
- #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
- #include <opencv/cv.h>
- #include <GL/glut.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 myBody()
- {
- glPushMatrix();
- glColor3f(1,0,0);
- glutSolidCube(0.6);///myBody()
- glPopMatrix();
- }
- ///float angle = 0,da=1; ///加這行, 讓它轉動
- float angle[20]={};
- int angleID=0;
- int oldX=0,oldY=0;
- void motion(int x, int y){
- angle[angleID]+=y-oldY;
- oldX=x;
- oldY=y;
- glutPostRedisplay();
- }
- void mouse(int button,int state,int x, int y){
- oldX=x;
- oldY=y;
- }
- void keyboard(unsigned char key,int x,int y){
- if(key=='0')angleID=0;
- if(key=='1')angleID=1;
- if(key=='2')angleID=2;
- if(key=='3')angleID=3;
- }
- 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,0,1);
- glTranslatef(0,-0.07,0);
- drawUpperA();
- glPushMatrix(); ///加這行, 讓它轉動
- glTranslatef(-0.02,-0.09,0);
- glRotatef(angle[1],1,0,0);
- glTranslatef(0,-0.21,0);
- drawLowerA();
- glPopMatrix(); ///加這行, 讓它轉動
- 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("week13");
- glutDisplayFunc(display);
- glutIdleFunc(display); ///加這行, 讓它轉動
- glutMotionFunc(motion);
- glutMouseFunc(mouse);
- glutKeyboardFunc(keyboard);
- 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();
- week13-2_FILE_fopen_fprint_fscanf
- 把 week13-1 複製整個目錄,改目錄名、改.cbp名、Notepad++改裡面的 Title
- 在 week13-2裡,要加 FILE 指標
- #include <stdio.h>
FILE * fin = NULL;
FILE * fout = NULL;
- 在motion()裡,要加一段程式
- 你執行程式時,用mouse motion一邊改變角度,一邊大量產生角度值小黑關掉後,可在目錄裡,看到angle.txt裡面就是剛剛印的一堆數值
小心, angle.txt 裡面要有空格,不然就錯了。printf()及 fprintf()要加"%.1f"
- 現在,要讀
- 程式碼:
- #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;
- GLMmodel * body = NULL;
- void drawBody(void)
- {
- if (!body) {
- body = glmReadOBJ("data/body.obj");
- if (!body) exit(0);
- glmUnitize(body);
- glmFacetNormals(body);
- glmVertexNormals(body, 90.0);
- }
- glmDraw(body, GLM_SMOOTH | GLM_TEXTURE);
- }
- 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 myBody()
- {
- glPushMatrix();
- glColor3f(1,0,0);
- glutSolidCube(0.6);///myBody()
- glPopMatrix();
- }
- ///float angle = 0,da=1; ///加這行, 讓它轉動
- float angle[20]={};
- int angleID=0;
- int oldX=0,oldY=0;
- #include <stdio.h>
- FILE * fin = NULL;
- FILE * fout = NULL;
- void motion(int x, int y){
- angle[angleID]+=y-oldY;
- oldX=x;
- oldY=y;
- glutPostRedisplay();
- if(fout==NULL) fout = fopen("angle.txt", "w+");
- for(int i=0; i<20; i++){
- printf("%.1f", angle[i]);
- fprintf(fout, "%.1f ", angle[i]);
- }
- printf("\n");
- fprintf(fout, "\n");
- }
- void mouse(int button,int state,int x, int y){
- oldX=x;
- oldY=y;
- }
- void keyboard(unsigned char key,int x,int y){
- if(key=='r'){
- if(fin==NULL) fin = fopen("angle.txt", "r");
- for(int i=0; i<20; i++){
- fscanf(fin,"%f", &angle[i]);
- }
- glutPostRedisplay();
- }
- if(key=='0')angleID=0;
- if(key=='1')angleID=1;
- if(key=='2')angleID=2;
- if(key=='3')angleID=3;
- }
- 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);
- ///glutSolidSphere(0.1,30,30);
- glEnable(GL_TEXTURE_2D);
- glColor3f(1,1,1);
- glPushMatrix();
- glRotatef(angle[0],0,1,0);
- drawBody();
- glEnable(GL_TEXTURE_2D);
- glColor3f(1,1,1);
- glPushMatrix();
- glTranslatef(-0.1,0,0);
- glRotatef(angle[1],0,0,1);
- glRotatef(angle[2],1,0,0);
- glTranslatef(0,-0.07,0);
- drawUpperA();
- glPushMatrix(); ///加這行, 讓它轉動
- glTranslatef(-0.02,-0.09,0);
- glRotatef(angle[1],1,0,0);
- glTranslatef(0,-0.21,0);
- drawLowerA();
- glPopMatrix(); ///加這行, 讓它轉動
- 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("week13");
- glutDisplayFunc(display);
- glutIdleFunc(display); ///加這行, 讓它轉動
- glutMotionFunc(motion);
- glutMouseFunc(mouse);
- glutKeyboardFunc(keyboard);
- 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();
- }
cpp
void motion(int x, int y) {
angle [angleID] += y - oldy;
oldX = x;
oldY =y;
glutPostRedisplay();
if(fout==NULL) fout = fopen("angle.txt", "w+");
for(int i=0; i<20; i++){
printf("%.lf", angle[i]);
fprintf(fout, "%.lf ", angle[i]);
}
printf("\n");
fprintf(fout, "\n");
}
沒有留言:
張貼留言