顯示具有 week14 標籤的文章。 顯示所有文章
顯示具有 week14 標籤的文章。 顯示所有文章

2021年6月7日 星期一

電腦圖學 week 14


 在Moodle下載gundam.zip解壓縮
備份GLUT開啟的程式碼要拿裡面的程式(一行)


打入程式碼
step01_新的GLUT專案,精簡程式碼,畫圖時用glutSolidSphere(0.3, 30, 30)

加入glutWireSphere(0.3,30,30);///線框
step01-2講解glutSolidSphere()及glutWireSphere()的參數, 半徑,經度,緯度

#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///glutSolidSphere(0.3,30,30);///實心///0.3是半徑
    glutWireSphere(0.3,30,30);///線框
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutMainLoop();
}
加入timer(等多久會變畫面)
step02_glutTimerFunc(等多久,timer, t) 及 void timer(int t)
#include <GL/glut.h>
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///glutSolidSphere(0.3,30,30);///實心///0.3是半徑
    glutWireSphere(0.3,30,30);///線框
    glutSwapBuffers();
}
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(30,timer,t+1);///
    glClearColor(1,0,0,0);///清背景色:紅色
    display();///重畫畫面
}
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}


變成紅底,白色方塊旋轉
step03_timer()裡面,再叫用 glutTimerFunc(30,timer, t+1) 以便持續一直叫, 同時改變angle以便看到不同的轉動角度
#include <GL/glut.h>
float angle=0;
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPopMatrix();
        glRotated(angle,0,0,1);
        glutSolidCube(0.3);///實心方塊
        ///glutSolidSphere(0.3,30,30);///實心///0.3是半徑
        ///glutWireSphere(0.3,30,30);///線框
    glPopMatrix();
    glutSwapBuffers();

}
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(30,timer,t+1);///設定新鬧鐘
    glClearColor(1,0,0,0);///清背景色:紅色
    angle++;
    display();///重畫畫面
}
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}

改變旋轉的速度
step04_angle變化的方法,改成angle+=diff,再用 if(角度太大)diff=-2; if(角度太小)diff=+2來做出有趣的變化
#include <GL/glut.h>
float angle=0;
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(angle,0,0,1);
        glutSolidCube(0.3);///實心方塊
        ///glutSolidSphere(0.3,30,30);///實心///0.3是半徑
        ///glutWireSphere(0.3,30,30);///線框
    glPopMatrix();
    glutSwapBuffers();

}
int diff=2;
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(20,timer,t+1);///設定新鬧鐘
    glClearColor(1,0,0,0);///清背景色:紅色
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    angle+=diff;
    display();///重畫畫面
}
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}
加上綠色手臂 轉動
step05_利用 glPushMatrix() 及 glPopMatrix()保護,分層畫出身體、畫出手臂drawArm1(),再利用T-R-T讓angle旋轉可以正確秀出來,
#include <GL/glut.h>
float angle=0;
void drawArml(){
    glPushMatrix();
        glScalef(1,0.5,0.5);///變細長的手臂
        glColor3f(0,1,0);
        glutSolidCube(0.2);///綠色的手臂
    glPopMatrix();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);///白色的身體
        glPushMatrix();
            glTranslatef(-0.2,0.2,0);///掛上肩膀
            glRotated(angle,0,0,1);///轉動
            glTranslatef(-0.1,0,0);///把旋轉中心(關節)先移到畫面最中心
            drawArml();///綠色的手臂
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
        ///glRotated(angle,0,0,1);
        ///glutSolidSphere(0.3,30,30);///實心///0.3是半徑
        ///glutWireSphere(0.3,30,30);///線框
}
int diff=2;
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(20,timer,t+1);///設定新鬧鐘
    //glClearColor(1,0,0,0);///清背景色:紅色
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    angle+=diff;
    display();///重畫畫面
}
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}







2021年5月26日 星期三

欸幹你看,是圖學欸Week14


 








#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidSphere( 0.3, 30, 30 );///範例偷這一行來      ///                 半徑  經度  緯度

    glutSwapBuffers();

}

int main(int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);

    glutMainLoop();

}

















#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //glutSolidSphere( 0.3, 30, 30 );  ///範例偷這一行來
    ///            半徑,縱切,橫切
    glutWireSphere( 0.3, 30, 30); ///網格
    glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
    glClearColor( 1, 0, 0, 0 );///清背景色:紅色
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
    glutMainLoop();
}
進階點 , 重複持續設定Timer(鬧鐘) , 實現Angle持續旋轉角度
 void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }

           上廁所、喝水
             void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }
            
            倒頭回去睡覺
            void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }



#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef( angle, 0, 0, 1 );
        glutSolidCube( 0.3 );
    glPopMatrix();
    ///glutWireSphere( 0.3, 30, 30); ///網格
    glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
    glutTimerFunc( 300, timer, t+1 ); 
    glClearColor( 1, 0, 0, 0 );///背景紅色
    angle++;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}

