【问题标题】:Applying an inverse CATransform3D to sublayers of a CALayer that has already been transformed将逆 CATransform3D 应用于已转换的 CALayer 的子层
【发布时间】:2011-11-09 16:43:21
【问题描述】:

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

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

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

结果是这样的:

我的下一个任务是防止子视图在主视图被转换时被转换,或者应用逆变换以使子视图不受影响。

我的目标是让每个子视图垂直于父视图,给人一种“站立”的印象。

我用于转换的代码:

- (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];       
}

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

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 旋转,那么子视图会闪烁,但不要旋转。

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

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

【问题讨论】:

    标签: iphone objective-c ios catransform3d homogenous-transformation


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多