开发技术文章

iOS动画——CATransform3D

2021-11-20  本文已影响0人  Summit_yp
CATransform3D

m11:x轴方向进行缩放
m12:和m21一起决定z轴的旋转
m13:和m31一起决定y轴的旋转
m14:

m21:和m12一起决定z轴的旋转
m22:y轴方向进行缩放
m23:和m32一起决定x轴的旋转
m24:

m31:和m13一起决定y轴的旋转
m32:和m23一起决定x轴的旋转
m33:z轴方向进行缩放
m34:透视效果,m34 = -1 / D,D越小,透视效果越明显,必须在有旋转效果的前提下,才会看到透视效果。

m41:x轴方向进行平移
m42:y轴方向进行平移
m43:z轴方向进行平移
m44:初始为1

image.png
/* 初始化一个CATransform3D的实例,默认的值是[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]*/
const CATransform3D CATransform3DIdentity
/* 判断一个CATransform3D的实例是否是初始化值。*/
bool CATransform3DIsIdentity (CATransform3D t)

/* 判断两个CATransform3D的实例的值是否相等。*/
bool CATransform3DEqualToTransform (CATransform3D a,CATransform3D b)
/* 以默认值为基准,返回一个平移'(tx, ty, tz)'后的CATransform3D实例t':
 * t' =  [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1] 
 * tx, ty, tz分别代表在x方向、y方向、z方向的位移量 */
CATransform3D CATransform3DMakeTranslation (CGFloat tx,CGFloat ty, CGFloat tz)

/* 以默认值为基准,返回一个缩放'(sx, sy, sz)'后的CATransform3D实例t':
 * t' = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]
 * sx, sy, sz分别代表在x方向、y方向、z方向的缩放比例,缩放是以layer的中心对称变化
 * 当sx < 0时,layer会在缩放的基础上沿穿过其中心的竖直线翻转
 * 当sy < 0时,layer会在缩放的基础上沿穿过其中心的水平线翻转 */
CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy,CGFloat sz)

/* 以默认值为基准,返回一个沿矢量'(x, y, z)'轴线,逆时针旋转'angle'弧度后的CATransform3D实例
* 弧度 = π / 180 × 角度,'M_PI'代表180角度
* x,y,z决定了旋转围绕的轴线,取值为[-1, 1]。例如(1,0,0)是绕x轴旋转,(0.5,0.5,0)是绕x轴与y轴夹角45°为轴线旋转 */
CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x,CGFloat y, CGFloat z)

/* 以't'为基准,返回一个平移'(tx, ty, tz)'后的CATransform3D实例t':
 * t' = translate(tx, ty, tz) * t. 
 * '(tx, ty, tz)'同'CATransform3DMakeTranslation' */
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx,CGFloat ty, CGFloat tz)

/* 以't'为基准,返回一个缩放'(sx, sy, sz)'后的CATransform3D实例t':
 * t' = scale(sx, sy, sz) * t. 
 * '(sx, sy, sz)'同'CATransform3DMakeScale' */
CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy,CGFloat sz)

/* 以't'为基准,返回一个沿矢量'(x, y, z)'轴线,逆时针旋转'angle'弧度后的CATransform3D实例t':
 * t' = rotation(angle, x, y, z) * t. 
 * '(angle, x, y, z)'同'CATransform3DMakeRotation' */
CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,
    CGFloat x, CGFloat y, CGFloat z)

/* 叠加两个CATransform3D实例的值并返回得到的CATransform3D实例t':
 * t' = a * b. */
 CATransform3D CATransform3DConcat (CATransform3D a, CATransform3D b)
/* 反转一个CATransform3D实例并返回结果
 * 如果没有翻转则返回原始矩阵 */
CATransform3D CATransform3DInvert (CATransform3D t)

/* 将一个CGAffineTransform实例转换得到一个同样效果的CATransform3D实例 */
CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m)

/* 判断一个CATransform3D实例能否被成功的转换成一个CGAffineTransform实例 */
bool CATransform3DIsAffine (CATransform3D t)

/* 将一个CATransform3D实例转换得到一个同样效果的CGAffineTransform实例
 * 如果不能成功转换,则返回空值 */
CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t)

关于m34解释

CATransform3D是一个4* 4机构体,改变他的m34这个属性,改变透视,看起来更加立体,m34= -1/D,D越小效果越明显,m34为负值表示远离屏幕,正值相反。下边的图就是加m34和不加的区别。

image.png

position与anchorPoint

frame.origin.x = position.x - anchorPoint.x * bounds.size.width;  
frame.origin.y = position.y - anchorPoint.y * bounds.size.height;
image.png

blueView.layer.anchorPoint = CGPointMake(0.5, 0.5);

blueView.layer.anchorPoint = CGPointMake(0.5, 0.5);

blueView.layer.anchorPoint = CGPointMake(0, 0);

blueView.layer.anchorPoint = CGPointMake(0, 0);

资料:
https://developer.apple.com/library/archive/navigation/#section=Topics&topic=Graphics%20%26amp%3B%20Animation

https://blog.csdn.net/yongyinmg/article/details/37927793

https://www.jianshu.com/p/f14c05425739
https://www.jianshu.com/p/3dd14cfbdc53
https://www.jianshu.com/p/78ff7919a701

上一篇下一篇

猜你喜欢

热点阅读