gpt4 book ai didi

ios - 如何让 CALayers 在进行 3D 变换时使用屏幕中心作为消失点?

转载 作者:可可西里 更新时间:2023-11-01 06:11:39 24 4
gpt4 key购买 nike

我在屏幕上有一个 2D View 网格(我称它们为图 block )。每个图 block 都有一个 subview ,我在动画 block 中围绕 Y 轴旋转。我已经在每个图 block 上正确设置了 sublayerTransform。我正在旋转的所有 subview 都展示了 3D 透视图。问题是每个消失点都是图 block 的中心而不是屏幕的中心,破坏了 3D 的幻觉。当我在所有图 block 的父级上设置 sublayerTransform 时,旋转 View 不会显示任何透视图。我相信这是因为 sublayerTransform 仅适用于层的子层而不适用于孙子层。如何使所有旋转 View 使用相同的消失点?我已经包含了一个绘制不佳的图像来帮助说明这一点。 enter image description here

最佳答案

解决方法是:你必须给superlayer添加translation transform,然后通过调整sublayer的位置来弥补。我成功地使用了以下一段代码,只需创建一个空的“单 View 应用程序”XCode 项目并在 iPad 模拟器上运行:

- (void)viewDidLoad
{
[super viewDidLoad];

for (int i = 0; i < 6; i++)
{
CALayer *parent = [CALayer layer];
parent.frame = CGRectMake(0, 0, 100, 100);
parent.position = CGPointMake(70 + 120*i, 70);
parent.backgroundColor = [[UIColor greenColor] CGColor];
[self.view.layer addSublayer:parent];

float width = self.view.frame.size.width/2.0;
float offset = (width - parent.position.x);

CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, 0, 40, 40);
layer.position = CGPointMake(-offset + 50, 60);
layer.backgroundColor = [[UIColor redColor] CGColor];
layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 1, 0);

CATransform3D tr = CATransform3DMakeTranslation(offset, 0, 0);
CATransform3D t = CATransform3DIdentity ;
t.m34 = -4.0f/2000.0f ;
parent.sublayerTransform = CATransform3DConcat(t, tr);

[parent addSublayer:layer];
}
}

关于ios - 如何让 CALayers 在进行 3D 变换时使用屏幕中心作为消失点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855914/

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