Re: [問題] OpenGL 選特定物件配合按鍵移動問題

看板C_and_CPP (C/C++)作者 (是人心在動...)時間16年前 (2010/05/13 17:25), 編輯推噓4(4037)
留言41則, 3人參與, 最新討論串2/3 (看更多)
: 查了一下用按鍵控制似乎是對整個openGL所畫的物體做反應 : 比方說按方向鍵→ , : 若程式設定為向右移,假設裡面有一個茶壺 和一個方塊 : 則茶壺和方塊皆往右移 : : 但如果想要只讓某特定物件作移動或旋轉, : 該怎麼辦呢? : : 是用 glMatrixMode(GL_MODELVIEW); : glLoadIdentitt(); : 指定當前的model : : 但是按鑑按下去怎麼知道是我只讓"此model" 作反應呢? : : ps.我是用BCB寫的 感謝 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 60.249.246.54 : 推 QQ29:glPushMatrix 和 glPopMatrix 要夾著 你的model矩陣 05/13 16:36 : → QQ29:當移動玩茶壺 pop原來的modelview 在畫 另一物體 05/13 16:36 : → capucino:不好意思,我指的是假設我的model都已經畫定位了 05/13 17:04 : 推 QQ29:就是這樣阿 你當然要自己在idle function作一些紀錄 05/13 17:06 : → QQ29:每次的重畫 都是從 原來位置 作translate rotate 05/13 17:07 : → QQ29:你都使用同一個 model矩陣 當然物體會一起 動阿 05/13 17:09 //比方說這裡是畫物件的funtion void __fastcall TFormMain::DrawObjects() { glMatrixMode(GL_MODELVIEW); glLoadIdentity();//載入單位矩陣 glTranslatef(50.0f,50.0f,0.0f); glutSolidTeapot(10.0f);//畫茶壺1 glColor3f(1.0f,1.0f,0.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity();//載入單位矩陣 glTranslatef(100.0f,100.0f,0.0f); glutSolidTeapot(20.0f);//畫茶壺2 } //下面是我按方向鍵位移的function void __fastcall TFormMain::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key == VK_UP) glTranslatef(0.0f, 5.0f,0.0f); if(Key == VK_DOWN) glTranslatef(0.0f, -5.0f, 0.0f); if(Key == VK_LEFT) glTranslatef(-5.0f, 0.0f, 0.0f); if(Key == VK_RIGHT) glTranslatef(5.0f, 0.0f, 0.0f); } 那我該怎麼指名讓茶壺1 或 茶壺2 移動呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.249.246.54

05/13 17:42, , 1F
開一組變數: x, y, 在VK_UP時y+=5.0f; 以此類推....
05/13 17:42, 1F

05/13 17:42, , 2F
然後看你是要把xy用在壺1還是壺2, 直接translate(x, y,
05/13 17:42, 2F

05/13 17:43, , 3F
0) // 如果z不打算變化的話; 要控制壺1和壺2全憑你自己
05/13 17:43, 3F

05/13 17:43, , 4F
設計, 當然x, y也要先給適當的初值.
05/13 17:43, 4F

05/13 17:44, , 5F
另外, 你畫茶壺前都LoadIdentity又單獨translate固定常
05/13 17:44, 5F

05/13 17:44, , 6F
數, 基本上你再怎麼按茶壺都不會動吧?? 不然就是有相關
05/13 17:44, 6F

05/13 17:45, , 7F
的code你沒有貼上....
05/13 17:45, 7F

05/13 17:49, , 8F
我是從BCB example 裡的 (opengl)glskel.cpp 改的
05/13 17:49, 8F

05/13 17:50, , 9F
裡面的按鍵 function是這樣 也就是我按上下左右
05/13 17:50, 9F

05/13 17:51, , 10F
原本的範例是按上下左右會所有圖形一起動
05/13 17:51, 10F

05/13 17:52, , 11F
不過改成我的畫茶壺之後就沒反應了,奇怪
05/13 17:52, 11F

