2012-05-31 68 views
0

的層,與frame {0,0,w,h}backgroundColor redanchorPoint at {0,0.5}transform.m34 = -1.0/1800, 並設置position at {0,0}, 然後與沿yCATransform3DRotate(layer.transform , 0.25 * M_PI, 0, 1, 0)一個角度旋轉, 現在我想弄清楚的寬度的紅色區域。突起的CALayer的旋轉

在開始時,我認爲這應該是cos(0.25 * M_PI) *w, 然後我的代碼測試, 紅色區域是短則cos(0.25 * M_PI) *w,這應該是因爲視角(越接近目標,做大出現),但我不知道如何計算出紅色區域的寬度。

+0

我已經寫了這個帖子,誰可以閱讀中國只是看看的http:// geeklu。com/2012/07/ios-3d-perspective/ – Luke

回答

3

如果我理解正確你,你正在嘗試做的是確定經過一系列的變換中的兩個不同點的相對位置。計算這樣做的方程式可能會非常棘手,我發現首先用矩陣的方式寫出所有內容,然後通過自己乘以矩陣來得到方程式是有幫助的。

比方說你的錨是在原點,採用列爲主的矩陣(如Open GL和CA層做)。位置1將表示矩形的左邊緣,位置2表示右邊。

Position1 = {1,0,0,0, 
      0,1,0,0, 
      0,0,1,0, 
      0,0,0,1}; 

Position2 ={1,0,0,w, 
      0,1,0,0, 
      0,0,1,0, 
      0,0,0,1}; 

位置2,現在需要由繞Y軸的角度旋轉,所以我們宣佈

Rotation = {cos,0,sin,0, 
       0,1, 0,0, 
      -sin,0,cos,0, 
       0,0, 0,1}; 

旋轉需要被應用到職位2二者均需要通過投影相乘矩陣。位置1不需要旋轉,因爲它位於旋轉軸上。要認識到,只設置M34到一個小的負數沒有做任何事情的魔力,你真正做的是通過投影矩陣

YourProjection = {1,0,0  ,0, 
        0,1,0  ,0, 
        0,0,1  ,0, 
        0,0,-1.0/1800,1}; 

通過投影矩陣的不同格式乘乘是很重要的作品一樣好,使用你最熟悉的任何東西。你可以使用一個矩陣像Open GL還是那種you are using,因爲他們是真正equivalent

Position2 = MultiplyMatrices(Rotation,Position2); 
Position2 = MultiplyMatrices(YourProjection,Position2); 
Position1 = MultiplyMatrices(YourProjection,Position1); 

位置1和位置2現在認爲,當你的CALayer的執行及其對他們的改造,他們將得到的確切位置。由於這些都是在齊次座標,你必須確保由W(M44)來劃分你的x,y,z分量(m41,42,43)轉換回笛卡爾。然後,所有你需要做的就是寬度

float width = Position1.m41-Position2.m41; 

如果您還沒有準備好,你應該讓自己那些矩陣乘法功能,使您可以快速,輕鬆地做這樣的計算。你也不會因爲這種代數錯誤而感到困惑:)。如果你真的想以代數的方式做到這一點,它應該給你你正在尋找的東西。此外,如果我的矩陣符號令人困惑,這裏是從列主要到CALayer變量的轉換。

{m11,m12,m13,m14, 
m21,m22,m23,m24, 
m31,m32,m33,m34, 
m41,m42,m43,m44}; 

,其中一個簡單的翻譯矩陣將

{1,0,0,0, 
0,1,0,0, 
0,0,1,0, 
x,y,z,1}; 
+0

非常感謝,明天我會檢查你的答案。如果需要,我會上傳問題的截圖。 – Luke

+0

根據你的回答,現在我可以計算出寬度。再一次非常感謝你。 – Luke