2022年3月21日 星期一

*嗚嗚* Week05

 # Week05

今日上課內容:

主題一:

1.打開今天的上課範例,網址:http://jsyeh.org/3dcg10

    下載data.zip/解壓縮/data資料夾放進windows資料夾裡

    下載win32.zip/解壓縮/打開Transformation.exe即可

    範例使用說明:右上角模型框框/滑鼠按右鍵可以換模型

    下方調整glRotate的數值:(角度,x,y,z)



2.利用範例練習-四個動作:
    安培右手定則:大拇指指向箭頭方向,另外四隻手指指向旋轉方向。

    2-1.X軸(1,0,0):
        (正值,1,0,0):竹籤躺平在中間,箭頭朝右。旋轉結果如下:
        
              (負值,1,0,0):竹籤躺平在中間,箭頭朝左(相反方向)。旋轉結果如下:

    2-2.Y軸(0,1,0):
     (正值,0,1,0):竹籤在中間,箭頭朝上。旋轉結果如下:



     (負值,0,1,0):竹籤在中間,箭頭朝下。旋轉結果如下:

    2-3.Z軸(0,0,1):
     (正值,0,0,1):竹籤從肚子穿出來,箭頭朝前。旋轉結果如下:

     (負值,0,0,1):竹籤從肚子穿出來,箭頭朝後。旋轉結果如下:

    2-4.XY軸(1,1,0):



題外話:寫blogger的小秘密:可以利用gist.github.com來存放分享程式碼到自己的blogger裡。
3.程式碼實作:我們利用上周基本的程式碼,插入glRotatef(角度,x,y,z)函式來轉動黃色茶壺。
    程式碼如下:
```C++
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(180,0,0,1);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}

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

    glutDisplayFunc( display );

    glutMainLoop();
    return 0;
}
```

主題二:mouse motion

4.程式碼實作:改良上一個程式碼,加入mouse互動,利用glutMotionFunc(),移動滑鼠,茶壺會跟著滑鼠的角度旋轉
程式碼如下:
```C++
#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,1,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("week05 mouse Motion");

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

5.程式碼實作:上一個程式,雖然看起來有在轉,但其實不是正確的,以上一個程式加上
glutMouseFunc(mouse);函式去改良
程式碼如下:
```C++
#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,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int button,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("week05 mouse Motion");

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

第三節:
1.複習mouse程式&GL_LINE_LOOP
程式碼一:利用滑鼠點擊的點,把線連起來,製作圖案,並找到座標位子。
```C++
#include <stdio.h>
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++){
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }
    glEnd();
    glutSwapBuffers();
}
void mouse(int button,int state,int mouseX,int mouseY)
{
    if(state==GLUT_DOWN){
        N++;
        x[N-1]=mouseX;
        y[N-1]=mouseY;
        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("week05 mouse Motion");

    glutDisplayFunc( display );
    glutMouseFunc(mouse);
    glutMainLoop();
}
```

程式碼二:把上一個程式延伸,把Mouse函式改成Motion函式,可以利用滑鼠連續畫線,畫出來的圖案更多元。
程式碼如下:
```C++
#include<stdio.h>
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++){
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }
    glEnd();
    glutSwapBuffers();
}
void motion(int mouseX,int mouseY)
{
        N++;
        x[N-1]=mouseX;
        y[N-1]=mouseY;
        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("week05 mouse Motion");

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


The End

沒有留言:

張貼留言