首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将逆向CATransform3D应用于已转换的CALayer的子层

将逆向CATransform3D应用于已转换的CALayer的子层
EN

Stack Overflow用户
提问于 2011-11-10 00:43:21
回答 1查看 3.3K关注 0票数 6

我正在使用CATransform3D转换将伪3D透视效果应用于视图。

我使用iPhone 4中的陀螺仪来控制变换的参数。

我正在转换的视图有一些子视图:

结果如下所示:

我的下一个任务是要么在主视图转换时防止子视图被转换,要么应用反向转换以致于子视图不受影响。

我的目标是让每个子视图垂直于superview,给人一种“站着”的感觉。

我用来进行转换的代码:

代码语言:javascript
复制
- (void)update:(NSTimer *)timer
{
    roll = [[[_manager deviceMotion] attitude] roll];
    pitch = [[[_manager deviceMotion] attitude] pitch];
    yaw = [[[_manager deviceMotion] attitude] yaw];

    CALayer *layer = [self.view layer];
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI / 180.0f, 0.0f, 0.0f, 1.0f); // make landscape again  
    rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply the perspective
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f);
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f);
    [layer setTransform:rotationAndPerspectiveTransform];       
}

我尝试了以下代码,尝试通过将90度透视旋转应用于Y轴周围的子视图来反转变换:

代码语言:javascript
复制
for (UIView *subview in [self.view subviews])
{
    CALayer *sublayer = [subview layer];
//CATransform3D inverseTransformation = [sublayer transform];
CATransform3D inverseTransformation = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply perspective
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
[sublayer setTransform:inverseTransformation];
}

但是,所有这些成功的做法都是使子视图消失。如果我尝试使用来自[sublayer transform]层的现有变换,并对其应用3d旋转,则子视图闪烁,但不旋转。

我的Matrix数学知识不是很好,所以我不知道这是不是正确的方法。

如何使子视图与超级视图垂直?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-11 23:04:46

我建议不要尝试使用计算每个单独变换的基本方法。而且,对于每个小的子视图而不是更高级别的UIView对象,使用CALayers会更容易。构建3D模型和转换整个模型的基本方法应该更适合您。

从主层开始,为每个小方块添加一个子层,将这些子层转换到位置,然后您的问题中列出的update:方法应该可以在不修改的情况下转换所有内容。John Blackburn has a nice little tutorial应该会有很大的帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8068373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档