讓方塊旋轉
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
    glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
    glClearColor( 1, 0, 0, 0 );///清背景色:紅色
        if( angle>90 ) diff=diff-2;       if( angle<0  ) diff=diff+2;
       angle = angle+diff ;
    display();///重製畫面
}



加上手手選轉

#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1, 0.5, 0.5);///變細長的手臂
        glColor3f(0, 1, 0);///綠色的
        glutSolidCube( 0.2 );///手臂
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1); glutSolidCube( 0.4 );///白色的身體
    glPushMatrix();
        glTranslatef( -0.2, 0.2, 0);///(3)掛上肩膀
        glRotatef( angle, 0, 0, 1 );///(2)轉動
        glTranslatef( -0.1, 0, 0);///(1)把旋轉中心(關節) 移到畫面最中心
        drawArm1();///綠色的手臂
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
    glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
    ///glClearColor( 1, 0, 0, 0 );///清背景色:紅色
    if( angle>90 ) diff=diff-2;
    if( angle<0  ) diff=diff+2;
    angle = angle+diff ;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}

築損 Week14

 第1部份

將上週程式進行講解

執行結果


-----------------------------------------------------------------------------------------------------------------------------

第1部份

timer

codeblocks開啟新專案

將原本示範程式複製下來

全刪掉後

再打上基本的

glurSolidSphere(0.3,30,30) 實心圖

glutWireSphere(0.3,30,30) 線框圖

加上timer函式

void timer(int t)

{

    glClearColor(1,0,0,0);

    display();

}

經過三秒背景變紅色

新增

glutTimerFunc(30,timer,t+1);

加上旋轉

angle++;

三秒後不只背景變紅色

圖案也跟著旋轉

設diff=2;

if(angle>90) diff=-2;

if(angle<0)  diff=+2;

angle+=diff

就會轉到90度時逆時鐘旋轉

轉到0時會往順時鐘轉

新稱手臂函式

void drawArm1()

{

    glPushMatrix();

        glScalef(1,0.5,0.5);///變細長

        glColor3f(0,1,0);

        glutSolidCube(0.2);///綠色手臂

    glPopMatrix();

}

把線框圖換成白色的身體

glutSolidCube(0.4);///白色身體

加上手臂

glPushMatrix();

            glTranslatef(-0.2,0.2,0);///掛上肩膀

            glRotatef(angle,0,0,1);///轉動

            glTranslatef(-0.1,0,0);///移動到中間

            drawArm1();///綠色手臂

glPopMatrix();

一樣三秒後才執行

執行結果



















-----------------------------------------------------------------------------------------------------------------------------

第0部份


執行結果


-----------------------------------------------------------------------------------------------------------------------------

嘿嘿嘿(⊙v⊙)  Week14

第一步
————————————————————————————————————————

第二步


















————————————————————————————————————————


第三步


















————————————————————————————————————————

第四步
























————————————————————————————————————————


【】week14 timer【】

 先開一個GLUT專案

今天要用Sphere
圓圈不一樣(0.3→半徑、30→縱切、30→橫切)
Timer函式


等3秒(函式裡的3000)後做Timer函式,背景會變色
等3秒後,呼叫Timer函式,在0.03秒後再次呼叫Timer,angle一直++,cube就會旋轉
會來回旋轉
依照程式碼判斷順序由下往上

week14

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.3,30,30);

    glutSwapBuffers();

}

int main(int argc, char**argv)

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week14 timer");


    glutDisplayFunc(display);

    glutMainLoop();

}

#include <GL/glut.h>
///display()函式,其實display是函式指標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///glutSolidSphere(0.3,30,30);///實心
    glutWireSphere(0.3,30,30);///線框
    glutSwapBuffers();
}
void timer(int t){///timer響起時,做你要做的事
    glClearColor(1,0,0,0);///清背景顏色:紅色
    display();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);///等多久
    glutMainLoop();
}
時間到 方塊開始轉動
#include <GL/glut.h>
float angle=0;
///display()函式,其實display是函式指標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidCube(0.3);///實心方塊
        ///glutSolidSphere(0.3,30,30);///實心圓形
        ///glutWireSphere(0.3,30,30);///線框
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(30,timer,t+1);///起床,先設定新鬧鐘
    glClearColor(1,0,0,0);///清背景顏色:紅色
    angle++;
    display();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);///等多久
    glutMainLoop();
}
時間到 方塊左右轉
#include <GL/glut.h>
float angle=0;
///display()函式,其實display是函式指標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidCube(0.3);///實心方塊
        ///glutSolidSphere(0.3,30,30);///實心圓形
        ///glutWireSphere(0.3,30,30);///線框
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(30,timer,t+1);///起床,先設定新鬧鐘
    glClearColor(1,0,0,0);///清背景顏色:紅色
    if(angle>90)diff=-2;
    if(angle<0)diff=+2;
    angle+=diff;
    ///angle++;
    display();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);///等多久
    glutMainLoop();
}

