各位看官老爷大家好,在我第一次的的文章里有简单介绍怎么用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维动画,所以三维动画的暂时就先告一段落,下次会带来比较适用自定义转场😎
网友评论