2023年3月1日 星期三

sheeba - week03 - 移動translate

 Step01-1_下載上課的資料

https://jsyeh.org/3dcg10/

下載data data.zip、win32 windows.zip、glut32.dll

解壓縮到   下載\windows

執行今天的課本範例 Transformation.exe

Step01-2_移動茶壺

建立GLUT專案,命名week03-1_translate

改成上週的10行程式加上glTranslatef(x,y,z),把茶壺往右移

前面加上glPushMatrix();

後面加上glPopMatrix();

#include <GL/glut.h>
void display()
{
    glPushMatrix(); ///備份矩陣
        glTranslatef( 0.5, 0, 0 ); ///只有這行還不夠
        glutSolidTeapot( 0.3 );
    glPopMatrix(); ///還原矩陣

    glutSwapBuffers();
}
int main(int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

    glutDisplayFunc(display);

    glutMainLoop();
}



Step02-1 請MOUSE函式幫忙




#include <GL/glut.h>
void display()
{
    glPushMatrix(); ///step01-2 備份矩陣
        glTranslatef( 0.5, 0, 0 ); ///step01-2 只有這行還不夠
        glutSolidTeapot( 0.3 );
    glPopMatrix(); ///step01-2 還原矩陣

    glutSwapBuffers();
}
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    printf("%d %d %d %d\n", button, state, x, y);
}
int main(int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

    glutDisplayFunc(display);
    glutMouseFunc(mouse); ///step02-1 請 mouse函式幫忙

    glutMainLoop();
}

Step02-2

#include <GL/glut.h>
float X=0,Y=0;///step02-2
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///step02-2清背景
    glPushMatrix();///備份矩陣
        glTranslatef( X, Y, 0 );///只有這行還不夠 step01-2
        glutSolidTeapot( 0.3 );
    glPopMatrix();///還原矩陣 step01-2

    glutSwapBuffers();
}
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    X=(x-150)/150.0;///step02-2 減一半除一半
    Y=-(y-150)/150.0;
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03");

glutDisplayFunc(display);
glutMouseFunc(mouse);///step02-1 請MOUSE函式幫忙

glutMainLoop();
}

Step02-3 GitHub 的 Gist功能



Step03-1 利用MOUSE描點


#include <GL/glut.h>
float X=0,Y=0;///step02-2
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///step02-2清背景
    glBegin(GL_POLYGON);///開始畫多邊形
        glVertex2f(-0.236,0.108);
        glVertex2f(-0.212,0.144);
        glVertex2f(-0.032,0.180);
        glVertex2f(-0.052,0.224);
        glVertex2f(0.040,0.220);
        glVertex2f(0.028,0.172);
        glVertex2f(0.132,0.156);
        glVertex2f(0.208,0.156);
        glVertex2f(0.252,0.068);
        glVertex2f(0.288,-0.008);
        glVertex2f(0.368,0.068);
        glVertex2f(0.412,0.136);
        glVertex2f(0.480,0.132);
        glVertex2f(0.520,0.132);
        glVertex2f(0.456,0.096);
        glVertex2f(0.392,-0.028);
        glVertex2f(0.340,-0.116);
        glVertex2f(0.292,-0.128);
        glVertex2f(0.228,-0.208);
        glVertex2f(-0.216,-0.216);
        glVertex2f(-0.304,-0.140);
        glVertex2f(-0.452,0.004);
        glVertex2f(-0.452,0.064);
        glVertex2f(-0.348,0.104);
        glVertex2f(-0.244,0.104);
    glEnd();///結束
    glPushMatrix();///備份矩陣
        glTranslatef( X, Y, 0 );///只有這行還不夠 step01-2
        glutSolidTeapot( 0.3 );
    glPopMatrix();///還原矩陣 step01-2

    glutSwapBuffers();
}
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    float X=(x-250)/250.0;///step02-2 減一半除一半
    float Y=-(y-250)/250.0;
    if(state==GLUT_DOWN)
    {
        printf("glVertex2f(%.3f,%.3f):\n",X,Y);
    }
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
glutCreateWindow("week03");

glutDisplayFunc(display);
glutMouseFunc(mouse);///step02-1 請MOUSE函式幫忙

glutMainLoop();
}

Step03-2 畫出中華民國國旗

Step03-3 Github



沒有留言:

張貼留言