week14計時器timer、內插
先裝 Git程式, 下載clone
git clone 網址
今天的程式: timer
先裝 freeglut
glutTimerFunc
另外要準備好 void timer
開啟CodeBlocks: File-New-Project, GLUT專案 week14-1_timer 專案
Week14-1_timer
可以移動滑鼠調整觀看的角度
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1);
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
void timer(int t) ///step01-1 你的 timer()函式,做對應動作
{
glutTimerFunc(500, timer, t+1); ///step01-1 設定下一個鬧鐘
angle += 90; ///增加90度
glutPostRedisplay(); ///重畫畫面
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutTimerFunc(2000, timer, 0); ///step01-1 設定timer函式
glutMainLoop();
}
| /* | |
| * GLUT Shapes Demo | |
| * | |
| * Written by Nigel Stewart November 2003 | |
| * | |
| * This program is test harness for the sphere, cone | |
| * and torus shapes in GLUT. | |
| * | |
| * Spinning wireframe and smooth shaded shapes are | |
| * displayed until the ESC or q key is pressed. The | |
| * number of geometry stacks and slices can be adjusted | |
| * using the + and - keys. | |
| */ | |
| #ifdef __APPLE__ | |
| #include <GLUT/glut.h> | |
| #else | |
| #include <GL/glut.h> | |
| #endif | |
| #include <stdlib.h> | |
| static int slices = 16; | |
| static int stacks = 16; | |
| /* GLUT callback Handlers */ | |
| static void resize(int width, int height) | |
| { ///ar = aspective ratio 長寬比 | |
| const float ar = (float) width / (float) height; | |
| glViewport(0, 0, width, height); | |
| glMatrixMode(GL_PROJECTION);///切換投影矩陣 | |
| glLoadIdentity();///設成單位矩陣 | |
| ///glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0); | |
| glOrtho(-ar*3, ar*3, -1.0*3, 1.0*3, 2.0, 100.0); | |
| glMatrixMode(GL_MODELVIEW); | |
| glLoadIdentity() ;///設成單位矩陣 | |
| } | |
| static void display(void) | |
| { | |
| const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; | |
| const double a = t*90.0; | |
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
| glColor3d(1,0,0); | |
| glPushMatrix(); | |
| glTranslated(-2.4,1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutSolidSphere(1,slices,stacks); | |
| glPopMatrix(); | |
| glPushMatrix(); | |
| glTranslated(0,1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutSolidCone(1,1,slices,stacks); | |
| glPopMatrix(); | |
| glPushMatrix(); | |
| glTranslated(2.4,1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutSolidTorus(0.2,0.8,slices,stacks); | |
| glPopMatrix(); | |
| glPushMatrix(); | |
| glTranslated(-2.4,-1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutWireSphere(1,slices,stacks); | |
| glPopMatrix(); | |
| glPushMatrix(); | |
| glTranslated(0,-1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutWireCone(1,1,slices,stacks); | |
| glPopMatrix(); | |
| glPushMatrix(); | |
| glTranslated(2.4,-1.2,-6); | |
| glRotated(60,1,0,0); | |
| glRotated(a,0,0,1); | |
| glutWireTorus(0.2,0.8,slices,stacks); | |
| glPopMatrix(); | |
| glutSwapBuffers(); | |
| } | |
| static void key(unsigned char key, int x, int y) | |
| { | |
| switch (key) | |
| { | |
| case 27 : | |
| case 'q': | |
| exit(0); | |
| break; | |
| case '+': | |
| slices++; | |
| stacks++; | |
| break; | |
| case '-': | |
| if (slices>3 && stacks>3) | |
| { | |
| slices--; | |
| stacks--; | |
| } | |
| break; | |
| } | |
| glutPostRedisplay(); | |
| } | |
| static void idle(void) | |
| { | |
| glutPostRedisplay(); | |
| } | |
| 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 }; | |
| /* Program entry point */ | |
| int main(int argc, char *argv[]) | |
| { | |
| glutInit(&argc, argv); | |
| glutInitWindowSize(640,480); | |
| glutInitWindowPosition(10,10); | |
| glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); | |
| glutCreateWindow("GLUT Shapes"); | |
| glutReshapeFunc(resize); | |
| glutDisplayFunc(display); | |
| glutKeyboardFunc(key); | |
| glutIdleFunc(idle); | |
| glClearColor(1,1,1,1); | |
| glEnable(GL_CULL_FACE); | |
| glCullFace(GL_BACK); | |
| 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(); | |
| return EXIT_SUCCESS; | |
| }
利用Excel來示範,什麼是alpha內插 #include <stdio.h>///要檔案的Input/Output #include <GL/glut.h> #include "glm.h"///week13_step02-2 ///再把glm.cpp 在左邊 Add files 加進去 GLMmodel * head = NULL;///week13_step02-2 GLMmodel * body = NULL;///week13_step02-2 GLMmodel * uparmR = NULL; GLMmodel * lowarmR = NULL; //int show[4] = {1,0,0,0}; week13_step03-1 int show[4] = {1,1,1,1};///week14_step03-1 int ID=2;///week14_step03-1 設定關節 ID float teapotX=0,teapotY=0,angle=0; FILE * fout = NULL; ///step02-1 FILE * fin = NULL; ///step02-1 void keyboard(unsigned char key,int x,int y) { if(key=='0') ID=0; ///week14_step03-1 //show[0] = ! show[0]; week13 if(key=='1') ID=1; ///week14_step03-1 //show[1] = ! show[1]; week13 if(key=='2') ID=2; ///week14_step03-1 //show[2] = ! show[2]; week13 if(key=='3') ID=3; ///week14_step03-1 //show[3] = ! show[3]; week13 glutPostRedisplay(); } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); if(head==NULL) { head = glmReadOBJ("model/head.obj");///week13_step02-2 body = glmReadOBJ("model/body.obj"); uparmR = glmReadOBJ("model/uparmR.obj"); lowarmR = glmReadOBJ("model/lowarmR.obj"); ///glmUnitize(head);///week13_step02-2 之後改 } glPushMatrix(); glScalef(0.3,0.3,0.3);///week13_step02-3 glPushMatrix();///week13_step03-2 //glTranslatef(teapotX,teapotY,0);///week13_step03-2 if(ID==0) glColor3f(1,0,0); ///week14_step03-1 else glColor3f(1,1,1); ///week14_step03-1 if(show[0]) glmDraw(head,GLM_MATERIAL);///week13_step02-3 glPopMatrix();///week13_step03-2 if(ID==1) glColor3f(1,0,0); ///week14_step03-1 else glColor3f(1,1,1); ///week14_step03-1 if(show[1]) glmDraw(body,GLM_MATERIAL);///week13_step02-2 glPushMatrix(); ///week14_step03-2 ///glTranslatef(teapotX,teapotY,0); ///week14_step03-2 要設定 TRT glTranslatef(-1.360000, +0.360000, 0); ///week14_step03-2 glRotatef(angle,0,0,1); ///week14_step03-2 glTranslatef(1.360000, -0.360000, 0); ///week14_step03-2 if(ID==2) glColor3f(1,0,0); ///week14_step03-1 else glColor3f(1,1,1); ///week14_step03-1 if(show[2]) glmDraw(uparmR,GLM_MATERIAL);///week13_step02-3 glPushMatrix(); ///week14_step03-2 ///glTranslatef(teapotX,teapotY,0); ///week14_step03-2 要設定 TRT glTranslatef(-1.959999, +0.080000, 0); ///week14_step03-2 glRotatef(angle,0,0,1); ///week14_step03-2 glTranslatef(1.959999, -0.080000, 0); ///week14_step03-2 if(ID==3) glColor3f(1,0,0); ///week14_step03-1 else glColor3f(1,1,1); ///week14_step03-1 if(show[3]) glmDraw(lowarmR,GLM_MATERIAL);///week13_step02-3 glPopMatrix(); glPopMatrix(); glPopMatrix(); glColor3f(0,1,0); ///week14_step03-2 綠色的 glutSolidTeapot(0.02); ///week14_step03-2 glutSwapBuffers(); } int oldX=0, oldY=0;///week13_step03-2 void mouse(int button,int state,int x,int y) { if(state==GLUT_DOWN) { oldX = x; oldY = y; } } void motion(int x,int y) { teapotX += (x - oldX)/150.0; teapotY -= (y - oldY)/150.0; printf("glTranslatef(%f, %f, 0);\n",teapotX,teapotY); ///week14_step03-2 angle += x-oldX; ///week14_step03-2 oldX = x; oldY = y; glutPostRedisplay(); } int main(int argc, char**argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week14"); glutMotionFunc(motion);///week13_step03-2 glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutMainLoop(); |



沒有留言:
張貼留言