2011-05-04 55 views
1

圖片具有相同的幀,並直接在其上方邊界的透明的CALayer一個OpenGL ES 1.1渲染表面。使用4x4矩陣轉換(翻譯和旋轉)OpenGL場景中的對象。覆蓋的CALayer使用CATransform3D(which happens to be a 4x4 matrix, identical to ones used for OpenGL transforms)轉換子層。如何將3D OpenGL矩陣轉換爲CoreAnimation CATransform3D?

OpenGL的矩陣變換場景中的物體在完全相同的方式,我想他們。然後,我想要採用場景對象上使用的相同矩陣變換,並讓CALayer將其應用到子圖層,以使子圖層與場景對象的位置和方向完全相同。

問題是(我認爲)我的OpenGL場景和CALayer的「場景」不同意任意「場景單元」的定義,並且這種分歧表現爲自身翻譯中的差異子層與場景對象的翻譯(旋轉很好)。具體來說,CALayer似乎在理解場景單元與屏幕像素非常接近的情況下運行,而我的OpenGL場景使用更大的單元,這意味着CALayer只能轉換場景對象的一小部分。

所以,我正在尋找的是在數學上轉換矩陣變換在我的OpenGL場景單位指定的功能等價矩陣的CALayer的場景單位變換指定的方式。我需要能夠根據我的OpenGL場景單元定義一個CALayer場景單元,但我不知道CALayer如何在幕後與OpenGL進行交互。

是否可以計算出這樣的轉換?如果沒有,是否有其他方法可以幫助?

注意:我已經能夠使用純粹的經驗性方法來解決問題,基本上可以歸結爲需要對CATransform3D進行哪些調整才能使其在幾個位置上工作,並進行外推。我希望有更精確的事情。

+0

,你用什麼來'glOrtho()'爲你的OpenGL ES的場景?通過調整正交矩陣,您可以將OpenGL ES座標系與CALayer座標系一致嗎? – 2011-05-04 21:59:41

+0

@Brad:我實際上並沒有在OpenGL場景中使用正交投影。這是一個透視場景,透視截錐體是根據運行應用程序的設備的攝像機參數計算出來的。對CALayers的透視轉換看起來對我來說很深,因此我不確定兩者之間的相關性。 – 2011-05-04 22:17:58

+0

那你使用'glFrustum()'嗎?如果是這樣,您可能需要將模型視圖矩陣與'glFrustum()'的透視矩陣相乘,以便像您的CATransform3D那樣使用它,正如David所言。 – 2011-05-04 22:32:20

回答

4

我猜問題是由OpenGL的視圖的投影矩陣引起的。請記住,從世界到觀看的轉變是view_point = projection x modelview x world_point

+0

投影矩陣本身很好。 OpenGL場景渲染正確,我只需要一種方法來轉換OpenGL的模型視圖/投影矩陣,以便在CALayer的座標空間中使用(這非常非常非常糟糕)。 – 2011-05-04 19:48:57

+0

我站好了。通過投影矩陣將場景的CATransform3D相乘確實(大多數情況下)可以做到這一點。我最初誤解了答案。乾杯=)。 – 2011-05-05 16:15:00

+0

@Matt你能寫出你如何連接投影和modelView矩陣?我有同樣的問題,但是當我調用CATransform3DConcat(modelViewMatrix,_projectionMatrix)時,結果很奇怪。我改造後的CALayer太過分了,看起來像屏幕上的小點。 – Zapko 2011-05-18 07:44:44