在图层上使用CATransform3D制做三维动画-b

在UIView上,我们可以使用CGAffineTransform来对视图进行:平移(translation),旋转(Rotation),缩 放(scale),倾斜(Invert)操作,但这些操作是没有动态立体效果的, 这只能称为二维变形.而在图层中,我们可以使用CATransform3D进行"视角旋转"来完成三维变形的效果,但这常称为2.5D,而非真正意义上的 3D,因为他不能让图层真正成为三维对象,而只是模拟出三维的动画效果.

请看三维动画效果:

下面我就来一步一步的来实现它.
1.从图中的显示效果来看,我们需要创建六个图层,来表示一个立体图形六个不同的面.并且创建一个CATransformLayer类来作为容器:

/**底部容器*/@property (nonatomic,strong) CATransformLayer *contentLayer;/**上面*/@property (nonatomic,strong) CALayer *topLayer;/**下面*/@property (nonatomic,strong) CALayer *bottomLayer;/**左面*/@property (nonatomic,strong) CALayer *leftLayer;/**右面*/@property (nonatomic,strong) CALayer *rightLayer;/**前面*/@property (nonatomic,strong) CALayer *frontLayer;/**后面*/@property (nonatomic,strong) CALayer *backLayer;

通常情况下,像这种批量创建对象的工作,不要做傻傻的码农,要学会封装,这样我们只需要传入图层所必须的变量参数就可以创建一个图层了.

- (CALayer *)layerAtX:(CGFloat)x y:(CGFloat)y z:(CGFloat)z color:(UIColor *)color transform:(CATransform3D)transform{    CALayer *layer = [CALayer layer];
    layer.backgroundColor = color.CGColor;
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.position = CGPointMake(x, y);
    layer.zPosition = z;
    layer.transform = transform;
    [self.contentLayer addSublayer:layer];    return layer;
}

其中,我要说一下上面代码中layer的zPosition与transfrom属性,在这个例子中,我会使用CATransformLayer 类,这个类是CALayer的子类,在官方文档上有一句话是这么描述的"CATransformlayer objects are used to create sure 3D layer hierarchies".那他到底和CALayer有什么区别呢?是这样的.在CALayer中的zPosition属性,如果只使用CALayer, 那么zPosition只能用于计算图层的显示顺序,这样会使图形看起来是扁平的.而在CATransformLayer这个类当中,zPosition 就可以用来决定空间位置.他会让图形的position不限于X,Y轴上,也可以在Z轴上设置相应值来让图形添加景深,从而让图形具有立体效果.所 以,x,y,z分别是X轴,Y轴,Z轴方向的值.

下面说说本文的核心部分:CALayer的transfrom属性:这个属性主要是操作CATranfrom3D类对图层进行三维变形.在我们这个例子中,主要是对图层进行旋转,所以着重讲一下CATranfrom3D类当中进行3D旋转的方法:

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

可以看出来,这是一个c语言封装好的函数,里面的参数我来说明:第一个参数:里面的角度是图层需要旋转的角度,是以弧度为单位,我列举一下几个常用 的:M_PI是表示180度,M_PI_2表示90度,M_PI_4表示45度.后面的三个参数x,y,z:我们知道,在二维形变中,旋转效果是围绕着一 个点进行变化的,而在三维变化中,却是围绕着一条轴.而这三个参数在立体平面中的坐标系中确定一个点,这个点与圆点(左上角)的连线确定一条轴,我举一个 特殊的例子:比如绕着y轴旋转45度?绕着y轴旋转,那么必然这三个参数确定的点在Y轴上,在Y轴上,那么其他值必然为0,所以里面的参数应该这样 填:CATransform3DMakeRotation (M_PI_4, 0, 1, 0);

