2022年3月14日 星期一

⚝ YI-ZHEN的筆記 week04

  • 課堂範例https://jsyeh.org/3dcg10/

1. 下載 Win32 及 data 的範例檔案,並解壓縮
2. 解壓縮後,將data資料夾移至window資料夾中
3. 點開 Transformation.exe 即可操作
4. 點右鍵可更換模型,下面的數值可調整距離、大小縮放...等等
  • Translate (移動)
1. 與Week01一樣,建立一個GLUT專案(Week04_Translate)
    1.1 先進入 moodle 打開上課用軟體資料夾 下載 freeglut  
    1.2 下載好後解壓縮至桌面
    1.3 打開lib資料夾 先複製一個相同的檔案 再改檔名為libglut32.a
    1.4 CodeBlocks 建立 project 點選 GLUT project
    1.5 修改專案名稱及檔案位置
    1.6 GLUT 要在桌面的 freeglut 中
2.將所有原有程式刪除

3.先做出一個茶壺,利用 glTranslatef()更改位置。
   為了讓他不隨著視窗的移動而更改位置,
   所以要用  glPushMatrix()  備份陣列 
                    glPopMatrix()   還原矩陣

#include <GL/glut.h>

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

    glPushMatrix();
        glTranslatef(0.3, 0.2, 0);  ///向右上角移動
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix(); 
    glutSwapBuffers();
}

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

    glutDisplayFunc(display);
    glutMainLoop();
}

  • 自訂函式
1. 可自訂一個函式,在輸入時就可以一次做好多個圖案出來
  • Mouse 滑鼠事件
1. 設定一個mouse函式(新增滑鼠事件),建立完之後要再 main 中加入 glutMouseFunc(mouse),
    這樣才可以執行
2. 在輸出中
        button  代表你是用哪一個鍵按下的 (左鍵為0 中鍵為1 右鍵為2) 
        state    代表你是點下、放開的指示 (點下為0 放開為1) 
        x   y     代表點下的座標位置

#include <GL/glut.h>
#include <stdio.h> ///printf()

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

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_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;
}
  • Mouse 滑鼠移動茶壺
1. 前面的 mouse程式 再加上可以隨著滑鼠點擊而移動的程式
2. mouse口訣為 減一半 除一半 y還倒過來

#include <GL/glut.h>
#include <stdio.h> ///printf()
int mouseX=0, mouseY=0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 0); ///黃色
    glPushMatrix(); 
        glTranslatef((mouseX-150)/150.0, -(mouseY-150)/150.0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}

void mouse(int button, int state, int x, int y)
{
    mouseX= x;
    mouseY= y;
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}
  • Mouse 滑鼠產生程式碼並且畫圖














沒有留言:

張貼留言