gpt4 book ai didi

iphone - 使用 CATransform3DMakeRotation 时没有透视

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:48 27 4
gpt4 key购买 nike

我正在尝试使用 CATransform3DMakeRotation 在 UIView 层上执行 3D 旋转。我很困惑为什么这个简单的例子没有显示透视图,而是看起来被压扁了。使用 CATransform3DRotate 时我可以让旋转工作,但我不想旋转,我想旋转到。谢谢。

- (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

大卫回答后更新:

为了加强 David 的顺序很重要的观点,我想看看矩阵中的差异并将其编码:

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

最佳答案

设置 m34 值并不能为您提供所有魔法变换的视角(不幸的是)。由于旋转会更改变换的许多不同值,因此您需要在标识消息上设置透视图,然后旋转该变换。

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

这里与您所做的不同之处在于,您创建了一个单位矩阵并在其上设置透视图,然后旋转该矩阵。问题是顺序很重要。


如果您了解矩阵数学,那么您可以验证这两个变换之间的差异,并了解为什么您的变换没有给您任何观点。如果你有兴趣了解我写的转换背后的数学 a blog post关于这一点(警告:它很长并且只包含数学)。

关于iphone - 使用 CATransform3DMakeRotation 时没有透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com