为什么围绕x轴平移CALayer会影响围绕Y轴的旋转

时间:2014-03-04 21:28:36

标签: ios uiimageview rotation core-animation calayer

我添加了一个CALayer并按以下方式进行了转换。我会假设在旋转之前将图层按任意常数进行平移不会对围绕Y轴的旋转产生影响,但它似乎有所不同,我在这里缺少什么?

- (void)viewDidAppear:(BOOL)animated
{
    CALayer* layer = [CALayer layer];
    layer.bounds = self.img1.bounds;
    layer.backgroundColor = [[UIColor grayColor] CGColor];
    layer.anchorPoint = CGPointMake(0, 0.5);
    layer.position = CGPointMake(0, CGRectGetMidY(self.view.bounds));
    layer.contents = (id)[self.img1.image CGImage];
    layer.transform = [self transformforView1];
    [self.view.layer addSublayer:layer];
}

没有任何翻译和输出的轮换:

- (CATransform3D)transformforView1
{
    CATransform3D t = CATransform3DIdentity;
    t.m34 = 1.0/-700;
    t = CATransform3DTranslate(t, 0, 0, 0);
    t = CATransform3DRotate(t, degToRad(45), 0, 1, 0);
    return t;
}

Rotation without any translation and output

与500和输出的平移相同的旋转:

- (CATransform3D)transformforView1
{
    CATransform3D t = CATransform3DIdentity;
    t.m34 = 1.0/-700;
    t = CATransform3DTranslate(t, 500, 0, 0);
    t = CATransform3DRotate(t, degToRad(45), 0, 1, 0);
    return t;
}

Same rotation with translation of 500 and output

3 个答案:

答案 0 :(得分:3)

这实际上是一个非常好的问题。混淆来自于模型视图矩阵和投影矩阵通常是分开的。

阅读本课题以供参考:

The purpose of Model View Projection Matrix

我建议您将模型视图矩阵和投影矩阵分开。

因此,您的CATransform3D t实际上是两个矩阵的串联,您可以添加另一个转换以在视图中移动模型,或者然后创建另一个转换(模型视图矩阵)。这就是我在这里所做的:

CATransform3D modelViewTransform = CATransform3DMakeTranslation([UIScreen mainScreen].bounds.size.height / 2.0, 0, 0);
CATransform3D t = CATransform3DIdentity;
t.m34 = 1.0/-700;
t = CATransform3DTranslate(t, 500, 0, 0);
t = CATransform3DRotate(t, degToRad(45), 0, 1, 0);
return CATransform3DConcat(t, modelViewTransform);

这会将您的模型移动到屏幕中心,而不是位于屏幕边缘。

答案 1 :(得分:0)

  

我在这里错过了什么?

您错过了变换矩阵的工作方式以及它们如何连接,更确切地说,顺序很重要。

当你说:

  

我认为在旋转之前用任意常数平移图层不应该对围绕Y轴的旋转产生影响

您可能基于这样的假设:翻译已经旋转的图层不应该影响旋转。问题在于,首先翻译和翻译最后翻译之间存在差异。矩阵不是可交换的,这意味着A*B != B*A

答案 2 :(得分:-1)

您的代码围绕y轴而不是x轴旋转。如果围绕x轴旋转,为什么还要谈论绕x轴旋转?