好了,那么现在初始化CATransformLayer,然后将六个图层添加到这个容器中.

    // 创建CATransformLayer对象
    CATransformLayer *contentLayer = [CATransformLayer layer];
    contentLayer.frame =self.view.layer.bounds;
    CGSize size = contentLayer.bounds.size;
    contentLayer.transform = CATransform3DMakeTranslation(size.width / 2, size.height / 2, 0);
    self.contentLayer = contentLayer;
    [self.view.layer addSublayer:contentLayer];// 初始化六个图层
    // 顶部与底部的沿着x轴旋转90度
    self.topLayer = [self layerAtX:0 y:-kSize/2  z:0 color:[UIColor redColor] transform:CATransform3DMakeRotation(M_PI_2, 1, 0, 0)];

    self.bottomLayer = [self layerAtX:0 y:kSize/2 z:0 color:[UIColor greenColor] transform:CATransform3DMakeRotation(M_PI_2, 1, 0, 0)];    // 左边与右边的沿着y轴旋转90度
    self.leftLayer = [self layerAtX:-kSize / 2 y:0 z:0 color:[UIColor blueColor] transform:CATransform3DMakeRotation(M_PI_2, 0, 1, 0)];

    self.rightLayer = [self layerAtX:kSize/2 y:0 z:0 color:[UIColor blackColor] transform:CATransform3DMakeRotation(M_PI_2, 0, 1, 0)];    // 前面与后面的不需要变化,所以使用CATransform3DIdentity
    self.frontLayer = [self layerAtX:0 y:0 z:kSize / 2 color:[UIColor brownColor] transform:CATransform3DIdentity];

    self.backLayer = [self layerAtX:0 y:0 z:-kSize / 2 color:[UIColor brownColor] transform:CATransform3DIdentity];

说明一点:kSize 是我定义的一个宏,表示的是这个正方体的边长.
现在的视图上显示的是什么效果呢

为什么只显示前面图层给的brownColor呢?这就是对的,由于旋转90度后,上下与左右都收在前面图层的四侧,与视图垂直,所以我们看不到,那么我就给一个pan手势,随着手指的移动,旋转这个立体图形.

- (void)pan:(UIPanGestureRecognizer *)recognizer{   //获取到的是手指移动后,在相对坐标中的偏移量(以手指接触屏幕的第一个点为坐标原点)
    CGPoint translation = [recognizer translationInView:self.view];
    CATransform3D transform = CATransform3DIdentity;
    transform = CATransform3DRotate(transform, translation.x * 1 / 100, 0, 1, 0);
    transform = CATransform3DRotate(transform, translation.y * - 1 / 100, 1, 0, 0);
    self.view.layer.sublayerTransform = transform;

}
时间: 2024-11-06 07:22:55

在图层上使用CATransform3D制做三维动画-b的相关文章

【影视动画】三维动画是怎么制作出来的?

三维动画的制作流程是怎样的?常见的三维动画制作流程分为三大流程:1.前期规划.2.中期制作.3.后期制作,这里完美君将采用真实的案例对三维动画制作流程进行详细讲解,相信很容易理解: 一.前期规划 1)剧本.故事板俗称“脚本”. 2)概念设计—业内通用的专业动画流程前期制作. 3)分镜故事板—根据文字创意剧本进行的实际制作的分镜头工作:解释镜头运动:讲述情节给后面三维制作提供参考. 二.中期制作 1) 3D模型——在三维软件中由建模人员制作出故事的场景模型,为Layout做准. 2) 贴图材质——

浙江大学软件学院三维动画与交互技术考试概念整理

第一讲 1.    增强现实技术AR: --融合了三维动画.立体视觉和图像处理: --建模.渲染.位置标定.图像融合: 2.    OpenGL是一种用于创建实时3D图像的编程接口. 3.    三维这个术语表示一个正在描述或显示的物体具有三维维度:宽度.高度.深度: --计算机3D图形实质上也是平面的: --在计算机屏幕上显示的二维图像,提供深度(或第三维)的错觉: 2D+透视 = 3D 透视使人产生深度的错觉. 4.    真正的3D是通过人的两只眼睛观察同一个物体,在视网膜上生成具有视差的

三维动画制作技术的革新和应用

三维动画制作技术快速发展,因此在技术方面有很大的革新,因此在游戏设计.影视动画,和电影作品中都有很大的发展.随着人们对视觉感官越来越高,同时也是游戏设计.动画设计和影视设计的画面的要求也高了,因此更加需要页面效果更加的美观. 三维动画又称3D动画,以设计制作的动画图案形象.角色造型设计.角色衣服和场景上色.场景动作建模等一系列工序为主要工作职责,这样子说吧,就是利用三维动画软件在一个虚拟的真实的世界里,按照要表现对象的形状尺寸,建立模型以及场景,再根据要求设定模型的运动轨迹.虚拟摄影机的运动和其

