2012-03-30 22 views
1

我試圖通過使用CATransform3D添加視角到視圖。目前,這就是我得到:CATransform3D變換

enter image description here

而這正是我想要得到的:

enter image description here

我有一個很難做到這一點。我完全迷失在這裏。這是我的代碼:

CATransform3D t = CATransform3DIdentity; 
    t.m11 = 0.8; 
    t.m21 = 0.1; 
    t.m31 = -0.1; 
    t.m41 = 0.1; 
    [[viewWindow layer] setTransform:t]; 

回答

2

矩陣元素.m34負責透視。這在文檔中沒有討論太多,所以你必須玩弄它。這樣的回答談到如何使用它一點點:https://stackoverflow.com/a/7596326/1228525

要真正看到矩陣,你需要做兩件事情的影響: 1.應用該投影矩陣父視圖的子變換 2.旋轉子視圖(您想要透視的視圖) - 否則它將保持平坦,您將無法告訴它現在具有3D透視圖。

的數字是任意的,讓他們無論看起來最好:

CATransform3D t = CATransform3DIdentity; 
t.m34 = .005; 
parentView.layer.sublayerTransform. = t; 
childview.layer.transform = CATransform3DMakeRotation(45,1,0,0); 

透視將根據那裏的孩子是在父視圖看起來不同。如果孩子處於父母的中心,那麼就像你直接在3D中查看孩子視圖一樣。離中心越遠,它就會越像你從一個掃視角度看到的那樣。

這是我得到使用上面的代碼和定心子視圖:(顯然我不能,因爲我是新來張貼圖片,所以你必須要看到的鏈接)http://i.stack.imgur.com/BiYCS.png

根據這些圖片很難說出你要做什麼。如果我的答案不是你想要的,多一點解釋可能會有所幫助。從圖片中我可以看出,最下面的一張不是透視圖...

+0

你的意思是'CATransfrom3DMakeRotation(45/180 * 2 * 3.1416,1,0,0)'?第一個參數的值應該是弧度。 – ZhangChn 2012-03-31 07:03:54

+0

沒有。正如我所說的那樣,這些數字是隨意的,讓他們隨心所欲。 – Hooper 2012-03-31 19:39:09

0

我能夠使用AGGeometryKit輕鬆實現正確的CATransform3D。

#import <AGGeometryKit/AGGeometryKit.h> 

UIView *view = ...; // create a view 

// setting anchorPoint to zero 
view.layer.anchorPoint = CGPointZero; 
view.layer.transform = CATransform3DMakeTranslation(-view.layer.bounds.size.width * .5, -view.layer.bounds.size.height * .5, 0); 

// setting a trapezoid transform 
AGKQuad quad = view.layer.quadrilateral; 
quad.tl.x -= 10; // shift top left x-value with 10 pixels 
view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied