第一部分、前几天做动画,使用到了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能够看出来)