2022年3月21日 星期一

⚝ YI-ZHEN的筆記 week05

 

  • 課堂範例https://jsyeh.org/3dcg10/
1. 與上週相同。下載 Win32 及 data 的範例檔案,並解壓縮
2. 解壓縮後,將data資料夾移至window資料夾中
3. 點開 Transformation.exe 即可操作


4. 點右鍵可更換模型,下面的數值可調整距離、大小縮放...等等
  • Rotation (旋轉)
1. 利用 安培右手定則 來判斷旋轉的位置
3. 利用glRotatef(角度, x, y, z)來進行旋轉

3. 旋轉x 軸 中心點從身體左邊穿至右邊,上下旋轉 
4. 移動 y 軸 中心點從身體下面穿至上面,左右旋轉
5.移動 y 軸 中心點從身體肚子前面穿至後面 ,面對你旋轉   
6.有可一次移動多項 讓其隨意轉動
  • Rotation (旋轉) 實作
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(180, 0, 0, 1);
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}

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

    glutDisplayFunc(display);
    glutMainLoop();
}
  • 用滑鼠旋轉
#include <GL/glut.h>
float angle= 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle = x;
    display();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Rotate");

    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}
  • 用滑鼠旋轉 (修正問題)


#include <GL/glut.h>
float angle= 0, oldX= 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int botton, int state, int x, int y)
{///按下滑鼠、放下滑鼠
    oldX= x;
}
void motion(int x, int y)
{///拖著移動
    angle += (x-oldX);
    oldX = x;
    display();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Rotate");

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

  • 用滑鼠畫圖 (複習)

  • 用滑鼠拖曳畫圖 
#include <stdio.h>
#include <GL/glut.h>
int N=0; ///一開始沒有任何頂點
int x[1000], y[1000]; ///最多1000個頂點
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0; i<N; i++){ ///用迴圈 畫N個頂點
        glVertex2f( (x[i]-150)/150.0, -(y[i]-150)/150.0);
    }    ///口訣:  減一半、除一半 y要加負號
    glEnd();
    glutSwapBuffers();
}
void motion(int mouseX, int mouseY)
{
    N++; ///多一個頂點
    x[N-1] = mouseX; ///最後一個新增之頂點x座標
    y[N-1] = mouseY; ///最後一個新增之頂點y座標
    printf("按下滑鼠,得到新座標 %d %d\n", x[N-1], y[N-1]);
    display();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("mouse");

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


沒有留言:

張貼留言