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();
}







沒有留言:

張貼留言

距地表面160 Week11

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