第一部分、前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形学,矩阵中m11--m44的各个含义都不清楚,经过几天研究总结如下:(供和我一样的菜鸟学习)
{
CGFloat m11(x缩放), m12(y切变), m13(), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。当然,z方向上得有变化才会有透视效果);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};
ps:
- 整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若m33<0,发生关于原点的对称等比变换。
- 单设m12或m21的时候是切变效果,当【m12=角度】和【m21=-角度】的时候就是旋转效果了。两个角度值相同。
- ()空的地方以后补充。
- 还有,要想使用CATransform3D,必须在工程里导入QuartzCore.framework。然后在文件中
#import <QuartzCore/CATransform3D.h>。
iphone 透视效果(perspective) CATransform3D transform = CATransform3DIdentity; transform.m34 = 0.0005; // 透视效果 transform = CATransform3DRotate(transform,(M_PI/180*40), 0, 1, 0); [piece.layer setTransform:transform];
第二行一定要写在第三行的前面!自己理解!
第二部分 1. CATransform3D结构成员的意义。 ? structCATransform3D { CGFloat m11(x缩放), m12(y切变), m13(旋转), m14(); CGFloat m21(x切变), m22(y缩放), m23(), m24(); CGFloat m31(旋转), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义); CGFloat m41(x平移), m42(y平移), m43(z平移), m44(); }; ps:整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若s<0,发生关于原点的对称等比变换。 ()空的地方以后补充。 2. CATransform3DMakeTranslation CATransform3DMakeTranslation(0, 0, 0) 创建了一个4*4的单位矩阵。 3. CATransform3DMakeRotation And CATransform3DRotate CATransform3DMakeRotation() [objc] view plaincopy _transformedLayer = [CALayer layer]; _transformedLayer.frame = self.bounds; _transformedLayer.anchorPoint = CGPointMake(0.5f, 0.5f); CATransform3D sublayerTransform = CATransform3DIdentity; // Set perspective sublayerTransform.m34 = kPerspective; [_transformedLayer setSublayerTransform:sublayerTransform]; [self.layer addSublayer:_transformedLayer]; //init Sublayers CATransform3D t = CATransform3DMakeTranslation(0, 0, 0); // take snapshot of the current view [_transformedLayer addSublayer:[self snapshot:t withView:_contentView isMasked:YES]]; // 暂时先支持一个方向翻转 RotateDirection direction = RotateFromBottom; if (YES || direction == RotateFromBottom) { CGFloat height = self.bounds.size.height; //CGFloat cubeSize = 100.0f; t = CATransform3DRotate(t, D2R(90.0), 1, 0, 0);【1】 t = CATransform3DTranslate(t, 0, height, 0); CALayer *subLayer = [self snapshot:t withView:view isMasked:YES]; [_transformedLayer addSublayer:subLayer]; } else { } _newContentView = view; [self animationCubeRotate:direction withDuration:duration];
总结:1.CATransform3DRotate和CATransform3DTranslate都是对函数参数的那个矩阵进行处理,省去了我们自己算矩阵。
2.对应上一篇Core-Animation-Advanced-Techniques的其中对bounds和frame的阐述做个说明:旋转后bounds不会变,但是frame会变,有人可能用CATransform3DRotate试过后发现没变,其实变了,只是CATransform3DRotate对矩阵旋转的同时进行了缩放处理,把layer缩放到原来的frame不变又正好能显示下的大小(根据观察矩阵的m11,和m22能够看出来)