作者prjryu (橘)
看板GameDesign
標題Re: [程式] glut轉動問題
時間Mon May 18 07:02:53 2009
※ 引述《NDark (K1下次要買搖滾區)》之銘言:
: ※ 引述《prjryu (橘)》之銘言:
: : 在寫程式的過程我不斷遇到對單一軸旋轉另兩軸跟著轉的問題
: : 也就是 glRotatef( angle, x,y,z ); 這個函數
: : 轉glRotatef( 90, 1,0,0 ); 後,y軸和z軸 也一起對x軸轉了九十度
: : 所以之後y z的轉動就不是原本坐標軸的y和z了。
: : 上次發問後有個人推薦我去看一篇為平衡環鎖的文章
: : http://www.programmer-club.com.tw/ShowSameTitleN/opengl/2000.html
: : 以上為網址,照跑出來的的確是我想要的結果,但我看不太懂。
: : void init_mo()
: : {
: : memset( mo, 0, sizeof(mo) );
: : mo[0]=mo[5]=mo[10]=mo[15]=1;
: : glutPostRedisplay();
: : }
: : 這個函數的作用? 為什麼這樣寫?
: : void update_mo( float angle, float x, float y, float z )
: : {
: : glPushMatrix();
: : glLoadIdentity();
: : glRotatef( angle, x,y,z );
: : glMultMatrixf(mo); //這行是做什麼?
: : glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //這行是做什麼?
: : glPopMatrix();
: : glutPostRedisplay();
: : }
: : ------------------------------------------------------
: : 或是有什麼其他的解決方法也請多指教,
: : 希望可以指教的詳細一點,拜託大家了。
: 簡單來講.你要的就是一個簡單的trackball.也就是上述mo的實作.
: Trackball原本的功用就是依照目前滑鼠拖拉的方向算出轉軸,
: (以你的case就是你認為的世界座標系)
: 然後把旋轉乘入目前trackball的狀況(矩陣)來達到新的結果.再存回trackball
: 複雜一點的trackball實作就是一個簡易的3D編輯軟體,
: 可以對空間中的任一物件做三軸旋轉.
: google "opengl trackball"第三個link
: Implementing a Virtual Trackball
: http://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html
: 中 "We need to apply the rotation as the last transformation" 的部份
: 是不是跟mo的寫法很類似?
可否詳述call update_mo時
void update_mo( float angle, float x, float y, float z )
{
glPushMatrix();
glLoadIdentity();
glRotatef( angle, x,y,z );
glMultMatrixf(mo); //這行是做什麼?
glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //這行是做什麼?
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矩陣和目前的矩陣不一樣的嗎?
可以一行一行解釋嗎?
--
郵差又來送羊奶了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.149.185
推 darkflier:opengl就是這點很鳥囧rz...建議你 05/18 08:11
→ darkflier:一行一行試試看 看拿掉會有什麼結果 05/18 08:11
推 darkflier:pop 跟push 搞清楚他是幹嘛的 05/18 08:14
推 Bencrie:push跟pop對目前在OpenGL裡的矩陣(你看不到)做動作 05/18 12:37
→ Splash5:總覺得是線性代數的問題 囧.. 05/18 13:00
推 Splash5:它的pushMatrix跟popMatrix只對目前所使用的矩陣.. 05/19 00:58
→ Splash5:所以push就等於暫存一份起來 之後loadidentity蓋掉matrix 05/19 01:00
→ Splash5:作下面幾行運算最後得到我們要的東西後 再把剛剛push的 05/19 01:01
→ Splash5:matrix再pop回來 05/19 01:01
→ killman:補充一下 所以pop就是把上一個push"之前"的matrix取回 05/19 07:39
→ Splash5:我是想push pop應該是data structure的東西 應該不用講XD 05/19 14:05
→ prjryu:恩 資料結構沒問題 05/21 04:53