2013-02-12 54 views
2

我试图使用CATransform3DMakeRotation在UIView图层上执行3D旋转。我很困惑,为什么这个简单的例子不能显示透视图,而是看起来像是压缩了。当使用CATransform3DRotate时我可以获得旋转功能,但我不想旋转,我想旋转。谢谢。使用CATransform3DMakeRotation时没有视角

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
    [newView setBackgroundColor:[UIColor orangeColor]]; 
    UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 50, 20)]; 
    [newLabel setText:@"Hello"]; 
    [newView addSubview:newLabel]; 
    [self.window addSubview:newView]; 

    CALayer *layer = newView.layer; 

    CATransform3D perspective = CATransform3DMakeRotation(1.0, 0, 1, 0); 
    perspective.m34 = -1/500; 

    layer.anchorPoint = CGPointMake(1.0, 0.5); 
    layer.zPosition = 99; 
    layer.transform = perspective; 

    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

这里是什么样子的截图:大卫的回答后

Screenshot

UPDATE:

只是为了加强大卫的观点,即订购事宜,我想看到的差异在矩阵中并编码为:

CATransform3D transform1 = CATransform3DMakeRotation(-1, 0, 1, 0); 
transform1.m34 = -1.0/500.0; 

NSLog(@"%f %f %f %f", transform1.m11, transform1.m12, transform1.m13, transform1.m14); 
NSLog(@"%f %f %f %f", transform1.m21, transform1.m22, transform1.m23, transform1.m24); 
NSLog(@"%f %f %f %f", transform1.m31, transform1.m32, transform1.m33, transform1.m34); 
NSLog(@"%f %f %f %f", transform1.m41, transform1.m42, transform1.m43, transform1.m44); 

NSLog(@"=============================="); 

CATransform3D transform2 = CATransform3DIdentity; 
transform2.m34 = -1.0/500.0; 
transform2 = CATransform3DRotate(transform2, -1, 0, 1, 0); 

NSLog(@"%f %f %f %f", transform2.m11, transform2.m12, transform2.m13, transform2.m14); 
NSLog(@"%f %f %f %f", transform2.m21, transform2.m22, transform2.m23, transform2.m24); 
NSLog(@"%f %f %f %f", transform2.m31, transform2.m32, transform2.m33, transform2.m34); 
NSLog(@"%f %f %f %f", transform2.m41, transform2.m42, transform2.m43, transform2.m44); 

NSLog(@"=============================="); 

CATransform3D transform3 = CATransform3DIdentity; 
transform3 = CATransform3DRotate(transform3, -1, 0, 1, 0); 
transform3.m34 = -1.0/500.0; 

NSLog(@"%f %f %f %f", transform3.m11, transform3.m12, transform3.m13, transform3.m14); 
NSLog(@"%f %f %f %f", transform3.m21, transform3.m22, transform3.m23, transform3.m24); 
NSLog(@"%f %f %f %f", transform3.m31, transform3.m32, transform3.m33, transform3.m34); 
NSLog(@"%f %f %f %f", transform3.m41, transform3.m42, transform3.m43, transform3.m44); 

将会产生这样的输出:

0.540302 0.000000 0.841471 0.000000 
0.000000 1.000000 0.000000 0.000000 
-0.841471 0.000000 0.540302 -0.002000 
0.000000 0.000000 0.000000 1.000000 
============================== 
0.540302 0.000000 0.841471 -0.001683 
0.000000 1.000000 0.000000 0.000000 
-0.841471 0.000000 0.540302 -0.001081 
0.000000 0.000000 0.000000 1.000000 
============================== 
0.540302 0.000000 0.841471 0.000000 
0.000000 1.000000 0.000000 0.000000 
-0.841471 0.000000 0.540302 -0.002000 
0.000000 0.000000 0.000000 1.000000 
+0

是否可以将.m34设置为“-1/500”作为整数除法?尝试使用'-1.0/500.0'。 – 2013-02-12 23:32:49

+0

@ZevEisenberg谢谢你的建议,但它没有奏效。 – 2013-02-13 18:00:30

回答

14

设置m34值没有按”让你透视魔法的所有转换(不幸)。由于旋转会改变变换的许多不同值,因此需要在标识消息上设置透视图,然后旋转该变换。

CATransform3D rotationWithPerspective = CATransform3DIdentity; 
rotationWithPerspective.m34 = -1.0/500.0; 
rotationWithPerspective = CATransform3DRotate(rotationWithPerspective, angle, 0, 1, 0); 

从这里你在做什么不同的是,您对创建单位矩阵和设置的角度看,那么你该旋转矩阵。问题是订单很重要。


如果你知道矩阵数学,那么你可以验证这两个转换间的差异,看看为什么你不给你任何观点。如果你有兴趣了解变换背后的数学知识,我就写了a blog post(警告:它很长,只包含数学)。

+0

感谢您的答案和伟大的文章@DavidRonnqvist。很有帮助。 – 2013-02-13 18:42:00

+0

@大卫哦,如果我只知道那个命令很重要)非常感谢! – 2014-07-25 11:25:29

0

我总是发现M34属性为挑剔的,试试这个:

CATransform3D transform = CATransform3DIdentity;

,而不是CATransform3DMakeRotation(1.0, 0, 1, 0);