2013年12月17日 星期二

[openGL] 公轉與自轉

以下介紹內容直接用太陽系的概念,所以誰繞誰轉,誰要自轉就不解釋了 XD

[一] 公轉


1.    目的: 物體或模型繞著某個點轉 (通常是原點)

2.    想法: 在 openGL 的函式庫中,glRotate*() 是繞著原點轉的,所以我們應該先計算

      出將太陽移動至原點的距離,而後讓整個太陽系的所有物體都依照這個距離移動,

      再讓地球旋轉,最後再將物體移回原來的位置

      (p.s) 測試過後,openGL 的 rotate 並不會像之前實作一樣讓整個單位向量跑掉,所以可以這樣做

3.    pseudo code:

// 畫地球
      glPushMatrix();
      glTranslate(dx, dy, dz);
      glRotate(angle, ...);
      glTranslate(-dx, -dy, -dz);
      ... draw earth ...
      glPopMatrix();

//畫月亮
      glPushMatrix();
      glTranslate(dx2, dy2, dz2);
      glRotate(angle, ...);
      glTranslate(-dx2, -dy2, -dz2);
      ... draw moon ...
      glPopMatrix();

//畫太陽
      ... draw sun ...

      //dx, dy, dz 是將 sun 移動到原點各方向所需要的距離
      //dx2, dy2, dz2 是將 earth 移動到原點各方向所需要的距離

[二] 自轉


1.    目的: 物體或模型繞著某個點轉 (通常是自己的中心點)

2.    想法: 用跟上面一樣的概念,所以要自轉的物體,一樣要先旋轉的中心點移動到坐標系中

       的原點處,而後旋轉在移回原來的位置

3.    pseudo code:

// 讓地球又公轉又自轉
      glPushMatrix();
      glTranslate(dx, dy, dz);
      glRotate(angle, ...);
      glTranslate(-dx, -dy, -dz);
      glTranslate(dx2, dy2, dz2);
      glRotate(angle, ...);
      glTranslate(-dx2, -dy2, -dz2);
      ... draw earth ...
      glPopMatrix();

      //dx, dy, dz 是將 sun 移動到原點各方向所需要的距離
      //dx2, dy2, dz2 是將 earth 移動到原點各方向所需要的距離

沒有留言:

張貼留言