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

2018年1月2日 星期二

abcqq week 06

1.打光

相關程式碼:

glutCreateWindow(...); //開視窗

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING); //打光程式1
glEnable(GL_LIGHT0); //打光程式2
glLightfv(GL_LIGHT0, GPOSITION, pos); 


keyboard 副程式

void keyboard(unsigned char key, int x, int y)
{
    printf("now: %c (%d %d)\n", key, x,y);
    if(key=='1') rotateX++;
    if(key=='2') rotateY++;
    if(key=='3') rotateZ++;
    glutPostRedisplay(); //畫面重新 re-display
}

滑鼠控制  

void mouse(int button, int state, int x, int y)
{   printf("button:%d state:%d (%d %d)\n", button, state, x, y);
    
    if(state==GLUT_DOWN) 
    {
        oldX=x; oldY=y;
    }
}

滑鼠拖曳
void motion(int x, int y)
{
    rotateY +=   -(x-oldX);
    rotateX +=   -(y-oldY);
    oldX=x; oldY=y;
    glutPostRedisplay();
}


2017年12月7日 星期四

陳陞凱的計圖筆記WEEK06

打開上次的week05


並加上以下幾行 在程式中:

GLfloat pos[]={0.0, 0.0, -1.0, 0.0}; //打光(3)
glEnable(GL_DEPTH_TEST); //3D深度測試,打開Enable
glEnable(GL_LIGHTING); //打光(2),打開Enable
glEnable(GL_LIGHT0); //打光(1),打開Enable
glLightfv(GL_LIGHT0, GL_POSITION, pos);

2017年10月26日 星期四

[耍費]WEEK6

1.至moodle下載codeblockMinGw、freeglut、week5.zip
2.安裝及解壓縮,把codeblock的Compiler的c++11的勾拿掉
3.編譯並執行week5.cbp之後,應該如下

4.至http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/  下載soure.zip檔並解壓縮
5.用notepad++開啟transformatiom.c
6.用ctrl+F開啟搜尋
7.找到
    glEnable(GL_LIGHT0);

    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_POSITION, pos);
//第一個參數是指定要改變光源屬性的光源 
//在Windows下有八個光源可用,分別是GL_LIGHT0~GL_LIGHT7
//第二個參數指定要修改的是3種光
//環境光(Ambient Light)、散射光(Diffuse Light)、反射光(Specular Light) 的哪一種 
//第三個參數放入一個陣列的指標(就是陣列的名字) 
//陣列中有4個數,代表RGBA顏色值 
    glEnable(GL_DEPTH_TEST);
//OpenGL在繪製的時候就會檢查,當前像素前面是否有別的像素
//如果別的像素擋道了它,那它就不會繪製,也就是說,OpenGL就只繪製最前面的一層。

放到
    glutDisplayFunc(display);

    glutMainLoop();
之間
再將GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 };放到全域變數//光源的位置

8.執行結果





9.glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMotionFunc(motion);

Mengting計圖筆記Week06 - Lighting

編譯上週Transformation程式(注意Compiler-Setting v.s. strdup())作業二: Keyboard, Mouse, 轉動, 移動


編譯上週Transformation程(注意Compiler-Setting v.s. strdup())

1. 至課程網址下載以下檔案: sourcedatawin32glut32.dll
2. 將win32解壓縮,並把glut32.dll檔案及data資料夾(內含obj檔)放至該資料夾中。
3. exe檔可成功執行!

下載week05範例程式會出現的問題
Q1. 可能編譯不成功,找不到glut檔?
A1. 使用notepad++開啟專案,並以檔案總管確認freeglut資料夾的路徑之相符。
Q2. strdup()的地方出現error?
A2. 至Setting-Compiler取消勾選。

打光

1. 一開始的week05程式,編譯成功後執行結果如下。

2. 將一開始下載的source code解壓縮,開啟transformation.c,並搜尋關鍵字"light"尋找打光相關程式碼。

(待編輯)

40247009S_week6

下載week05的專案並執行,結果只有白色的輪廓需要加入光源並開啟深度,程式碼如下:

