顯示具有 week05 標籤的文章。 顯示所有文章
顯示具有 week05 標籤的文章。 顯示所有文章

2022年3月24日 星期四

A

W|EEK05


 1. 主題: 移動、旋轉、縮放、矩陣

https://jsyeh.org/3dcg10/下載

data/zip =>下載\windows.zip =>下載\windows\data\一堆3D模型 下面區域,可以交換兩行程式碼(移動、轉動)會有自轉公轉的效果

windows.zip=>下載\windows\transformation.exe



#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
    printf("你按下了%c在%d %d 座標 \n",key ,x,y);
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();


}


#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse (int button, int state ,int x ,int y)
{

}
void motion(int x, int y)
{

}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();


}

#include <GL/glut.h>
#include <stdio.h>
float x=0,y=0,z=0;
int oldX=0,oldY=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef((x-150)/150.0,-(y-150)/150.0,z);

    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int mouseX,int mouseY)
{
}
void mouse (int button, int state ,int mouseX ,int mouseY)
{

}
void motion(int mouseX, int mouseY)
{
    x+=(mouseX-oldX); y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();


}





#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0;
int oldX=0,oldY=0;
void display()
{
    glClearColor(0.5,0.5,0.5,1)'
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef((x-150)/150.0,-(y-150)/150.0,z);

    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int mouseX,int mouseY)
{
}
void mouse (int button, int state ,int mouseX ,int mouseY)
{
    oldX=mouseX;oldY=mouseY;
}
void motion(int mouseX, int mouseY)
{
    x+=(mouseX-oldX); y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();


}

                                                                             

#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0;
int oldX=0,oldY=0;
void display()
{
    glClearColor(0.5,0.5,0.5,1)'
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
    glScale(scale,scale,scale);
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int mouseX,int mouseY)
{
}
void mouse (int button, int state ,int mouseX ,int mouseY)
{
    oldX=mouseX;oldY=mouseY;
}
void motion(int mouseX, int mouseY)
{
    if(mouseX-oldX>0)scale*=1.01;
    if(mouseX-oldX<0)scale*=0.99;
     oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();


}

week05電腦圖學

 week05

1.做出按下鍵盤按鍵印出滑鼠所在的座標









#include <GL/glut.h>

#include <stdio.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,0);

    glutSolidTeapot(0.3);

    glutSwapBuffers();

}

void keyboard(unsigned char key, int x, int y)

{

    printf("你按下了 %c 在 %d %d 座標\n", key, x, y);

}

int main(int argc, char**argv)

{

    glutInit( &argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("Week05 keyboard");


    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMainLoop();

}

2.點擊移動















                    將滑鼠當前位置設為oldX、Y
多加
void Mouse(int bitton,int state,int mouseX,int mouseY)
{

    oldX= mouseX; oldY= mouseY;

}

3.茶壺放大縮小


















多加

void motion(int mouseX,int mouseY)

{

    if( mouseX-oldX >0) scale*= 1.01;

    if( mouseX-oldX <0) scale*= 0.99;

    ///x+=(mouseX-oldX); y+=(mouseY-oldY);

    oldX =mouseX;     oldY= mouseY;

    display();

}

2022年3月22日 星期二

圖學筆記Week05

 本週課程內容:keyboard,點擊移動,點擊放大

步驟:進入老師的網站https://jsyeh.org/3dcg10-->下載Win32、data
-->解壓縮data到windows

keyboard

步驟:運用基本10行程式-->增加void keyboard函式(如下圖)-->



點擊移動

步驟:運用基本10行程式-->增加程式(如下圖)


點擊放大

步驟:運用基本10行程式-->增加程式(如下圖)





新手上碌_week05

 主題:移動/旋轉/縮放/矩陣/鍵盤+滑鼠 模仿Maya,Unity的操作畫面

>>>>Rotate在Translate之前:公轉(像是繞著某點在轉)

>>>>Translate在Rotate之前:自轉


##1.按鍵盤同時顯示滑鼠座標

#include <GL/glut.h>

#include <stdio.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,0);

    glutSolidTeapot(0.3);

    glutSwapBuffers();

}

void keyboard(unsigned char key,int x,int y){   unsigned:沒有符號  char:字母

    printf("你按下了 %c 在 %d %d 座標\n",key,x,y);

}

int main(int argc,char**argv)

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week05 keyboard");


    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);///鍵盤控制

    glutMainLoop();

}


>>>有Bug,茶壺會瞬間移動(會從上次滑鼠停留的位置瞬移到新的滑鼠位置)




##2.加入滑鼠控制
glutKeyboardFunc(keyboard);鍵盤事件
glutMouseFunc(mouse);滑鼠控制位置
glutMotionFunc(motion);滑鼠移動
呼叫callBack函式

>>>>在mouse裡修正,讓茶壺開始的位置為上次停止的位置

##3.glScalef(x,y,z);縮放大小

glClearColor(R,B,G);清除背景並已某顏色填滿






week05

                                              主題:移動/旋轉/縮放/矩陣/鍵盤+滑鼠

