Projects for CG Class

Project2: 太陽系

Posted in _ by bizkit4cg on October 13, 2008

Moon

Saturn

GL lighting

GL lighting

實作

  1. 真實公轉角度大多很小(below 15 deg.) 所以乾脆不加角度了
  2. 公轉: 原理非常簡單,用上一個作業的library產生所有星球軌道上的 n 個點的座標 (目前設為先1000),再依據時間與公轉速度決定星球的位置速度是真實的,一秒10天。可以用鍵盤控制停格/加速/減速。
  3. 鍵盤控制位置: XYZ方向移動與XYZ方向旋轉。(鍵盤按鍵:ad,ws,qe / jl,ik,8,)
  4. 鍵盤控制速度: 加速/減速/停格/重置。(鍵盤按鍵: v/c/z/x)

心得

  1. 硬體不夠快,錄影的品質很糟糕。如果把動畫寫成固定的而不是用鍵盤控制,搭配 glGetPixels 函示把 frame dump 出來再 encode 成動畫應該可以克服。
  2. glut 貼 texture 會怪怪的,glu 則沒有遇到問題。
  3. Loading texture 一定不能在 display callback。跟lab1計算座標一樣:應該在init function 做好,再用 glTextureBind 來連結。
  4. 原本星球公轉半徑與星球半徑都用了真實的 data 來畫,但有些星球大小差太多(100X)不方便操作,便稍微調整了幾個星球的半徑跟公轉半徑。
Code:
Advertisements

CG Class Project 1: 2D cartoon figure

Posted in _ by bizkit4cg on October 1, 2008

  • 實作:
  1. 使用的語言為 python 搭配 PyOpenGL 模組,語法與 C/C++ 的 OpenGL library 完全相同。
  2. 以線段逼近橢圓形與圓形,並寫成自己的 function (oval, circle)。function 傳入長短半徑、逼近次數、開始結束角度,回傳一個包含數個 2D 座標的陣列。嘴巴部份也是用這個 function 畫弧線。
  3. 有框線的物件用 GL_LINE_LOOP 與 GL_POLYGON 搭配而成。 (function linedPoly)
  4. 耳朵黃色部份使用自己寫的 function 做平面懸轉。(function D2rotateArray)
  5. 使用 glTranslatef 在不同層面繪圖。
  6. 使用 glRotatef 搭配 glutKeyboardFunc ,使用鍵盤(ad, ws, qe)控制 X, Y, Z 三個方向的旋轉。
  • 心得:
  1. 一開始把計算橢圓圖形的功能與繪圖功能寫在一起,都放在 display callback function 裡。寫玩旋轉之後發現程式反應速度很慢。經過分析後發現時間都花費在計算功能上。所以改將計算功能寫在 myInit() 中,只計算一次,並且把計算結果存在數個陣列中。這樣在 display callback function 不斷的 loop 時,只需要去記憶體中取出算好的座標點,不需要不斷的重覆運算。
  2. 框線是用粗線寬的 GL_LINE_LOOP 做的,效果沒有很好,會看出節點。如果也改成 GL_POLYGON 可能會比較好看。
  • Code:
  1. Main Program: https://bizkit4cg.wordpress.com/project1project1py/
  2. My Library: https://bizkit4cg.wordpress.com/project1libgraphicspy/

 

後來又用現有的架構與 library 寫了個時鐘,比寫卡通人物時容易很多,只改了幾十行 code 就完成了。