博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用CATransform3D实现3D效果和制作简单3D动画
阅读量:6659 次
发布时间:2019-06-25

本文共 3226 字,大约阅读时间需要 10 分钟。

我们先来看下CATransform3D的头文件

struct CATransform3D{  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是一个4 * 4结构体, 另外它还有一个弟弟CGAffineTransform是 3 * 3结构体

他们的区别看名字就很明显,

CATransform3D是做3D坐标变换, 经常适用于CALayer

CGAffineTransform是做2D坐标变换, 经常适用于UIView

CATransform3D这个结构体中, 我们使用最多的是m34 后面我们再来说这个, 先知道就好了

 

我们继续看下CATransform3D头文件中的其他内容

CA_EXTERN const CATransform3D CATransform3DIdentity;//一个无任何变换的默认矩阵常量,可用于使变换后的Layer恢复初始状态 CA_EXTERN bool CATransform3DIsIdentity (CATransform3D t); //判断是否为默认矩阵CA_EXTERN bool CATransform3DEqualToTransform (CATransform3D a,    CATransform3D b); //判断两个矩阵是否相同CA_EXTERN CATransform3D CATransform3DMakeTranslation (CGFloat tx,    CGFloat ty, CGFloat tz);//生成一个依照参数平移转换后的矩阵 CA_EXTERN CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy,    CGFloat sz);//生成一个依照参数缩放后的CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x,    CGFloat y, CGFloat z);//生成一个依照参数旋转后的矩
CA_EXTERN CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz); //变换指定的矩阵 CA_EXTERN CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz); //变换指定的矩阵 CA_EXTERN CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z); //变换指定的矩阵 //需要注意的是x/y/z三个参数均为指定旋转轴,可选值0和1,0代表此轴不做旋转,1代表作旋转。 例如想对x、y轴做45度旋转,则angle = M____PI____4,x = 1,y = 1,z = 0。 另外,旋转角度为弧度制哦,不是角度制 CA_EXTERN CATransform3D CATransform3DConcat (CATransform3D a, CATransform3D b); //计算两个矩阵的乘积 CA_EXTERN CATransform3D CATransform3DInvert (CATransform3D t); //反转矩阵 CA_EXTERN CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m); //通过2D得到一个3D矩阵 CA_EXTERN bool CATransform3DIsAffine (CATransform3D t); //判断3D矩阵是否可以用2D矩阵表示 CA_EXTERN CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t); //从3D矩阵中获取2D矩阵

我们先看一个简单的例子, 实现一个矩形向内翻转

上代码:

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {        [super viewDidLoad];        //创建CALayer    CALayer * staticLayerA       = [CALayer layer];    staticLayerA.bounds          = CGRectMake(0, 0, 100, 100);    staticLayerA.position        = self.view.center;    staticLayerA.backgroundColor = [UIColor redColor].CGColor;        //添加到主界面    [self.view.layer addSublayer:staticLayerA];        //创建CATransform3D默认变换矩阵    CATransform3D transA = CATransform3DIdentity;        //调整m34, 向里偏500个单位    transA.m34           = - 1.0 / 500;        //设置沿x轴偏转60度    transA               = CATransform3DRotate(transA, M_PI / 3, 1, 0, 0);        //设置Layer3D偏转    staticLayerA.transform = transA;}

代码里M34 = - 1.0 / 500 的意思就是图层距离屏幕向里500的单位。如果向外则是M34 = 1.0 / 500。这个距离至一般掌握至500~1000这个范围会取得不错的效果。

这里需要注意的是M34的赋值一定要写在矩阵变换前面

 

可以再用BasicAnimation来实现3D动画, 用关键字: Transform

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];    animation.duration     = 2;    animation.repeatCount  = 100;    animation.autoreverses = YES;    animation.toValue      = [NSValue valueWithCATransform3D:transA];        [staticLayerA addAnimation:animation forKey:nil];

 

大家可以试试看效果

 

转载于:https://www.cnblogs.com/zhouxihi/p/6277868.html

你可能感兴趣的文章
传统的继承在JavaScript中的应用
查看>>
上大学=读书?
查看>>
【VMCloud云平台】SCOM配置(七)-创建自定义性能规则
查看>>
书摘—跟鬼谷子学处世 跟菜根谭学修身
查看>>
cocos2d-x自制工具07:打印cocos2d-x的节点树
查看>>
Java注解不完全总结
查看>>
《第一行代码:以太坊》已经出版,开始连载了,购买送视频课程
查看>>
配置Lotus Domino集群视频详解
查看>>
第五集思科交换机路由器IOS之初体验
查看>>
《Windows Server 2012 Hyper-V虚拟化管理实践》即将上市
查看>>
Hive官方手册翻译(Getting Started)
查看>>
针对Redis队列的理解,实例操作
查看>>
ARP 攻击
查看>>
Struts1.x系列教程(7):Logic标签库
查看>>
管理软件要求
查看>>
求一个阶乘数尾零的个数
查看>>
Js拖拽一个简单方法
查看>>
Asp.net MVC DefaultModelBinder分析
查看>>
Digital Square(hdu 数论 4394,bfs求后n位相同)
查看>>
Delphi异步socket通讯组件
查看>>