我们先来看下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(, , , );
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 / ; //设置沿x轴偏转60度
transA = CATransform3DRotate(transA, M_PI / , , , ); //设置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 = ;
animation.repeatCount = ;
animation.autoreverses = YES;
animation.toValue = [NSValue valueWithCATransform3D:transA]; [staticLayerA addAnimation:animation forKey:nil];

大家可以试试看效果

用CATransform3D实现3D效果和制作简单3D动画的更多相关文章

  1. css制作简单loading动画效果【css3 loading加载动画】

    曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来.比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就 ...

  2. CSS制作简单loading动画

    曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来.比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就 ...

  3. transform 的旋转 ,3d效果,要添加3d效果的父级加上景深perspective。 3d效果的容器加上 transform-style:preserve-3d。

    该技术用于创建一个多维的数据,在这个实例中使用了两个元素用于正面和反面.前面用来放置产品图片,底部用来放置产品信息.默认情况下产品信息隐藏起来,同时鼠标悬停在产品图片上时,隐藏在底部的产品信息在X轴放 ...

  4. 用Laya制作简单的动画

    (function () { var layaGameInit = window.layaGameInit || {}; var WebGL = Laya.WebGL; var Browser = L ...

  5. 如何制作简单的 3D 打印模型

    Hi 大家好! 了解一个方兴未艾,但极为有趣的话题 — 3D 打印 . 为了帮助大家对3D打印有一个初步的感性认识,我在线制作了一款可用于3D打印的model, 大家可以先通过体验这个在线 model ...

  6. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  7. 视频特效制作:如何给视频添加边框、水印、动画以及3D效果

    2014-12-08 09:47 编辑: suiling 分类:iOS开发 来源:叶孤城的blog 招聘信息: iOS手机软件开发工程师 iOS工程师 Web后端高级开发工程师 iOS软件工程师 ja ...

  8. 简单3D翻页相册制作教程

    3D效果看起来总是要比平面的图形看起来视觉效果要好的多,今天来教大家制作简单的3D翻页效果的视频. 视频预览链接:https://v.youku.com/v_show/id_XMzgxOTY5NzQz ...

  9. 初步认识Swiper_前端交互控制神器_滚动3D切换等特效简单制作

    前言: 本人在项目的工作中负责研发,页面及交互基本都是交给前端去做的.以前前端写的东西大概都知道,都是一些JS,CSS和HTML等的一些基本控制,都懂!但是今天前端突然做了一个具有特殊效果的DOM:页 ...

随机推荐

  1. python向mysql中存储JSON及Nodejs取出

    虽然把JSON数据存入mysql也是比较蛋疼,但是相比使用Nodejs嵌套处理多个mysql查询并拼接返回数据也算是没mongo时的一个折中方案了. 我使用python拼接了一个json格式的字符串, ...

  2. iOS文档序列化(对象归档)

    对象归档: 概念: 对象归档是指将对象写入文件保存在硬盘,当再次又一次打开程序时,能够还原这些对象.也称:对象序列化.对象持久化. 数据持久性的方式(事实上就是3类) 1,NSKeyedArchive ...

  3. Windows 7上使用HP QC的问题

    C(Quantity Center)是一款不错的测试管理工具,最近把公司的操作系统从Windows XP升级到Windows 7之后,发现登录到QC Server的Addin页面,很多客户端组件不能正 ...

  4. J2EE开发HelloWorld

    J2EE开发实战基础系列一 HelloWorld 开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如 ...

  5. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  6. MVC之前的那点事儿系列进入CLR

    MVC之前的那点事儿系列(1):进入CLR MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译 ...

  7. Android手机外置SD卡(TF卡)的获取方法

    Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G.32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此 ...

  8. Dom解析xml源代码

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import ja ...

  9. MS SQL优化

    数据库优化实践[MS SQL优化开篇]   数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应 ...

  10. 增删查改-MySQL

    查询: 在MySQL中,select的基本语法形式: select 属性列表 from 表名和视图 [where 条件表达式] [group by 属性名 [having 条件表达式]] [order ...