[一] 公轉
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 移動到原點各方向所需要的距離
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 移動到原點各方向所需要的距離
沒有留言:
張貼留言