三维动画设计及应用

在今天,三维动画设计,在虚拟现实应用中已成为一种流行文化,该技术的出现为各行业提供了很多的帮助.之前,素描本上的工作被搬到了计算机上,工业设计和工程建设不再用真实的模型,都可以在电脑上看到他们做成后的效果图,这样就节省了很多的成本,其中,三维动画设计还应用在多个行业的快速发展中,也为很多行业提供了出色的作品. 1.三维动画设计应用在游戏动画 三维动画设计的软件主要是有EA.Epic.SEGA等,她大量应用于游戏的场景设计.角色造型建模和角色动作的设计,以及游戏动画的特效声音场景的制作. 2.三维

学三维动画要用数位板吗?

学三维动画要用数位板. 三维动画又称3D动画,随着计算机软硬件技术的发展而产生的一新兴技术.三维动画软件在计算机中首先建立一个虚拟的世界,设计师在这个虚拟的三维世界中按照要表现的对象的形状尺寸建立模型以及场景,再根据要求设定模型的运动轨迹.虚拟摄影机的运动和其它动画参数,最后按要求为模型赋上特定的材质,并打上灯光.当这一切完成后就可以让计算机自动运算,生成最后的画面. 三维动画技术模拟真实物体的方式使其成为一个有用的工具.由于其精确性.真实性和无限的可操作性,被广泛应用于医学.教育.军事.娱乐等

如何在三维动画制作中布光

在三维动画制作中有多种打光方法,三点照明法是三维动画用光的一种基本方法,它操作简单,适用于很多类型的场景.例如,摄影.电影电视等.三点照明法顾名思义就是一种使用三个光的方法.这三个灯光分别是:主光源.辅助光源和底部光源.正是这三种灯光构成了经典的三点照明法.在三维场景中,我们仍旧可以使用这种方法为物体打光. 1.添加主光源 主光源,顾名思义就是物体的主要照明灯光,一般情况都勾选了阴影.主光源光代表了场景的主要光源,但是主光源不必一定处于这些光源的实际位置.在一般场景中,建立一个聚光灯作为主光源.

园林景观与三维动画,北京华锐视点

三维动画现在已经在很多的行业都已经运用到了,现在很多的行业在制作产品的时候总是会先进行一次模拟的,那么大部分都是会运用三维动画进行制作完成的.现代城市中园林景观也是有着很大的方方面面的,在制作园林景观的时候也是会先运用下三维动画进行一次全模的. 园林景观3D动画是将园林规划建设方案,用3D动画表现的一种方案演示方式.其效果真实.立体.生动,是传统效果图所无法比拟的.园林景观动画将传统的规划方案,从纸上或沙盘上演变到了电脑中,真实还原了一个虚拟的园林景观.目前,动画在三维技术制作大量植物模型上有了

三维动画制作带来的震撼视觉的之美

很多普通拍摄做不到的事,三维动画可以做到.三维动画制作的造型艺术具有很大的变化空间,也能突出人物的身份和情感表现,创作者可以通过技术对三维状态中的人物形态和动作等方面进行虚拟化的设计,同时也可以适当地使部分的细节放大化,这就实现了视觉上的强烈冲击,让观众更能感受到三维动画的造型关. 例如美国制作的动画<白雪公主>就通过采用圆润的弧线来实现造型的呈现,并且也遵从了儿童的心理审美认识,让人产生一种温暖.踏实的感觉,这一点对其他年龄的观众也具有一定的吸引作用,动画人物极富夸张.搞怪的表情与现实产生了

北京华锐视点介绍三维动画的应用领域

华锐视点主营业务是为国内政府单位和民营企业提供专业的虚拟现实解决方案,包括:智慧城市综合解决方案.商业地产虚拟仿真系统.数字城市.展览展示.城市规划.数字沙盘.城市应用.三维动画.环幕立体.园林景观.工业流程模拟.Ipad售楼系统.景区三维展示.网络三维展馆.三维培训课件.水利电力GIS系统等一体化的服务以及全方位的解决方案. 随着21世纪计算机三维影像技术的不断发展,三维动画技术凭着比平面图更直观,更能给观赏者以身临其境感觉的特征,三维图形技术越来越被人们所看重.尤其适用于那些尚未实现或准备实