2023年5月17日 星期三

Deverra//week14切換關節

 

WEEK14
--------------------------------------------------------------------------------------------------------------------------------

*** 為防式電腦當機 先下載git

把之前的檔案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掛到上手臂上






沒有留言:

張貼留言