GLfloat pos[] = {0.0, 0.0, -1.0, 0.0}; // 光點位置
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");
    
    glEnable(GL_DEPTH_TEST);  // 開啟深度
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, pos); // 打光
    
    glutDisplayFunc(display);
    glutMainLoop();
}


接下來鍵盤和滑鼠控制,程式碼如下:


void keybord(unsigned char key, int x, int y)                                           
  {                                                                                                               
      if(key == '1') rotateX++;
      if(key == '2') rotateY++;
      if(key == '3') rotateZ++; //按123分別轉動XYZ軸

      glutPostRedisplay();

  } 

  void mouse(int buttom, int state, int x, int y)
{
    if(state == GLUT_DOWN)
    {
        oldX = x; oldY = y; 按下滑鼠時記錄當下滑鼠座標
    }
}

void motion(int x, int y)
{
    rotateX += (y-oldY);
    rotateY += (x-oldX);
    oldX = x; oldY = y;   // 按下滑鼠移動時轉動XY軸

    glutPostRedisplay();
}   

double rotateX = 0, rotateY = 0, rotateZ = 0; //全域變數

void display()  
{                      
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
                               
    glPushMatrix();  
        glRotatef(rotateX, 1, 0, 0);  //X軸旋轉rotateX度
        glRotatef(rotateY, 0, 1, 0);  //Y軸旋轉rotateY度  
        glRotatef(rotateZ, 0, 0, 1);  //Z軸旋轉rotateZ度
        drawmodel();  
    glPopMatrix();
                              
    glutSwapBuffers();  

}

另外在main裡面需要開啟滑鼠和鍵盤的監聽,加入以下程式碼:

glutKeyboardFunc(keybord); // 鍵盤監聽
glutMouseFunc(mouse);  // 滑鼠按鍵監聽
glutMotionFunc(motion); // 滑鼠移動監聽

  

2017年10月25日 星期三

陳映羽的圖學WEEK06

1.用PAD++打開,更改路徑(DESKTOP)
2.將第二個編譯器勾掉
3.未打光的樣子
4.加入打光程式碼
5.打光的樣子
6.加入鍵盤、滑鼠function
7.用鍵盤下指令print出滑鼠的座標

8.完成滑鼠function

9.用滑鼠按下與放開下指令print出滑鼠所在的目標
(0按下 1放開)

2017年10月23日 星期一

俊隆ㄉ計算機圖學筆記 - Week 6 Lighting

- 開啟光源
glEnable(GL_DEPTH_TEST); // 3D深度測試開啟
glEnable(GL_LIGHTING); //根據當前光源計算顏色
glEnable(GL_LIGHT0); //開啟光源i
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glDisable(GL_LIGHTING); //關閉光源
glLightfv()的用法可參考:http://blog.csdn.net/chy19911123/article/details/46413121

- 繼 week 4的 Project setting,
加入
GLfloat pos[] = {0.0, 0.0, -1.0, 0.0}; //Light position
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");
    //light
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    //light end
    glutDisplayFunc(display);
    glutMainLoop();
}

- Add Mouse and Keyboard control.
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);

- 實作鍵盤滑鼠旋轉角度
int rotateX = 0, rotateY = 0, rotateZ = 0;
int oldX = 0, oldY = 0;
void keyboard(unsigned char key, int x, int y)
{
    if(key == '1') rotateX+=1;
    if(key == '2') rotateY+=1;
    if(key == '3') rotateZ+=1;
    glutPostRedisplay();
}
void motion(int x, int y)
{
    rotateY += -(x- oldX);
    rotateX += -(y- oldY);
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    if(state == GLUT_DOWN)
    {
        oldX = x;
        oldY = y;
    }
}






















2017年10月22日 星期日

詠銓_Week06_Note

Class:Lighting

1.從moodle下載week05的專案,執行後可知道會出現一個全白的圖。


2.接著打開Transformation的source code,搜尋light的相關程式碼,將其複製到此專案檔。執行


