2022年5月17日 星期二

VERY BEAUTIFUL,VERY POWERFUL

 

一.

打開glut 專案

打出以下程式碼

1-1

///

#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(700, 700);///視窗大小

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();

}

///

跑出以下結果


畫面顯示出一格長方形,使用座標畫出來,且視窗大小也有調整

1-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(700, 700);///視窗大小

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);


    glutMainLoop();

}

///

在畫出一個紅色長方形,並把他接回白色長方形
1-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(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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

    glutDisplayFunc(display);

    glutMainLoop();
}
///


把紅色長方形接回正中心,且讓它旋轉
1-4
///
#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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

    glutDisplayFunc(display);

    glutMainLoop();
}
///
把它像手臂一樣接回來(調整座標))

二.

2-1

///

#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(700, 700);///視窗大小

    glutCreateWindow("week13 rect TRT");


    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutDisplayFunc(display);


    glutMainLoop();

}

///

打出上列程式碼,讓紅色手臂可以用滑鼠操控

2-2
開啟新的GLUT專案,把剛剛的程式碼貼上去
再新增一個新的綠色手臂
///

#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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

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

    glutMainLoop();
}
///

2-3
調整綠色手臂的Z軸,讓它放到中心旋轉,同時先把紅色手臂Z軸旋轉註解掉
///
#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);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

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

    glutMainLoop();
}
///
2-4
把綠色手臂接回去,同時把紅色手臂的旋轉的註解刪掉

///
#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);///(3)把手軸接回去
            glRotatef(angle, 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

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

    glutMainLoop();
}
///
2-5
把紅色跟綠色手臂作複製且鏡像,作出第二條完整的手臂
///
#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);///(3)把手軸接回去
            glRotatef(angle, 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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);///(3)把手軸接回去
            glRotatef(angle, 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(+0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

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

    glutMainLoop();
}
///

三.
3-1
為了讓關節有更多角度,對angle作陣列
///
#include <GL/glut.h>
float angle[20], oldX= 0;
int angleID=0;///0、1、2、3號關節
void keyboard(unsigned char key, int x, int y){
    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);///(3)把手軸接回去
            glRotatef(angle[1], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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);///(3)把手軸接回去
            glRotatef(angle[3], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            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(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

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

    glutMainLoop();
}
///


沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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