作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題[問題] OpenGL 矩陣問題
時間Mon Jun 14 18:16:09 2010
我現在寫一個簡單的Redner Lib想給使用者用
他必須在Draw函式和Update函式手動寫上RenderManager.Draw和RenderManager.Update
我希望每個frame都loadidenity清除所有rotate 和 translate矩陣
但使用者會這樣下旋轉指令
Obj.RotateX(x);
x++;
最後會呼叫RenderManager.Draw();
但Draw裡面會去loadidentity 問題就 把使用者下的給清掉了
為了克服這問題
現在是 先用一個一開始是identity矩陣:UserMat *使用者下的指令
最後World矩陣*UserMat後
UserMat在Draw函式最後把他清成identity.
使用者他就可以傳x然後x++這樣....每個frame都看似正常
但突然使用者不想要這物體動了 他就"不"呼叫Obj.Rotate(x);
尷尬了 我上一個frame把她清成identity 導致物體轉回原本沒轉的狀態(希望是停住)
想不到該怎麼克服這點
除非"規定"使用者 要停 不是不呼叫Rotate 而是照樣呼叫 但x不用++
或是整個架構改成
我不要清成identity了
使用者下什麼指令 我就直接*= 我的World矩陣
但這樣又會變成 使用者必須被迫 要變成Obj.Rotate(1);
感覺也很怪
畢竟之前寫OPENGL都是每個frame都先把ModelView清成identity....
雖然不知兩者有什麼利弊 但想請教各位我該怎麼解這問題
如果是一般遊戲引擎 是怎麼做的??他提供給使用者也是可以傳x++而不想動 就不用呼叫
了嗎??
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.64.222
→ visor:你的 object 可以做到把最後 rotate 的值存起來吧 ?? 06/14 18:25
推 VictorTom:個人覺得讓使用者自己loadIdentity比較簡單, 需要load時 06/14 18:43
→ VictorTom:user就自己call需要做的事; 至於需不需要每個frame都要 06/14 18:44
→ VictorTom:loadIdentity則是by design....@_@" 06/14 18:44
→ QQ29:所以我應該使用他下啥我就一直*= 06/14 19:10
→ QQ29:要不要identity 就交由使用者自己決定嗎 06/14 19:11
→ QQ29:我只要包好 Rotate三軸和Translate這兩個函式即可 06/14 19:11
推 Bencrie:OpenGL不就這麼做嗎 XD? 06/14 20:15
→ QQ29:如果我希望使用者還是可以下 x++這樣 我該怎麼設計呢 06/14 20:38
→ QQ29:我怎麼想都變成使用者只能傳(1)...傳x++會越轉越快邏輯不對~ 06/14 20:39