我在CALayer的子类中使用了这段代码,该子类的示例是根CALayer的子层。
-(void)setSelected:(bool)s {
selected=s;
if (s)
{
CATransform3D rot = CATransform3DMakeRotation(M_PI, 0, 1, 0);
rot.m34=-1.0 / 200;
[self setTransform:rot];
}
else
{
CATransform3D rot = CATransform3DMakeRotation(0, 0, 1, 0);
rot.m34=-1.0 / 200;
[self setTransform:rot];
}
}
当selected属性设置为TRUE时,会发生以下情况:旋转直到Angular 等于M_PI/2,然后层消失,因为它是正交的。动画的结尾是错误的:在动画的第一部分(例如在左边)看起来增长的边,在左边而不是右边结束动画。2但是内容被翻转。
我认为这与两个旋转矩阵之间的插值有关,但我不能确切地理解发生了什么。
详细信息:动画看起来像是在执行以下操作:
1.以+Pi/2为增量绕Y轴旋转
1.内容翻转
1.以-Pi/2为增量绕Y轴旋转,就像它从(yz)平面反弹一样
翻转的内容是我正在努力实现的。
这是我得到的动画帧。如你所见,梯形的小边总是在左边;它应该在动画结束时的右边(右上帧)。x1c 0d1x
3条答案
按热度按时间vcudknz31#
如果有人只想水平翻转图像或视图的方向
或
np8igboo2#
变换的数学运算不正确。您应该在旋转变换之后应用透视变换,这意味着要连接两个变换。更改旋转变换的m34系数是不等效的。
应将代码替换为以下代码:
顺便说一下,应用透视变换的一种更为方便的方法是使用超层的
sublayerTransform
属性,从而将其应用于每个子层(如果需要)。这将产生如下结果:
以获得相同的外观效果。
j2cgzkjk3#
假设你的图层是一块半透明的平面塑料,上面投射了一个图像,所以它可以从两面发光。当旋转pi/2时,它是边缘朝上的,所以它会消失。当你的旋转大于pi/2但小于pi时,平面塑料的背面会暴露出来。因为它是半透明的,所以你可以看到图像的背面。但是因为你是从后面看的,所以它是镜像的。当Angular 达到π时,薄片在y轴上翻转了整整180度。它是颠倒的,你可以从后面看到图像,所以它是反向的。