05/13 17:54, , 12F
不奇怪啊, 我上面不是說了, 你兩個壺都先對ModelView做
05/13 17:54, 12F

05/13 17:55, , 13F
LoadIdentity, 然後自己Translate常數, 這樣你在
05/13 17:55, 13F

05/13 17:55, , 14F
KeyDown裡下的translate就基本上沒作用(or不知道會做用
05/13 17:55, 14F

05/13 17:56, , 15F
在什麼鬼上XD) 所以我上面也推覺得你貼的code應該怎麼按
05/13 17:56, 15F

05/13 17:56, , 16F
都不會動....@_@"
05/13 17:56, 16F

05/13 17:57, , 17F
給你的簡單的方向改到一個會動一個不會動好了....
05/13 17:57, 17F

05/13 17:57, , 18F
請問V大該如何修改,可以按上下左右全部一起動呢?
05/13 17:57, 18F

05/13 17:58, , 19F
宣告兩個global變數: float x=50.0f, y=50.0f;
05/13 17:58, 19F

05/13 17:58, , 20F
一個會動 一個不會動太難了@@
05/13 17:58, 20F

05/13 17:58, , 21F
把畫茶壺1上面那個 glTranslatef(50.0f,50.0f,0.0f);
05/13 17:58, 21F

05/13 17:59, , 22F
改成 glTranslatef(x, y, 0.0f);
05/13 17:59, 22F

05/13 17:59, , 23F
然後KeyDown裡, 的translate全部拿掉....
05/13 17:59, 23F

05/13 18:00, , 24F
換成 if UP, y+=5.0f; else if DOWN, y-=5.0f;
05/13 18:00, 24F

05/13 18:00, , 25F
if LEFT, x+=5.0f, if RIGHT, x-=5.0f;
05/13 18:00, 25F

05/13 18:01, , 26F
(上面的if UP/DOWN等code請自己寫成正確的語法XD)
05/13 18:01, 26F

05/13 18:01, , 27F
然後應該就可以只對壺1做移動了....
05/13 18:01, 27F

05/13 18:02, , 28F
至於為什麼, code怎麼寫才會聽你的控制, 請自己比較
05/13 18:02, 28F

05/13 18:02, , 29F
BCB的example, 你改過的code, 我改過的code的差別....
05/13 18:02, 29F

05/13 18:02, , 30F
當然, 最好是能乖乖的找本書從頭慢慢學起, 如果你需要
05/13 18:02, 30F

05/13 18:02, , 31F
OpenGL當你的工具的話....:)
05/13 18:02, 31F

05/13 18:03, , 32F
感謝V大~~~~~
05/13 18:03, 32F

05/13 20:19, , 33F
我覺得你畫一個物體就identity一次 modelview很不好
05/13 20:19, 33F

05/13 20:19, , 34F
你這樣lookat等你用到時也要重設 不能這樣做吧
05/13 20:19, 34F

05/13 22:43, , 35F
Q大不好意思,可否提供一個簡單的範例?因為V大方法較易懂
05/13 22:43, 35F

05/13 22:56, , 36F
我提供的改法只是讓你直接做到你想要的效果, 但是程式這
05/13 22:56, 36F

05/13 22:57, , 37F
樣寫效率比較差(不同obj都要重設所有需要的matrix), 而
05/13 22:57, 37F

05/13 22:58, , 38F
且draw obj或state也比較不好管理; 上面幫你改出來, 只
05/13 22:58, 38F

05/13 22:58, , 39F
是現階段改個你要的成果, 讓你去玩玩看, 順便看能不能了
05/13 22:58, 39F

05/13 22:59, , 40F
解GL API的使用, 與GL的運作; 真要弄懂, 還是找個教材從
05/13 22:59, 40F

05/13 22:59, , 41F
頭開始慢慢學習/練習吧:)
05/13 22:59, 41F
文章代碼(AID): #1BwyMbK6 (C_and_CPP)
文章代碼(AID): #1BwyMbK6 (C_and_CPP)