3.我們可以看到此執行解果破圖了,於是將原始碼的深度測試複製進來,執行後發現沒有畫面,這是因為此圖是背對著你,而光從前面打,所以改變打光的位置,變成從後面打,就可以出現一個背對著我們的人物了。


 Note:                                        
   a.打光程式碼如下:                 
      GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 }; //打光的位置
      glEnable(GL_LIGHTING);
      glEnable(GL_LIGHT0);     
      glLightfv(GL_LIGHT0, GL_POSITION, pos);
   b.深度測試程式碼:                
      glEnable(GL_DEPTH_TEST);



Class: Keyboard

1.接著引入鍵盤控制,為了確認程式可以收到我們的輸入,我們在副程式中將鍵盤的輸入顯示於螢幕(包含此時滑鼠的座標)。
 Note:                                        
   a.鍵盤控制程式碼如下:         
      glutKeyboardFunc(keybord);// glut的鍵盤控制,連結到keyboard副程式  
      keyboard(unsigned char key, int x, int y)// 副程式,裡面決定了鍵盤輸入時對應的動作  
   b.此時副程式中的內容為printf("%c (%d, %d)\n", key, x, y);所以可以如圖印出輸入及座標  

2.接著我們將副程式的內容更改為:
    輸入'1'時,繞著x軸轉
    輸入'2'時,繞著y軸轉
    輸入'3'時,繞著z軸轉
此時副程式如下:
  void keybord(unsigned char key, int x, int y)                                           
  {                                                                                                               
      if(key == '1') rotateX++;//輸入1時,rotateX加1
      if(key == '2') rotateY++;//輸入2時,rotateY加1
      if(key == '3') rotateZ++;//輸入3時,rotateZ加1
      glutPostRedisplay();//重畫
  }        
void display()  
{                      
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
                               
    glPushMatrix();  
        glRotatef(rotateX, 1, 0, 0);//對X軸旋轉rotateX
        glRotatef(rotateY, 0, 1, 0);//對Y軸旋轉rotateY  
        glRotatef(rotateZ, 0, 0, 1);//對Z軸旋轉rotateZ
        drawmodel();  
    glPopMatrix();
                              
    glutSwapBuffers();  
}
 Note:                                        
   a.rotateX, rotateY , rotateZ 為全域變數,可以讓我們在輸入時在對應軸作旋轉  
   b.但是程式並不能及時轉動,所以要在最後加glutPostRedisplay(); 讓系統重畫圖形  
   c.此時會動到圖形的座標,所以在display副程式中加入glPushMatrix(); glPopMatrix(); 

3.只要更動副程式,我們就可以得到我們想要的各種鍵盤控制


Class: Mouse

1.接著是滑鼠控制,滑鼠控制與鍵盤控制大同小異,我們一樣是呼叫函式且寫個可以讓我們確認輸入的副程式,如圖

 Note:                                        
   a.滑鼠控制程式碼如下:         
      glutMouseFunc(mouse);// glut的滑鼠控制,連結到mouse副程式  
      mouse(int buttom, int state, int x, int y)// 副程式,裡面決定了滑鼠輸入時對應的動作  
   b.此時副程式中的內容為printf("bottom = %d, state = %d, (%d, %d)\n", buttom, state, x, y);所以
      可以如圖印出輸入座標、左右中鍵及當時狀態  

2.跟鍵盤控制不同的是,如果我們要依照滑鼠的動作而有對應的效果,我們需要再多呼叫一個副程式glutMotionFunc(motion); ,此副程式可以在滑鼠有動作時執行相應的效果

3.接著我們用這兩個副程式達到下面的效果
    壓下滑鼠橫向滑動時,圖形繞著Y軸轉
    壓下滑鼠縱向滑動時,圖形繞著X軸轉
程式碼如下:
void mouse(int buttom, int state, int x, int y)
{
    if(state == GLUT_DOWN)//當壓下滑鼠按鍵
    {
        oldX = x; oldY = y;//設定舊座標為此時座標
    }
}

