2023年5月25日 星期四

week15 Zhou

 Week15

首先去https://jsyeh.org/3dcg10/老師這個網址下載
win32 和 data 接著把兩個都解壓縮
接著把data 資料夾放進win32 
接著開啟projection.exe








接著開啟codeblocks 新增一個新的GLUT專案
檔名為 week15-1_glutlookAt
並新增以下紅色部分程式碼



float eyeX =0, eyeY = 0;
void motion(int x,int y)
{
    eyeX = 3*(x-320)/320.0;
    eyeY = 3*(240-y)/240.0;
    glLoadIdentity();
    gluLookAt(eyeX, eyeY, 3,     0, 0, -6,    0, 1, 0);
    glutPostRedisplay();
}
/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutMotionFunc(motion);
    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}


執行程式碼後就可以轉動攝影機
看到不同角度的畫面囉







接著試著去調整剛剛開啟的projection裡的數值
以及不同的程式碼跑出來的效果不一樣

glOrtho( )
glFrustum( )
gluPerspective( )








接著開啟新的專案
week15-2_glPerspective
修改成以下紅色部分程式碼

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-ar*3, ar*3, -1.0*3, 1.0*3, 2.0, 100.0);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

執行結果如下





修改成以下紅色部分程式碼


static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   /// glOrtho(-ar*3, ar*3, -1.0*3, 1.0*3, 2.0, 100.0);
   gluPerspective(60,ar, 0.01,1000);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}


執行結果如下





新增一個新的GLUT專案
檔名week15-3_glPerspective_glutLookAt
將程式碼全刪掉
新增以下程式碼



#include <GL/glut.h>

void display()
{
    glClear(  GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot(0.3);

    glutSwapBuffers();
}
void motion(int x, int y){

    glLoadIdentity();
    float eyeX= (x-150)/150-0, eyeY= (150-y)/150.0;
    gluLookAt(eyeX ,eyeY ,1 , 0,0,0,   0,1,0);
    glutPostRedisplay();




    }


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


    glutMotionFunc(motion);
    glutDisplayFunc(display);
    glutMainLoop();
}


執行結果如下
能夠以不同角度去看茶壺






接著將程式碼新增且修改以下紅色部分



#include <GL/glut.h>

void display()
{
    glClear(  GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot(0.3);

    glutSwapBuffers();
}
void motion(int x, int y){

    glLoadIdentity();
    float eyeX= (x-150)/150-0, eyeY= (150-y)/150.0;
    gluLookAt(eyeX ,eyeY ,1 , 0,0,0,   0,1,0);
    glutPostRedisplay();
    }
void reshape(int w, int h) {
    float ar =w / (float) h;
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ar ,0.01,1000);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,1,   0,0,0,    0,1,0);



}

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

    glutReshapeFunc(reshape);
    glutMotionFunc(motion);
    glutDisplayFunc(display);
    glutMainLoop();
}



接著執行程式碼 
就會出現以下畫面囉
可以調整角度且較近






接著開起finalproject

修改以下程式碼


最前面的angle
float angle[20] = {};
///float angle=0;


        glPushMatrix();

            glTranslatef(-1.360000,+0.360000,0);
            glRotatef(angle[2],0,0,1);
            glTranslatef(1.360000,-0.360000,0);

            if(ID==2) glColor3f(1,0,0);
            else glColor3f(1,1,1);
            if(show[2]) glmDraw(rightup_arm, GLM_MATERIAL);

            glPushMatrix();
                glTranslatef(-1.959999,+0.080000,0);
                glRotatef(angle[3],0,0,1);
                glTranslatef(1.959999,-0.080000,0);

                if(ID==3) glColor3f(1,0,0);
                else glColor3f(1,1,1);
                if(show[3]) glmDraw(rightlow_arm, GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();



執行程式碼後
利用數字鍵 切換紅色部分
就能指定轉動哪個部位




































沒有留言:

張貼留言