Re: [程式] glut轉動問題
看板GameDesign (遊戲設計)作者littleshan (我要加入劍道社!)時間16年前 (2009/05/19 12:13)推噓3(3推 0噓 4→)留言7則, 3人參與討論串4/4 (看更多)
在解釋之前,先有個概念:
「物體的旋轉、移動、放大縮小等全部可以用矩陣運算來表示」
也就是物體的座標在乘上某個矩陣後,就可以得到旋轉、移動、放大縮小的結果。
現在我們來看看這幾個操作...
※ 引述《prjryu (橘)》之銘言:
: 可否詳述call update_mo時
: void update_mo( float angle, float x, float y, float z )
: {
: glPushMatrix();
把目前 OpenGL 正在使用的 matrix 推進一個 stack 中
OpenGL 內部會去管理這個 stack
所以你只要用 push
就會保留現在的座標轉換方式
可以在稍後用 pop 恢復
: glLoadIdentity();
把目前的 matrix 設定為 ideneity matrix
identity 對應到的座標轉換就是「不做任何轉換」
: glRotatef( angle, x,y,z );
把目前的 matrix 乘上 rotation matrix
因為在上一行中,目前的 matrix 是 identity
所以這一行實際作用就是讓現在作用中的 matrix 設定為 rotation matrix
rotation matrix 對應的座標轉換就是「以某個向量為軸旋轉」
: glMultMatrixf(mo); //這行是做什麼?
把目前的 matrix 乘上 mo 這個 matrix
假設前面的 rotation matrix 叫作 R
那麼目前的 matrix 就是 R*mo
R*mo 是什麼意思呢?R 是指旋轉,而 mo 是什麼我們不知道,
但它也是個 matrix,可以進行座標轉換,所以合起來說就是
「先進行旋轉後,再進行 mo 這個座標轉換」
: glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //這行是做什麼?
這行的意思是把目前用的 modelview matrix 存到 mo 裡面
若和上兩行結合起來就是如下的意思:
R = RotationMatrix(angle, x, y, z);
mo = R * mo;
所以整體的意義就是「mo 儲存了某個座標轉換,在經過這些運算後,
mo 除了原本的效果(可能是旋轉平移放大縮小)外,還追加了旋轉的效果」
: glPopMatrix();
上面的運算會影響到 OpenGL 內部使用的 matrix
為了消除這個副作用
就用 glPopMatrix 把它恢復原狀
: glutPostRedisplay();
: }
: 在程式中的運作順序及結果?
: 我看來是這樣:
: push
: ↘
: │glGetFloatv( GL_MODELVIEW_MATRIX, mo ); │
: │glMultMatrixf(mo); │
: │glRotatef( angle, x,y, ); │
: │glLoadIdentity(); │
: └────────────────────┘
: pop(所以執行順序變成)
: glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //把現在的矩陣存到mo
: glMultMatrixf(mo); //把目前的矩陣乘上mo
: glRotatef( angle, x,y, ); //轉角度
: glLoadIdentity(); //回到原來的狀態
: 此處MODELVIEW_MATRIX矩陣和目前的矩陣不一樣的嗎?
: 可以一行一行解釋嗎?
push 和 pop 並不會影響其後指令的執行順序喔
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.151.2
→
05/19 14:03, , 1F
05/19 14:03, 1F
推
05/20 22:30, , 2F
05/20 22:30, 2F
推
05/20 22:37, , 3F
05/20 22:37, 3F
推
05/21 04:51, , 4F
05/21 04:51, 4F
→
05/21 14:30, , 5F
05/21 14:30, 5F
→
05/22 00:37, , 6F
05/22 00:37, 6F
→
05/22 00:38, , 7F
05/22 00:38, 7F
討論串 (同標題文章)
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章
29
43