美文网首页开发技术文章
iOS动画——CATransform3D

iOS动画——CATransform3D

作者: Summit_yp | 来源:发表于2021-11-20 16:46 被阅读0次
    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

    相关文章

      网友评论

        本文标题:iOS动画——CATransform3D

        本文链接:https://www.haomeiwen.com/subject/dfyetrtx.html