您的位置:首页 > 移动开发 > IOS开发

IOS 三维图像处理(九)--CATransform3D

2016-04-07 10:04 417 查看
转自:http://blog.sina.com.cn/s/blog_51a995b70101mz3q.html

structCATransform3D

{CGFloatm11(x缩放), m12(y切变), m13(旋转), m14;

CGFloatm21(x切变), m22(y缩放), m23, m24;

CGFloatm31(旋转), m32, m33, m34(透视效果,要操作的对象要有旋转的角度,不然没效果);

CGFloatm41(x平移), m42(y平移), m43(z平移), m44;};

m34透视效果,一般通过-1.0/d来应用透视效果,d代表想象中视觉相机与屏幕之间的距离,以像素为单位,通常500-1000j就已经很好了。

注:使用3D变换的时候要注意灭点,统一设置所有图层共享一个灭点

CATransform3D perspective = CATransform3DIdentity;

perspective.m34 = - 1.0 / 500.0;

self.containerView.layer.sublayerTransform = perspective;

CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloattz)

tx:X轴偏移位置,往下为正数。

ty:Y轴偏移位置,往右为正数。

tz:Z轴偏移位置,往外为正数。

CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz);

sx:X轴缩放,代表一个缩放比例,一般都是0 --- 1 之间的数字。

sy:Y轴缩放。

sz:整体比例变换时,也就是m11(sx)==m22(sy)时,若m33(sz)>1,图形整体缩小,若0<1,图形整体放大,若m33(sz)<0,发生关于原点的对称等比变换。

CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z);

angle:旋转的弧度,所以要把角度转换成弧度:角度* M_PI / 180。

x:向X轴方向旋转。值范围-1--- 1之间

y:向Y轴方向旋转。值范围-1 ---1之间

z:向Z轴方向旋转。值范围-1 ---1之间

CATransform3DContact 把动作combine在一起

文/lucifrom_(简书作者)

原文链接:http://www.jianshu.com/p/44080eec7a1c

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

换换函数:

CATransform3D CATransform3DMakeTranslation (CGFloat
tx, CGFloat ty, CGFloat tz)

tx:X轴偏移位置,往下为正数。

ty:Y轴偏移位置,往右为正数。

tz:Z轴偏移位置,往外为正数。

例:

如果有2个图层,一个是绿色的,一个是红色的。先加载绿色,后加载红色。

tx,ty的左右偏移先不说了。

如果绿色的tz为-10 ,红色的tz为 0 效果如下。



如果绿色的tz为 0 ,红色的tz为-10 效果如下。



对于tz来说,值越大,那么图层就越往外(接近屏幕),值越小,图层越往里(屏幕里)。

CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);

t:就是上一个函数。其他的都一样。

就可以理解为:函数的叠加,效果的叠加。

CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat
sy, CGFloat sz);

sx:X轴缩放,代表一个缩放比例,一般都是 0 --- 1 之间的数字。

sy:Y轴缩放。

sz:整体比例变换时,也就是m11(sx)== m22(sy)时,若m33(sz)>1,图形整体缩小,若0<1,图形整体放大,若m33(sz)<0,发生关于原点的对称等比变换。

当sx = 1,sy = 1时。如图:



当sx = 0.5,sy = 0.5时。如图:



CATransform3D CATransform3DScale (CATransform3D t, CGFloat
sx, CGFloat sy, CGFloat sz)

 

t:就是上一个函数。其他的都一样。

就可以理解为:函数的叠加,效果的叠加。

CATransform3D CATransform3DMakeRotation (CGFloat angle,
CGFloat x, CGFloat y, CGFloat z);

旋转效果。

angle:旋转的弧度,所以要把角度转换成弧度:角度 * M_PI / 180。

x:向X轴方向旋转。值范围-1 --- 1之间

y:向Y轴方向旋转。值范围-1 --- 1之间

z:向Z轴方向旋转。值范围-1 --- 1之间

例:向X轴旋转60度。           向Y轴旋转60度。                 向Z轴旋转60度。


              

         


向 X轴,Y轴都旋转60度,就是沿着对角线旋转。



可以通过X,Y,Z轴同时变化,来旋转图像。

CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);

 

t:就是上一个函数。其他的都一样。

就可以理解为:函数的叠加,效果的叠加。

CATransform3D CATransform3DInvert (CATransform3D t);

翻转效果。

               未使用                           使用


  


CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t);

bool CATransform3DIsAffine (CATransform3D t);

仿射效果。

就是把一个 CATransform3D 对象转换成一个 CGAffineTransform 对象。

也就是把 CATransform3D 矩阵 转换成 CGAffineTransform 矩阵

 

变换函数同时提供了可以比较一个变换矩阵是否是单位矩阵,或者两个矩阵是否相等。

bool CATransform3DIsIdentity (CATransform3D
t);

bool CATransform3DEqualToTransform
(CATransform3D a, CATransform3D b);

也可以通过修改数据结构和键值来设置变换效果。

 

struct CATransform3D
{

CGFloat m11, m12, m13, m14;

CGFloat m21, m22, m23, m24;

CGFloat m31, m32, m33, m34;

CGFloat m41, m42, m43, m44;
}
可以直接修改 其中的一个值,来达到相同的效果。

或者修改键值
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"];


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: