2022年5月17日 星期二

雪⛄電腦圖學筆記13~

2022/5/17 第十三周 

主題 : TRT 的 R的角度、搭配鍵盤滑鼠、

1. 畫出一個長方形---- Rectf();

 #include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRectf( 0.3, 0.5, -0.3, -0.5);

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(500,500);

    glutCreateWindow("week13 rect TRT");

    glutDisplayFunc(display);

    glutMainLoop();

}


2. 加上一個手(小方塊) 

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);///白色

    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();

        ///glTranslatef(x,y,z);      ///(3)把手臂掛回身體

        ///glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉

        ///glTranslatef(x2,y2,z2);   ///(1)把手的旋轉中心,放到中心

        glColor3f(1,0,0);///紅色

        glRectf( 0.3, 0.5, 0.7, 0.3);///手臂

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    ///glutInitWindowSize(600,600);

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();

}


3. 用上面的程式 講解TRT

(1) 把手的旋轉中心,放到中心

----手的原本座標在(0.3,0.5),想把手調到中心

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);///白色

    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();

        ///glTranslatef(x,y,z);      ///(3)把手臂掛回身體

        ///glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉

        glTranslatef( -0.3, -0.4, 0);   ///(1)把手的旋轉中心,放到中心

        glColor3f(1,0,0);///紅色

        glRectf( 0.3, 0.5, 0.7, 0.3);///手臂

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    ///glutInitWindowSize(600,600);

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();

}



(2) 旋轉 (對z軸做旋轉)

#include <GL/glut.h>

float angle=45;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);///白色

    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();

        ///glTranslatef(x,y,z);      ///(3)把手臂掛回身體

        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉

        glTranslatef(-0.3,-0.4,0);   ///(1)把手的旋轉中心,放到中心

        glColor3f(1,0,0);///紅色

        glRectf( 0.3, 0.5, 0.7, 0.3);///手臂

    glPopMatrix();

    glutSwapBuffers();

}


int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    ///glutInitWindowSize(600,600);

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();


}



(3)把手臂掛回身體(把手臂放回去原來的地方)

#include <GL/glut.h>

float angle=45;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);///白色

    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();

        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體

        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉

        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心

        glColor3f(1,0,0);///紅色

        glRectf( 0.3, 0.5, 0.7, 0.3);///手臂

    glPopMatrix();

    glutSwapBuffers();

}


int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    ///glutInitWindowSize(600,600);

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();


}



4. 按住滑鼠左右拉 讓手臂可以轉動

#include <GL/glut.h>
float angle=45, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}

5. 多畫一個手臂關節
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂

        glPushMatrix();
            ///glTranslatef(x,y,z);
            ///glRotatef(angle,0,0,1);
            ///glTranslatef(x2,y2,z2);
            glColor3f(0,1,0);///綠色
        glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}


(1) 把綠手臂的旋轉中心,放到中心
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂

        glPushMatrix();
            ///glTranslatef(x,y,z);
            ///glRotatef(angle,0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///紅色
        glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}

(2) 綠手臂對z軸做旋轉(暫時把紅手臂的Rotate註解)

///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        ///glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂

        glPushMatrix();
            ///glTranslatef(x,y,z);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///紅色
        glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}



(3) 把綠手臂掛回身體
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        ///glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂

        glPushMatrix();
            glTranslatef(0.7,0.4,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///紅色
        glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}


(4)把紅手臂的rotate加回去(跟綠手臂一起旋轉)
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體
    glPushMatrix();
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂

        glPushMatrix();
            glTranslatef(0.7,0.4,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///紅色
        glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}



6.加上左手臂( x 的值要相反--->正轉負,負轉正(因為鏡射))
///week13_rect_many_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();///右半部
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///右上手臂

        glPushMatrix();
            glTranslatef(0.7,0.4,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///綠色
        glRectf( 0.7, 0.5, 1.0, 0.3);///右上手臂

        glPopMatrix();

    glPopMatrix();

    glPushMatrix();///左半部
        glTranslatef(-0.3, 0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle,0,0,1);   ///(2)對z軸做旋轉
        glTranslatef(+0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf(-0.3, 0.5,-0.7, 0.3);///左上手臂

        glPushMatrix();
            glTranslatef(-0.7,0.4,0);
            glRotatef(angle,0,0,1);
            glTranslatef(+0.7,-0.4,0);
            glColor3f(0,1,0);///綠色
        glRectf(-0.7, 0.5,-1.0, 0.3);///左下手臂

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}

7. 需要很多angle(ex:四個關節)
--->keyboard(按鍵盤上的數字,可以選擇要控制幾號關節)
--->angleID(如果angleID=0,angle=0 [0號關節的意思])

///week13_rect_many_TRT
#include <GL/glut.h>
float angle[20], oldX=0;
int angleID=0; ///0號關節,1號關節...
void keyboard(unsigned char key, int x, int y) ///鍵盤按數字,讀到angleID
{
    if(key=='0')  angleID=0;
    if(key=='1')  angleID=1;
    if(key=='2')  angleID=2;
    if(key=='3')  angleID=3;
}

void mouse(int button, int state, int x, int y)///滑鼠按下去
{
    oldX = x;
}

void motion(int x, int y)///滑鼠拖曳
{
    angle[angleID] += (x-oldX);
    oldX = x;
    glutPostRedisplay(); ///請GLUT重畫畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);///白色
    glRectf( 0.3, 0.5, -0.3, -0.5);///身體

    glPushMatrix();///右半部
        glTranslatef( 0.3,  0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle[0],0,0,1);   ///(2)對z軸做旋轉
        glTranslatef( -0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf( 0.3, 0.5, 0.7, 0.3);///右上手臂

        glPushMatrix();
            glTranslatef(0.7,0.4,0);
            glRotatef(angle[1],0,0,1);
            glTranslatef(-0.7,-0.4,0);
            glColor3f(0,1,0);///綠色
        glRectf( 0.7, 0.5, 1.0, 0.3);///右上手臂

        glPopMatrix();

    glPopMatrix();

    glPushMatrix();///左半部
        glTranslatef(-0.3, 0.4, 0);      ///(3)把手臂掛回身體
        glRotatef(angle[2],0,0,1);   ///(2)對z軸做旋轉
        glTranslatef(+0.3, -0.4,0);   ///(1)把手的旋轉中心,放到中心
        glColor3f(1,0,0);///紅色
        glRectf(-0.3, 0.5,-0.7, 0.3);///左上手臂

        glPushMatrix();
            glTranslatef(-0.7,0.4,0);
            glRotatef(angle[3],0,0,1);
            glTranslatef(+0.7,-0.4,0);
            glColor3f(0,1,0);///綠色
        glRectf(-0.7, 0.5,-1.0, 0.3);///左下手臂

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);
    glutCreateWindow("week13 rect TRT TRT");

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();

}


8.上週作業修改(看老師的教學影片)
    void readALLModel(){
        
    }
    GLMmodel * readOneModel(char * filename){
        
    }
    
        
   void display(){
        glmDraw(body,GLM_MATERIAL);
        glPush
            T
            R
            T
            glmDraw(head1,GLM_MATERIAL);
            glPush
                T
                R
                T
                glmDraw(head2,GLM_MATERIAL);
            glPop
        glPop
    }
    

沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...