void motion(int x, int y)
{
    rotateY += -(x-oldX);//對著Y軸旋轉滑鼠的橫向移動量
    rotateX += -(y-oldY);//對著X軸旋轉滑鼠的縱向移動量
    oldX = x; oldY = y;//設定舊座標為此時座標
    glutPostRedisplay();//重畫
}
 Note:                                        
   a.rotateX, rotateY rotateZ 一樣為全域變數,可以讓我們在對應軸作旋轉  
   b.但是程式並不能及時轉動,所以一樣要在最後加glutPostRedisplay(); 讓系統重畫圖形  
   c.此時會動到圖形的座標,所以在display副程式中加入glPushMatrix(); glPopMatrix(); 
   d.經過測試後發現圖背對我們應該是座標相反了,所以在移動量那邊加負號,才會如期轉動

2017年10月21日 星期六

俊凱的Week06筆記

1.開啟week05專案檔
2.新增打光功能
    glEnable(GL_LIGHTING);//打光
    glEnable(GL_DEPTH_TEST);//3D深度偵測
    glEnable(GL_LIGHT0);//打光
    glLightfv(GL_LIGHT0,GL_POSITION,pos);//設定打光位置
3.新增鍵盤控制,滑鼠控制,產生動畫
float rotateX=0,rotateY=0,rotateZ=0;
void keyboard(unsigned char key, int x, int y)
{
    printf("now: %c ( %d %d )\n", key, x, y);
    if(key=='x')rotateX++;//X軸旋轉
    if(key=='y')rotateY++;//Y軸旋轉
    if(key=='z')rotateZ++;//Z軸旋轉
    if(key=='e')rotateX=0,rotateY=0,rotateZ=0;
    glutPostRedisplay();
}
int oldX=0, oldY=0;
void mouse(int button, int state, int x, int y)
{
    printf("Button: %d  State: %d  ( %d %d )\n", button, state, x, y);
    if(state==GLUT_DOWN)//按下按鍵
    {
        oldX = x;
        oldY = y;
    }
}
void motion(int x, int y)//執行動畫
{
    rotateY += -(x-oldX);//Y方向轉動
    rotateX += -(y-oldY);//Y方向轉動
    oldX = x;//更新座標
    oldY = y;//更新座標
    glutPostRedisplay();
}

楊喻文的學習手札 20171019

week06

打光

事前提要:
1. 要注意電腦上的codeblocks上面是有裝圖學要用的MinGW編譯環境,並且將相關設定都設好

複習:

複習上周的移動轉動縮放的各種exe檔,以及遇到錯誤時應該如何處理
還有如何自己做出一個和範例檔一樣的執行檔出來


打光

打開上周的week05.cbp,
會看到原本只有三大函式(左),而原本結果也是一張黑底白圖(右)而已
     

現在要把它變成有顏色的模型

首先先加上兩行程式碼(打光=>LIGHT)
可以加在display()中(但是因為會每一次畫的時候重複執行,所以會比較慢一點),也可以加在main()中
    glEnable(GL_LIGHTING);//偷來的打光 這是整個的打光效果
    glEnable(GL_LIGHT0);//偷來的打光 整個只會打在第0盞 (有很多盞可以開)
    glLightfv(GL_LIGHT0, GL_POSITION, pos);  //這是打光位置 浮點數 向量    
    GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 }; //這個要宣告在main()外面

結果執行結果是殘缺的QAQ


原因是沒有遠近(深度)、前後等等關係
glEnable(GL_DEPTH_TEST);  //這行是3D深度測試, 打開Enable

然後再執行一次,就有完整的背影了!!!

➧但是為什麼可以這樣用深度測試呢?
因為在之前的程式碼中,這行⇩原本就有幫深度準備好buffer記憶體了
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
然後還有這行⇩會清深度的buffer使繪圖能正確
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

現在要加滑鼠互動拉~

先在main()中加上:
    glutMouseFunc(mouse); //這是控制滑鼠
    glutMotionFunc(motion); //可以讓滑鼠有拖曳 mouse motion (dragging)

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

再來一步步寫一下這三個的函式:
➤首先是鍵盤
int rotateX=0, rotateY=0, rotateZ=0; //這是個軸旋轉值,一開始設為0
void keyboard(unsigned char key, int x, int y)
//key是指你輸入的字是甚麼,x和y則是現在位置在哪裡
{
    printf("now: %c (%d %d)\n", key, x,y); //註一
    if(key=='1') rotateX++; //如果我輸入1,旋轉軸x會增加
    if(key=='2') rotateY++;
    if(key=='3') rotateZ++; //註二
    glutPostRedisplay(); ///這行就是我按一個鍵她就會馬上重跑一次不會卡卡
         //如果想要讓他也可以反向旋轉,可以再加上4 5 6然後用--
}

