對於模型,我認爲類似於UIImage
和UIImageView
之間的關係的方法是適當的。所以每種類型的磚都有一個頂點緩衝區,GLKBaseEffect
,紋理和其他任何東西。然後每塊磚可能會出現多次,就像多個UIImageViews
可能使用相同的UIImage
一樣。就保留多個參考框架而言,建立一個實質上等價於UIView
的層次結構實際上是一個非常好的主意,每個框架都包含一些相對於父代的變換,以及一種能夠顯示模型的變換。我認爲保持你想要的那種相機(甚至是物體位置)的最好方法就是直接將它存儲爲GLKMatrix4
或GLKQuaternion
- 所以你不能派生矩陣或者四元數(加上位置)與相機的其他描述,而矩陣或四元數直接是相機的存儲。
這兩個類都有內置旋轉的方法,並且GLKMatrix4
可以直接處理翻譯。因此,您可以直接將相關手勢映射到這些功能。
當我用這種方式處理相機時,我能想到的唯一稍微不明顯的事情是,您想要將逆發送給OpenGL,而不是本身。假設您使用矩陣,推理是如果您想要在該位置繪製對象,則可以直接加載矩陣,然後繪製該對象。當您在相同的位置繪製對象時,您希望它最終在原點處繪製。因此,您必須爲相機加載的矩陣是您在該位置繪製的矩陣的逆矩陣,因爲您希望這兩個矩陣乘以一起作爲單位矩陣。
我不確定你的磚模型有多複雜,但如果它們很簡單並且都完全獨立移動,你可能會遇到性能瓶頸。處理OpenGL的一般規則是,一次可以提交的幾何圖形越多,一切就越快。因此,例如,在大多數遊戲中,完全靜態的世界比一個可以獨立移動的世界更容易高效地繪製。如果您正在繪製六面立方體並將它們全部獨立移動,那麼您可能會看到性能比您預期的差。
如果您有任何磚塊一致移動,那麼將它們繪製爲單個幾何圖形會更有效。如果你有任何明顯不可見的磚,那麼甚至不要嘗試繪製它們。從iOS 5開始,可以使用GL_EXT_occlusion_query_boolean
,這是一種將幾何幾何體傳遞給OpenGL並詢問是否可見的任何幾何體的方法。您可以通過構建一個描述數據的分層結構(如果您直接遵循UIView
類比,那麼您將擁有該分層結構),計算或存儲每個視圖的某些邊界幾何並且僅在遮擋查詢表明至少有一些邊界幾何圖形是可見的。通過遵循這種邏輯,在提交之前很久就會丟棄幾何圖形的大部分幾何圖形。
感謝您的好建議。按照你的建議,我將根據UIImageView的比喻重新審視它。到目前爲止,我做了幾個選擇:1)選擇將GL的東西與模型分開,2)由於磚可以共享幾何,所以將glGenBuffer和glBufferData放在類級別。 3)到目前爲止,我的工作是由視圖控制器擁有的單一基本效果,但作爲渲染參數傳遞,因爲vc迭代場景中的磚塊以調用每個渲染參數。在渲染中,磚複合材料是局部變形的,然後調用glDrawArrays。 – danh