Re: [程式] glut轉動問題

看板GameDesign (遊戲設計)作者 (橘)時間16年前 (2009/05/18 07:02), 編輯推噓4(408)
留言12則, 5人參與, 最新討論串3/4 (看更多)
※ 引述《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

05/18 08:11, , 1F
opengl就是這點很鳥囧rz...建議你
05/18 08:11, 1F

05/18 08:11, , 2F
一行一行試試看 看拿掉會有什麼結果
05/18 08:11, 2F

05/18 08:14, , 3F
pop 跟push 搞清楚他是幹嘛的
05/18 08:14, 3F

05/18 12:37, , 4F
push跟pop對目前在OpenGL裡的矩陣(你看不到)做動作
05/18 12:37, 4F

05/18 13:00, , 5F
總覺得是線性代數的問題 囧..
05/18 13:00, 5F

05/19 00:58, , 6F
它的pushMatrix跟popMatrix只對目前所使用的矩陣..
05/19 00:58, 6F

05/19 01:00, , 7F
所以push就等於暫存一份起來 之後loadidentity蓋掉matrix
05/19 01:00, 7F

05/19 01:01, , 8F
作下面幾行運算最後得到我們要的東西後 再把剛剛push的
05/19 01:01, 8F

05/19 01:01, , 9F
matrix再pop回來
05/19 01:01, 9F

05/19 07:39, , 10F
補充一下 所以pop就是把上一個push"之前"的matrix取回
05/19 07:39, 10F

05/19 14:05, , 11F
我是想push pop應該是data structure的東西 應該不用講XD
05/19 14:05, 11F

05/21 04:53, , 12F
恩 資料結構沒問題
05/21 04:53, 12F
文章代碼(AID): #1A49UXnU (GameDesign)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 3 之 4 篇):
文章代碼(AID): #1A49UXnU (GameDesign)