2009-09-16 146 views
0

我對創建遊戲非常陌生(一般在OpenGL中工作)。我正在嘗試製作2D遊戲,但在試圖讓我的頭部碰撞檢測時遇到了一個絆腳石。例如,我翻譯當前矩陣,旋轉和再次翻譯,然後繪製一個點。我怎麼知道那個點與我可能繪製的其他東西有什麼關係?OpenGL絕對座標

有沒有從當前矩陣計算「絕對」座標的方法?

請儘可能簡單地解釋!謝謝:)

回答

3

OpenGL不是一個遊戲引擎,而是一個渲染庫。另一方面,碰撞檢測是你遊戲邏輯的一個功能。因此,OpenGL應該與OpenGL無關,它只是在屏幕上顯示視覺表示的查看機制 - 它不瞭解您的遊戲對象,也不瞭解任何有用的持久數據。如果您嘗試將對象在矩陣中的位置存儲並通過轉換進行移動,則最終可能會受累積浮點錯誤的影響,從而導致不可預知的行爲。

你應該做的就是手動維護所有對象的位置(以及方向,速度等)。對象的所有移動都應由您在應用程序代碼中執行。當渲染對象時,您讀取它們的當前值並將其傳遞給OpenGL。通常,您需要爲要渲染的每個類型對象提取多邊形數據,按對象實例的方向旋轉它,按位置翻譯它,然後渲染。每幀重複一次。

如果您完全熟悉Model-View-Controller範例,那麼您的遊戲對象就是Model,而OpenGL提供了一個View。因此,您應該根據需要操作模型,並在需要時從視圖中讀取視圖。

+0

我想我需要尋找一種合適的方法來手動維持職位然後 – michael 2009-10-04 10:19:40

+0

一本好書可以讓學習一些遊戲體系結構的東西變得簡單,因爲這是pygame書的遊戲開發。很簡單,寫得很好。儘管如此,我還沒有這方面的知識。 – 2011-01-26 16:06:33

2

它最好只跟蹤每個物體的絕對位置。

+0

這是我的第一次,但必須有一個更優雅的方式來處理這個?! – michael 2009-09-17 07:47:31

+0

一旦你轉換了它的矩陣,它就被轉換了。我不確定你想要做什麼。你只是隨機翻譯物體?當你渲染一個你知道或者應該知道每個對象將要渲染的幀的時候。我從來沒有見過沒有每個對象都有x,y [,z]座標的遊戲代碼。 – 2009-09-17 13:05:46

0

你是什麼意思的「絕對」?

如果你希望你的點相對於前面的點,你可以反轉你剛剛做的變換:翻譯第二個翻譯的負面,圍繞同一個軸以相同的方向旋轉相反的方向,然後翻譯第一個翻譯的否定。這將使您從新座標轉換到舊系統。

或者,您可以使用已有的轉換將舊點轉換爲新的座標系。

+0

但是當我的觀點都被翻譯後會發生什麼?絕對地,我的意思是沒有變換或旋轉的軸對齊的座標。 – michael 2009-09-17 07:46:56

+0

我感覺你可能會在這裏問錯誤的問題。你實際上想從高層完成什麼? – 2009-09-17 16:13:23

0

跟蹤世界座標中的物體位置,並直接比較它們。

要進行顯示,請使用相機型號,然後將所有轉換應用於其中。

1

令人沮喪,不是嗎?所有OpenGL和圖形編程初學者都有類似的問題。跟蹤各種參考框架可能很困難。

我推薦的第一件事就是從亞馬遜或其他零售商處獲得OpenGL SuperBible的副本。它始於絕對的開始,並逐漸從那裏建立起來。推薦NeHe網站的較早的海報也給出了很好的建議。

至於你的問題本身,當你創建一個OpenGL程序時,你可以將「modelview」矩陣設置爲身份(參見SuperBible獲取更多信息),並且你在glPoint()調用中設置的所有座標都將被定義爲相對以該矩陣作爲參照系。如果除了從這裏開始調用glPoint()之外不做任何事情,那麼所有對象都將處於相同的絕對座標系中。

當您開始調用glTranslate和glRotate和glLoadMatrix時,會變得棘手,因爲這些函數會轉換引用幀。當這種情況發生時,隨後的所有glPoint()調用都是相對於該新的參照系的。 (正如另一張海報所提到的,如果你想返回到前面的參考框架,你必須在轉換它之前將模型視圖矩陣保存在堆棧上,然後你可以「彈出」堆棧並返回)

很難在支持網站上描述這一點,但將其想象成牙醫椅上的一系列機械手臂。他可以將托盤移動到下巴下方,然後以一定角度旋轉託盤來托住下巴。每個獨立的運動可以被認爲是一個轉換,在OpenGL中作爲一個矩陣實現。

就像我說的,很難在網上正確地描述這一點。抓住SuperBible書,它會變得更有意義。祝你好運!