Week14切換關節、移動、旋轉
開啟github將final_project下載下來
將libfreeglut.a改為libglut32.a
開啟codeblock新專案命名為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)
{
glutTimerFunc(500,timer,t+1);
angle+=50;
glutPostRedisplay();
}
int main(int argc,char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutTimerFunc(2000,timer,0);
glutMainLoop();
}
用鍵盤控制茶壺程式
#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)
{
glutTimerFunc(500, timer, t+1);
angle += 90;
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
glutTimerFunc(0, timer, 0);
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
///glutTimerFunc(2000, timer, 0);
glutMainLoop();
}
使用滑鼠控制茶壺
#include <GL/glut.h>
float angle=0, oldAngle=0, newAngle=0; ///step02-1宣告變數
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()函式,做對應動作
{
if(t<100) glutTimerFunc(50, timer, t+1);
float alpha = t/100.0;
angle = newAngle*alpha + (1-alpha) * oldAngle;
glutPostRedisplay(); ///重畫畫面
}
void motion(int x, int y)
{
angle = x;
glutPostRedisplay();
}
void mouse(int button, int state,int x, int y)
{
if(state==GLUT_DOWN) oldAngle = x; ///step02-1按下去
if(state==GLUT_UP) newAngle = x; ///step02-1放開來
glutPostRedisplay(); ///step02-1重畫畫面
}
void keyboard(unsigned char key, int x, int y)
{
glutTimerFunc(0, timer, 0);
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
///glutTimerFunc(2000, timer, 0);
glutMainLoop();
}
#include <stdio.h> #include <GL/glut.h> #include "glm.h" GLMmodel * head = NULL; GLMmodel * body = NULL; GLMmodel * uparmR = NULL; GLMmodel * lowarmR = NULL; int show[4] = {1, 1, 1, 1}; int ID = 0; 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; glutPostRedisplay(); } FILE * fout = NULL; FILE * fin =NULL; float teapotX=0, teapotY=0; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glScalef(0.2, 0.2, 0.2); if(body==NULL){ head = glmReadOBJ("model/head.obj"); body = glmReadOBJ("model/body.obj"); uparmR = glmReadOBJ("model/uparmR.obj"); lowarmR = glmReadOBJ("model/lowarmR.obj"); } if(ID==0) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[0]) glmDraw(body, GLM_MATERIAL); if(ID==1) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[1]) glmDraw(head, GLM_MATERIAL); glPushMatrix(); glTranslatef(teapotX, teapotY, 0); if(ID==2) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[2]) glmDraw(uparmR, GLM_MATERIAL); glPopMatrix(); if(ID==3) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[3]) glmDraw(lowarmR, GLM_MATERIAL); glPopMatrix(); glutSwapBuffers(); } int oldX = 0, oldY = 0; void motion(int x,int y) { teapotX += (x - oldX)/150.0; teapotY += (y - oldY)/150.0; printf("glTranslatef(%f, %f, 0;\n",teapotX, teapotY); glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if(state==GLUT_DOWN){ oldX = x; oldY = y; ///angle = x; } display(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Week12"); glutDisplayFunc(display); glutMotionFunc(motion); glutKeyboardFunc(keyboard); glutMainLoop(); }
#include <stdio.h> #include <GL/glut.h> #include "glm.h" GLMmodel * head = NULL; GLMmodel * body = NULL; GLMmodel * uparmR = NULL; GLMmodel * lowarmR = NULL; int show[4] = {0, 1, 1, 0}; int ID = 2; ///0:頭 , 1:身體 , 2:上手臂 , 3:下手臂 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; glutPostRedisplay(); } FILE * fout = NULL; FILE * fin =NULL; float teapotX=0, teapotY=0; float angle=0, angle2=0, angle3=0; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glScalef(0.2, 0.2, 0.2); if(body==NULL){ head = glmReadOBJ("model/head.obj"); body = glmReadOBJ("model/body.obj"); uparmR = glmReadOBJ("model/uparmR.obj"); lowarmR = glmReadOBJ("model/lowarmR.obj"); } if(ID==0) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[0]) glmDraw(head, GLM_MATERIAL); if(ID==1) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[1]) glmDraw(body, GLM_MATERIAL); glPushMatrix(); glTranslatef(-1.273334, +0.540000, 0); glRotatef(angle, 0, 0, 1); glTranslatef(1.273334, -0.540000, 0); if(ID==2) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[2]) glmDraw(uparmR, GLM_MATERIAL); glPopMatrix(); if(ID==3) glColor3f(1,0,0); else glColor3f(1,1,1); if(show[3]) glmDraw(lowarmR, GLM_MATERIAL); glPopMatrix(); glColor3f(0, 1, 0); glutSolidTeapot( 0.02 ); glutSwapBuffers(); } int oldX = 0, oldY = 0; void motion(int x,int y) { teapotX += (x - oldX)/150.0; teapotY += (y - oldY)/150.0; oldX = x; oldY = y; angle = x; printf("glTranslatef(%f, %f, 0;\n",teapotX, teapotY); glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if(state==GLUT_DOWN){ oldX = x; oldY = y; angle = x; ///angle = x; } display(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Week12"); glutDisplayFunc(display); glutMotionFunc(motion); glutKeyboardFunc(keyboard); glutMainLoop(); }
#include <stdio.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel * head = NULL;
GLMmodel * body = NULL;
GLMmodel * uparmR = NULL;
GLMmodel * lowarmR = NULL;
int show[4] = {0, 1, 1, 1};
int ID = 2; ///0:頭 , 1:身體 , 2:上手臂 , 3:下手臂
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;
glutPostRedisplay();
}
FILE * fout = NULL;
FILE * fin =NULL;
float teapotX=0, teapotY=0;
float angle=0, angle2=0, angle3=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glScalef(0.2, 0.2, 0.2);
if(body==NULL){
head = glmReadOBJ("model/head.obj");
body = glmReadOBJ("model/body.obj");
uparmR = glmReadOBJ("model/uparmR.obj");
lowarmR = glmReadOBJ("model/lowarmR.obj");
}
if(ID==0) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[0]) glmDraw(head, GLM_MATERIAL);
if(ID==1) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[1]) glmDraw(body, GLM_MATERIAL);
glPushMatrix();
glTranslatef(-1.273334, +0.540000, 0);
glRotatef(angle, 0, 0, 1);
glTranslatef(1.273334, -0.540000, 0);
if(ID==2) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[2]) glmDraw(uparmR, GLM_MATERIAL);
glPushMatrix();
glTranslatef(-1.933332, +0.106667, 0);
glRotatef(angle,0,0,1);
glTranslatef(1.933332, -0.106667, 0);
//glTranslatef(teapotX, teapotY, 0);
if(ID==3) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[3]) glmDraw(lowarmR, GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glColor3f(0, 1, 0);
glutSolidTeapot( 0.02 );
glutSwapBuffers();
}
int oldX = 0, oldY = 0;
void motion(int x,int y)
{
teapotX += (x - oldX)/150.0;
teapotY -= (y - oldY)/150.0;
angle += x-oldX;
oldX = x;
oldY = y;
printf("glTranslatef(%f, %f, 0;\n",teapotX, teapotY);
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_DOWN){
oldX = x;
oldY = y;
///angle = x;
///angle = x;
}
display();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week12");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
沒有留言:
張貼留言