2023年3月9日 星期四

mian𓃹 Week04 旋轉

 一。旋轉



step1. 同week03-1,至https://jsyeh.org/3dcg10/下載windows.zip和data.zip並解壓縮,將data放至window後執行Transformation.exe



step2. 向上為Y軸,順時鐘旋轉為X軸正向,以左圖為標準,若數字增加則向右旋轉如右圖



step3. 上下為z軸,數字減少為向上旋轉,以左圖為基準,右圖為向上


step4. 若為不正常旋轉軸(ex.(1,1,0)),想像軸為烤肉竹籤旋轉


二。旋轉茶壺



step1. 參照week01-2打開
step2. 貼上上週程式碼

#include <GL/glut.h>


void display()

{

    glutSolidTeapot(0.3);

    glutSwapBuffers();

}


int main(int argc,char* argv[])

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week03");


    glutDisplayFunc(display);


    glutMainLoop();

}



step3. 修改程式完成旋轉茶壺

#include <GL/glut.h>

float angle=0;

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

     glPushMatrix();
        glRotatef(angle,0,1,0);
        glutSolidTeapot(0.3);

    glPopMatrix();
    glutSwapBuffers();

    angle++;

}



int main(int argc,char* argv[])
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();

}

三。光線


step1. 開新專案叫week04-2_rotate_light,複製貼上上一個專案

step2. 在177行程式碼裡找到兩大段有關light的程式複製貼上
step3. build&run

#include <GL/glut.h>

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

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

float angle=0;

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

     glPushMatrix();
        glRotatef(angle,0,1,0);
        glutSolidTeapot(0.3);

    glPopMatrix();
    glutSwapBuffers();

    angle++;

}



int main(int argc,char* argv[])
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

    myLight();
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();

}

四。有顏色的旋轉茶壺


step1. 在transform範例中可交換swap translate和rotate程式,會造成自轉及公轉差異


step2. 旋轉
-調整glScale數值可讓車子變胖變瘦
-調整Translatef會移動視角
-調整Rotatef轉動整個世界


step3. 旋轉茶壺
-將第一個程式貼上修改

#include <GL/glut.h>

float angle=0;

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

     glPushMatrix();
        glTranslatef(0.5,0,0);///移動到哪
        glRotatef(angle,0,1,0);///旋轉中的
        glColor3f(0,0,1);///顏色
        glutSolidTeapot(0.3);

    glPopMatrix();
    glutSwapBuffers();

    angle++;

}



int main(int argc,char* argv[])
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();

}



step4. 複製第一個茶壺的程式並修改void display為


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

     glPushMatrix();
        glTranslatef(0.5,0,0);///移動到哪
        glRotatef(angle,0,1,0);///旋轉中的
        glColor3f(0,0,1);///顏色
        glutSolidTeapot(0.3);
    glPopMatrix();

    glPushMatrix();
        glRotatef(angle,0,1,0);///旋轉中的
        glTranslatef(0.5,0,0);///移動到哪
        glColor3f(1,1,0);///顏色
        glTranslatef(0,0.55,0);
        glutSolidTeapot(0.3);
    glPopMatrix();

    glutSwapBuffers();
    angle++;

}

沒有留言:

張貼留言