#include <GL/glut.h>
float angle=0;
///display()函式,其實display是函式指標
void drawArm1(){
    glPushMatrix();
        glScalef(1,0.5,0.5);///變細長的手臂
        glColor3f(0,1,0); glutSolidCube(0.2);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1); glutSolidCube(0.4);///白色的身體
        glPushMatrix();
            glTranslatef(-0.2,0.2,0);///(3)掛上肩膀
            glRotatef(angle,0,0,1);///(2)轉動
            glTranslatef(-0.1,0,0);///(1)把旋轉中心(關節)先移動到畫面最中心
            drawArm1();///綠色的手臂
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t){///timer響起時,做你要做的事
    glutTimerFunc(30,timer,t+1);///起床,先設定新鬧鐘
    ///glClearColor(1,0,0,0);///清背景顏色:紅色
    if(angle>90)diff=-2;
    if(angle<0)diff=+2;
    angle+=diff;
    ///angle++;
    display();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);///等多久
    glutMainLoop();
}






 

電腦圖學week14

1.備份main函式到notepad++


2.程式碼:

#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.3,30,30);///實心圓形(半徑,縱切數,橫切數)
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14 timer");
    glutDisplayFunc(display);
    glutMainLoop();

}
glutSolidSphere(0.3,30,30);///實心圓形(半徑,縱切數,橫切數)

glueWireSphere(0.3,30,30);///線框圓形(半徑,縱切數,橫切數)


3.程式碼:
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    ///glutSolidSphere(0.3,30,30);
    glutWireSphere(0.3,30,30);
    glutSwapBuffers();
}
void timer(int t){
    glClearColor(1,0,0,0);///清背景,紅色
    display();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14 timer");
    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();

}

glutTimerFunc(3000,timer,0);///時間函式(等的時間,函式名稱,變數值)


4.程式碼:
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidCube(0.3);
    glPopMatrix();

    glutSwapBuffers();
}
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);///設定新timer
    glClearColor(1,0,0,0);
    angle++;///逆時鐘轉動
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc( 30, timer, 0);

    glutMainLoop();

}
逆時鐘旋轉

5.程式碼:
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidCube(0.3);
    glPopMatrix();

    glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    glClearColor(1,0,0,0);
    if(angle>90)diff=-2;
    if(angle<0)diff=2;
    angle+=diff;
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc( 3000, timer, 0);

    glutMainLoop();

}
正90度、負90度來回旋轉
6.程式碼:
#include <GL/glut.h>
float angle=0;
void drawArml(){
    glPushMatrix();
        glScalef(1,0.5,0.5);///細長的手臂
        glColor3f(0,1,0);glutSolidCube(0.2);///綠色手臂
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef(-0.2,0.2,0);///掛上肩膀
            glRotatef(angle,0,0,1);///轉動
            glTranslatef(-0.1,0,0);///旋轉中心(關節)移到畫面中心
            drawArml();///畫手臂
        glPopMatrix();
    glPopMatrix();
    ///glutSolidSphere(0.3,30,30);
    ///glutWireSphere(0.3,30,30);
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    glClearColor(1,0,0,0);
    if(angle>90)diff=-2;
    if(angle<0)diff=2;
    angle+=diff;
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc( 3000, timer, 0);

    glutMainLoop();

}

















timer

 -備份glut的程式碼(用notepad++)


glutSolidSphere(0.3,30,30);//實心
glutWireSphere(0.3,30,30);//線框
把timer函式加進來
void timer{}裡面坐要做的事情
這裡打的是把背景清成紅色
display();是重畫畫面
glutTimerFunc(要等的時間,timer,0);
float angle++;
設定角度,並加入程式碼
可以讓方塊旋轉,背景變色
int diff
這讓方塊能左右轉動

加一個手臂,讓手臂能再時間到的時候開始轉動
把手臂移到中心點
時間到了之後開始轉動
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef( -0.2,0.2,0 );//掛到肩膀
            glRotatef(angle,0,0,1);//轉動
            glTranslatef(-0.1,0,0);//把手臂關節放到中心點
            drawArm1();
        glPopMatrix();
    glPopMatrix();



程式碼:
#include <GL/glut.h>
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1,0.5,0.5);
        glColor3f(0,0,1);
        glutSolidCube(0.2);
    glPopMatrix();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef( -0.2,0.2,0 );
            glRotatef(angle,0,0,1);
            glTranslatef(-0.1,0,0);
            drawArm1();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    glClearColor(1,0,0,0);
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    angle+=diff;
    display();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();

}












距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...