註一:
我剛剛在圖中標a的點上用鍵盤輸入了一個a,然後黑框框中就出現a和滑鼠的現在位置;b也是

註二:
為了測試這三行的效果(但是無論如何還是要做),我們搬出上周教的⇙放在diaplay()
    glPushMatrix();
        glRotatef(rotateX, 1,0,0);
        glRotatef(rotateY, 0,1,0);
        glRotatef(rotateZ, 0,0,1);
        drawmodel();
    glPopMatrix();
執行後,在我狂按了一堆1後,可以清楚明顯的看到框框中的物體旋轉了!


再來是滑鼠
int oldX=0, oldY=0; //一開始old應該要設定沒有值
void mouse(int button, int state, int x, int y)
//button是決定滑鼠的左鍵右鍵,state決定是往上還是往下 註一
{
    printf("button:%d state:%d (%d %d)\n", button, state, x, y);
    //把大象放到冰箱去: (1) 把冰箱門打開, (2) 把大象放進去, (3) 把冰箱門關起來
    //mouse drag: (1) mouse down, (2) drag, (3) mouse up
    if(state==GLUT_DOWN) //如果滑鼠往下,我要開始拖曳
    {
        oldX=x;
        oldY=y;
    }

}


註一
當button=0的時候表示我按左鍵,2的時候表示我按右鍵
當state=0得時候表示我按下滑鼠(往下),1的時候表示滑鼠案件放開(往上)


➤最後是滑鼠拖曳
void motion(int x, int y) //這個就是滑鼠拖曳要用的
{
    rotateY +=  -(x-oldX);
    rotateX +=  -(y-oldY);
    oldX=x; oldY=y;
    glutPostRedisplay();
}

有了motion之後,就可以看到我只要按著滑鼠,拉,放開,他就可以拖曳很多了


作業:
作業是要自己做出個可以移動旋轉的物體
然後要錄成影片~可以有介紹文=D

--------------------------------------------------------------------------------------------------------
其他備註:

*原本打光應該要這樣寫:


glEnable(GL_LIGHTING);  //要有開燈
glPushMatrix();
glMultMatrixd(inverse);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glPopMatrix();
drawmodel();
glDisable(GL_LIGHTING); //然後關燈
應該每一次要用都要打開關起來,不過我們好像不要這麼麻煩,打開就不要關了

*中間老師講了一些關於系統程式的東西,有點多所以直接附上影片網址😇


https://www.facebook.com/jsyeh.org/videos/oa.125234311517581/1752149428131206/?type=3














2017年10月19日 星期四

Claire's Note #6

WEEK06

Topic:

  1. 複習上週主題
  2. 編譯上週Transformation程式
  3. 打光Lighting
  4. 作業:利用mouse / keyboard實作

A. 複習上週主題 & 編譯上週Transformation程式

STEP 1: 開啟範例模型執行檔(Transformation)



STEP 2: 開啟 & 編譯範例程式碼(Transformation)

去除顏色與打光

*若無法編譯,點選Setting - Compiler,取消選取C++11



B. 開啟Lighting(打光)

STEP 1: 開啟範例程式碼

STEP 2: 加入打光功能

STEP 3: Result



C. 加入keyboard、mouse函式

STEP 1: keyboard()

void keyboard(unsigned char key, int x, int y)
{
    printf("now: %c (%d, %d)\n", key, x, y);//列印出鍵盤輸入key,與游標位置(x, y)
}

STEP 2: mouse()

void mouse(int button, int state, int x, int y)
{
    printf("button:%d state:%d (%d, %d)\n", button, state, x, y);
    //button:滑鼠左(0)、中(1)、右鍵(2)
    //state:按下GLUT_DOWN(0)、放開GLUT_UP(1)
    //游標位置(x, y)
}

STEP 3: 利用mouse()與keyboard()旋轉圖形


STEP 4: