--------------------------------------------------------------------------------------------------------------------------------
把之前的檔案clone下來
-----------------------------------------------------------------------------------------------------------------------------
▧第一個程式
#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; (每一下都+90度)
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutTimerFunc(2000,timer,0); //設定timer函式
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------------------------------
▧第二個程式
void keyboard(unsigned char key, int x,int y)
{
glutTimerFunc(0,timer,0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard); //用鍵盤啟動
//glutTimerFunc(2000,timer,0); //設定timer函式
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------------------------------
▧第三個程式
到Excel中打入並計算角度的數值
得到以下
#include<GL/glut.h>
float angle=0,oldAngle=0, newAngle=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)
{
if( t<100 )glutTimerFunc(500,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; ///按下
if( state==GLUT_UP) newAngle = x; ///放開
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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week14");
glutDisplayFunc(display);
glutMouseFunc(mouse); ///按下去表示起點 放開表示終點
glutMotionFunc(motion);
glutKeyboardFunc(keyboard); //用鍵盤啟動
//glutTimerFunc(2000,timer,0); //設定timer函式
glutMainLoop();
}
★★★回家整理上週程式筆記
final檔案!!
final有修改的程式碼
#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, 0, 1, 0};
int ID = 2;
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.200000,+0.453333,0);
glRotatef(angle,0,0,1);
glTranslatef(+1.200000,-0.453333,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;
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);
glutMouseFunc(mouse);
glutMotionFunc(motion); ///Week13 step03-3
glutKeyboardFunc(keyboard); ///step02-2 keyboard要做事囉(開檔、讀檔)
glutMainLoop();
}
下手臂也是同樣的做法利用TRT掛到上手臂上





沒有留言:
張貼留言