美文网首页
谈CoreAnimation 中的CATransform3D

谈CoreAnimation 中的CATransform3D

作者: XiuFi | 来源:发表于2016-08-23 14:05 被阅读89次

          各位看官老爷大家好,在我第一次的的文章里有简单介绍怎么用CATransform3D做3D动画,正所谓工欲善其事,必先利其器😎我回去拿起当年大学教材研究了一番,再从官方文档入手,加上我的推理得出以下的结论,所以有可能说的并不对,希望如果说错了的话,各路大神多多包涵,欢迎大家指正我的错误😘

    CATransform3D

    structCATransform3D

    {

    CGFloat m11, m12, m13, m14;

    CGFloat m21, m22, m23, m24;

    CGFloat m31, m32, m33, m34;

    CGFloat m41, m42, m43, m44;

    };

    typedef struct CATransform3D CATransform3D; 

       从官方文档可以知道,CATransform3D是一个四维矩阵,所以我推论可能有下面原因

    1.一个点能显示在屏幕上可以由(x,y,z)决定,变形的时候会将一个三维坐标(x,y,z)转换为齐次坐标(x,y,z,w)。以此来将平移矩阵和旋转,缩放矩阵结合运算

     2.CATransform3D是一个表示变形的类,它是拿来运算的过度,并不是用来表示一个view的具体位置,而一个view的具体位置是(x,y,z)三维坐标或者(x,y,z,w)一个齐次坐标来表示,而4行4列的矩阵可以将平移这种相加的矩阵和旋转,缩放这样相乘的矩阵结合起来

    3个变换矩阵:平移矩阵,缩放矩阵,旋转矩阵

    平移矩阵

    t' =[1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]. */

    CA_EXTERN CATransform3DCATransform3DMakeTranslation (CGFloat tx,CGFloat ty,CGFloat tz)

    __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

    大家可以从这里看出来,平移矩阵是一个{

    1  0  0 0

    0  1  0  0

    0  0  1  0

    tx ty tz 1

    };

    缩放矩阵

    /* Returns a transform that scales by `(sx, sy, sz)':

    * t' = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1]. */

    CA_EXTERNCATransform3DCATransform3DMakeScale (CGFloatsx,CGFloatsy,CGFloatsz)

    __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

    大家可以从这里看出来,缩放矩阵是一个{

    sx  0  0  0

    0  sy  0  0

    0  0  sz  0

    0  0   0   1

    };

    这样的矩阵,所以当一个view用CATransform3DMakeTranslation(tx,ty,tz)的时候,就会用本身的�齐次坐标(x,y,z,w)去与平移矩阵相乘,得出来新的齐次坐标(x,y,z,w)

    旋转矩阵

    旋转矩阵官方并没有给出,但可以从

    Return a transform which rotates by `angle' radians:

    t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */

    CG_EXTERNCGAffineTransformCGAffineTransformMakeRotation(CGFloatangle)

    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

    CAAffineTransform推导出来,但我自己喜欢用几何的方法描述物体的旋转,毕竟代数的方法不客观,我们在看看CATransform3DMakeRotation的方法

    Returns a transform that rotates by 'angle' radians about the vector

    * '(x, y, z)'. If the vector has length zero the identity transform is

    * returned. */

    CA_EXTERN CATransform3D CATransform3DMakeRotation

    (CGFloatangle,CGFloatx,CGFloaty,CGFloatz)

    __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

          这里可以看到,我们给定了4个参数,第一个参数是角度,就是旋转的角度,而后面三个参数是一个向量(x,y,z),不难看出vector是向量的意思,就是你根据一个向量和角度来确认旋转的方向和角度,这里涉及的计算比较复杂,简单的认为就是你的图形会在你给的向量方向(x,y,z)的垂直面上�再旋转angle角度,简述如下:

    一个点绕过原点的轴u旋转等价于分别绕x y z轴旋转特定的角度 


            PS:如果还想深入理解的小伙伴,可以看下计算机图形学相关的知识,其实都是想通的原理,不需要因为设计到什么数学知识去害怕他,因为用的话参考我第一篇文章就可以简单使用了,不过想深入了解,原理是必不可少的,考虑到现在App不怎么做到3维动画,所以三维动画的暂时就先告一段落,下次会带来比较适用自定义转场😎

    相关文章

      网友评论

          本文标题:谈CoreAnimation 中的CATransform3D

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