#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0;
int oldX=0,oldY=0;
void display()
{
    glClearColor(0.5,0.5,0.5,1);///R,G,B,A 其中A半透明功能,目前沒開
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
        glScalef(scale,scale,scale);///都縮放成scale倍
        glColor3f(1,1,0);///黃色的
        glutSolidTeapot(0.3);///茶壺
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
    oldX=mouseX;oldY=mouseY;
}
void motion(int mouseX,int mouseY)
{
    if(mouseX-oldX>0)scale*=1.01;
    if(mouseX-oldX<0)scale*=0.99;
   ///x+= (mouseX-oldX);y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

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








week05

 今天一開始老師像我們介紹電腦圖學之父Ivan Sutherland

然後一樣去https://jsyeh.org/3dcg10/網頁裡下載data和win32

打開transformation.exe後試著調整glScalef的數值


然後開啟codeblocks
貼上之前的程式碼
並且稍作修改,加上keyboard函式

按下鍵盤任一按鍵後,會顯示你按下的鍵和目前滑鼠所在的位置座標

#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,0);///黃色的
    glutSolidTeapot(0.3);///茶壺
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
    printf("你按下了 %c 在 %d %d 座標\n",key,x,y);
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}

然後我們接續剛剛的程式碼
改成keyboard+mouse+motion

#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,0);///黃色的
    glutSolidTeapot(0.3);///茶壺
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse(int button,int state,int x,int y)
{
}
void motion(int x,int y)
{
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

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


之後我們再加上motion的程式碼
讓茶壺能夠跟著滑鼠移動

#include <GL/glut.h>
#include <stdio.h>
float x=0,y=0,z=0;
int oldX=0,oldY=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
        glColor3f(1,1,0);///黃色的
        glutSolidTeapot(0.3);///茶壺
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
}
void motion(int mouseX,int mouseY)
{
    x+= (mouseX-oldX);y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

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

然後我們改良程式碼,讓茶壺不會在滑鼠點下去的時候瞬間移動

並且加上背景顏色的程式碼glClearColor()
#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0;
int oldX=0,oldY=0;
void display()
{
    glClearColor(0.5,0.5,0.5,1);///R,G,B,A 其中A半透明功能,目前沒開
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
        glColor3f(1,1,0);///黃色的
        glutSolidTeapot(0.3);///茶壺
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
    oldX=mouseX;oldY=mouseY;
}
void motion(int mouseX,int mouseY)
{
    x+= (mouseX-oldX);y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

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



然後我們可以透過scale數值來調整茶壺大小

如果往右邊拉,oldX就會大於0,此時我們就把scale*1.01讓茶壺放大
如果往左邊拉,oldX就會小於0,此時我們就把scale*0.99讓茶壺縮小
#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0;
int oldX=0,oldY=0;
void display()
{
    glClearColor(0.5,0.5,0.5,1);///R,G,B,A 其中A半透明功能,目前沒開
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
        glScalef(scale,scale,scale);///都縮放成scale倍
        glColor3f(1,1,0);///黃色的
        glutSolidTeapot(0.3);///茶壺
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
    oldX=mouseX;oldY=mouseY;
}
void motion(int mouseX,int mouseY)
{
    if(mouseX-oldX>0)scale*=1.01;
    if(mouseX-oldX<0)scale*=0.99;
   ///x+= (mouseX-oldX);y+=(mouseY-oldY);
    oldX=mouseX; oldY=mouseY;
    display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week05");

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






爆肝Week05

Week05:移動、旋轉、縮放、矩陣

範例 http://jsyeh.org/3dcg10
1. 下載網頁中的data, win32

2. 將windows解壓縮, data.zip/data丟進解壓縮後的windows資料夾
 3.開啟Translate.exe
    按Alt+S可以交換位移(glTranslatef)與旋轉(glRotatef)
    順序不同,效果也不同

鍵盤事件glutKeyboardFunc()
1.使用先前的茶壺程式碼,加上keyboard函式並利用printf()印出執行的動作
```
#include <stdio.h>///印出用
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 0);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard( unsigned char key, int x, int y )
{
    printf("你按下了%c在 %d %d座標\n", key, x, y);
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMainLoop();
}

```
2-1.加上先前教過的Motion與Mouse函式
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=0, y=0, z=0;
int oldX=0, oldY=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
        glColor3f(1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{
}
void motion(int mouseX, int mouseY)
{
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
```


2-2.在Motion拖曳函式中加上參式與重設座標的公式
```
void motion(int mouseX, int mouseY)
{
    x +=(mouseX-oldX);
    y +=(mouseY-oldY);

    oldX = mouseX;
    oldY = mouseY;

    display();
}
```

2-3.在 mouse函式中設置錨點,去除圖形瞬移的錯誤
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備分矩陣
        glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
        glColor3f(1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{///設置錨點,避免瞬間移動的問題
    oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
    x +=(mouseX-oldX);
    y +=(mouseY-oldY);

    oldX = mouseX;
    oldY = mouseY;

    display();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
```

縮放函式glScalef()

3.加上縮放函式,在motion函式中改寫公式
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0, scale=1.0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備分矩陣
        glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
        glScalef(scale, scale, scale);///x,y,z縮放為 scale倍,維持原有比例
        glColor3f(1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{///重設圖案位置,避免瞬間移動的問題
    oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
    if(mouseX-oldX >0) scale *=1.01;
    if(mouseX-oldX <0) scale -=0.99;///+-百分之一
    
    oldX = mouseX;
    oldY = mouseY;

    display();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
```

未完待續...

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...