简介:

上篇回顾:

ARKit初探篇(链接)中写到怎样开启一个AR项目,包括开发环境,建立项目,及基础代码实现,在git的demo添加了手势的处理,简单实现点击球体实现图片轮换

本篇介绍:

将虚拟世界与真实世界结合起来,那么真实世界是活的,那么虚拟世界也将是活的,这样才能让用户傻傻的分不清现实世界与虚拟世界;本篇我们将加入一些动画(自转/公转)让效果更炫酷,并且对光线进行一些处理,让效果看起来更加真实

正文:

效果展示:

实现思路:

1.初始化几何节点

2.渲染(图,光线处理)

3.实现-->太阳自转,地球自转,月亮自转

4.根据之间自转与公转关系,处理黄道与白道节点

5.添加光照度看起来更真实

步骤:

1.初始化AR环境必备

@property (nonatomic,strong)ARSCNView *arSCNView;

@property (nonatomic,strong)ARSession *arSession;

@property (nonatomic,strong)ARConfiguration *arSessionConfiguration;

[self.view addSubview:self.arSCNView];

self.arSCNView.delegate = self;

之后懒加载

2.渲染

以太阳节点为例,渲染图

multiply和diffuse这里都设置一下,感觉会真实一点

_sunNode.geometry.firstMaterial.multiply.contents = @"sun";

_sunNode.geometry.firstMaterial.diffuse.contents = @"sun";

multiply (The multiply property specifies a color or an image used to multiply the output fragments with. The computed fragments are multiplied with the multiply value to produce the final fragments. This property may be used for shadow maps, to fade out or tint 3d objects.)

也就是说当我们用这个属性来渲染三维对象的话,会淡化,以太阳为例子,当我们仅仅设置了multiply,显示效果是比较淡的

diffuse(The diffuse property specifies the amount of light diffusely reflected from the surface. The diffuse light is reflected equally in all directions and is therefore independent of the point of view)

diffuse这个属性渲染会均匀扩散到全局,每一个视角,以太阳为例子

当我们把所有两个渲染属性全部设置,那么效果是不是更加真实呢?

wrapS,wrapT,换行模式当我们的太阳转动起来效果就保持原样,看起来真实不会花掉

_sunNode.geometry.firstMaterial.multiply.wrapS =

_sunNode.geometry.firstMaterial.diffuse.wrapS =

_sunNode.geometry.firstMaterial.multiply.wrapT =

_sunNode.geometry.firstMaterial.diffuse.wrapT = SCNWrapModeRepeat;

wrapS从左到右(Determines the receiver's wrap mode for the s texture coordinate. Defaults to SCNWrapModeClamp),wrapT从上到下(Determines the receiver's wrap mode for the t texture coordinate. Defaults to SCNWrapModeClamp),以太阳为例子,假设我们不设置这个属性的话看看效果自转的时候看起来就会很花

设置地球的反光度,太阳照射到地球上的光泽,反多少光泽出去,并且设置反射出的光是什么颜色的光

_earthNode.geometry.firstMaterial.shininess = 0.1; // 光泽

_earthNode.geometry.firstMaterial.specular.intensity = 0.5; // 反射多少光出去

_moonNode.geometry.firstMaterial.specular.contents = [UIColor grayColor];//反射出去的光是什么光

_moonNode.geometry.firstMaterial.specular.contents = [UIColor redColor];当我们此处换为红色的时候地球反光区域所反射出来的光也就是红色

3.实现-->太阳自转,地球自转,月亮自转

以太阳为例子,我们只需要写一个rotateAnimation,设置动画锁需要的时间,旋转fromValue和toValue,然后设置执行次数,将动画添加到太阳节点上,当然与平面世界不同的是我们需要设施3D世界的旋转fromValue和toValue,代码如下

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contentsTransform"];

animation.duration = 10.0;

从000的位置扩展//此时图片在不断的拉伸

animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DConcat(CATransform3DMakeTranslation(0, 0, 0), CATransform3DMakeScale(3, 3, 3))];

animation.toValue = [NSValue valueWithCATransform3D:CATransform3DConcat(CATransform3DMakeTranslation(1, 0, 0), CATransform3DMakeScale(5, 5, 5))];

animation.repeatCount = FLT_MAX;

[_sunNode.geometry.firstMaterial.diffuse addAnimation:animation forKey:@"sun-texture"];

4.根据之间自转与公转关系,处理黄道与白道节点

@property(nonatomic, strong)SCNNode * earthGroupNode;//地月节点

我们完成地球与月球自转后,首先来处理月球与地球的公转,把月球的公转节点添加为地月节点的子节点

以月球为例子的公转动画,代码如下

CABasicAnimation *moonRotationAnimation = [CABasicAnimation animationWithKeyPath:@"rotation"];

moonRotationAnimation.duration = 5.0;

moonRotationAnimation.toValue = [NSValue valueWithSCNVector4:SCNVector4Make(0, 1, 0, M_PI * 2)];

moonRotationAnimation.repeatCount = FLT_MAX;

[moonRotationNode addAnimation:moonRotationAnimation forKey:@"moon rotation around earth"];

[_earthGroupNode addChildNode:moonRotationNode];

地球与月球公转完成,此时我们需要去设置一个黄道,然后把地月节点在添加为黄道的子节点.并且实现地球的公转动画

//添加节点地球绕太阳的节点-黄道

SCNNode *earthRotationNode = [SCNNode node];

[_sunNode addChildNode:earthRotationNode];

[earthRotationNode addChildNode:_earthGroupNode];

此时我们展示效果就来了

5.添加光照度看起来更真实

自转与公转完成后,基本的功能也就完成了,添加光照节点太让效果看起来更真实.光照效果随着距离而改变,此时我们就可以看到上文效果展示中的效果了

lightNode.light.attenuationEndDistance = 20.0;

lightNode.light.attenuationStartDistance = 1.0;

[SCNTransaction begin];

[SCNTransaction setAnimationDuration:1];{

lightNode.light.color = [UIColor whiteColor];

_sunHaloNode.opacity = 0.5;

}

_sunHaloNode = [SCNNode node];

[_sunNode addChildNode:_sunHaloNode];

总结:

本章主要难点为公转与自转的关系,各个节点谁是谁的子节点,首先我们先设置地月节点,然后添加黄道,把动画添加在黄道节点,然后再去处理地球与太阳的关系,当然在动画的处理之后,添加光照度与更全面的渲染也是非常重要的

最后为大家献上本文代码地址,我在git中的demo中也写了注释,大家可以仔细看一下demo欢迎大家下载,star (其他demo--关于简单动画)

ARKit-带你走进全新的世界(二:动画与光线处理)相关推荐

  1. ARKit-带你走进全新的世界(四:平面检测)

    简介: 上篇回顾: 上篇文章中我们简单写了一个AR尺子测量距离的demo,计算距离的公式--> A(x1,y1,z1),B(x2,y2,z2),则A,B之间的距离为d=√[(x1-x2)^2+( ...

  2. 带你走进rsync的世界

    导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...

  3. 【密码学】一万字带您走进密码学的世界(下)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 在<一万字带您走进密 ...

  4. 【密码学】一万字带您走进密码学的世界(上)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 为了使读者对密码学有一个整 ...

  5. 冷链冷库|果蔬保鲜储藏冷链冷库 海格里斯带你走进果蔬冷库世界

    冷链行业涵盖冷冻加工,冷藏贮藏,冷链运输和冷链销售全过程.冷链行业的主要设施包括冷库或低温物流中心.生鲜食品加工中心(包括中央厨房).冷藏运输车.超市陈列柜等.而冷链行业景气度的提升则会带动冷库,冷藏 ...

  6. PX4官方动态 | 带你走进官方教学(二)

    本期是我们第二期官方教学,不知道大家有没有跟着我们一起学习第一期的教学呢,如果没有看过的同学可以点击链接进行第一期的学习后再来看我们第二期内容.在第一期我们告诉了大家学习方法,以及如果从零开始使用PX ...

  7. 轻松带你走进shiro的世界

    2019独角兽企业重金招聘Python工程师标准>>> 1.10分钟带你轻松入门shiro Shiro是apache旗下的一款轻量级的Java安全框架,它可以提供如下服务: Auth ...

  8. vLive带你走进虚拟直播世界

    虚拟直播是什么? 虚拟直播是基于5G+实时渲染技术,在绿幕环境下拍摄画面,通过实时抠像.渲染与合成,再推流到直播平台的一种直播技术.尽管这种技术早已被影视工业所采用,但在全民化进程中却是困难重重,面临 ...

  9. ARKit-带你走进全新的世界(三:追踪/距离感应/AR尺子)

    from: http://blog.csdn.net/Oboe_b/article/details/78009568 简介: 上篇回顾: 在ARKit(光线与动画处理),使用Objective-C在一 ...

最新文章

  1. 我最常用的Intellij IDEA快捷键
  2. 怎样用vc 做一个c语言,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  3. 长沙理工大学计算机系教师,长沙理工大学数学与计算机科学学院导师介绍:王晚生...
  4. excel SUBTOTAL函数使用详解
  5. Golang Tips
  6. 每日关键词-170304-.net,c#分层架构常识
  7. 矩形液体包装纸箱行业调研报告 - 市场现状分析与发展前景预测
  8. android串口service,Android串口操作库:EZ-SerialPort
  9. LDMS 8.8 简明使用手册之客户端配置及部署
  10. javaSocket网络编程
  11. hive教程:第一次使用sql
  12. 音频处理——音频编码原理简介
  13. iphone通过iTunes12.7怎么设置铃声
  14. [强网杯 2019]随便注 —— 堆叠注入
  15. 2D Pose人体关键点实时检测(Python/Android /C++ Demo)
  16. Lenovo Y430P安装Linux无线网卡
  17. Graph Representation Learning via Graphical Mutual Information Maximization
  18. 心情手札——光头日记
  19. Ubuntu下Apache重启错误:Could not reliably determin解决
  20. SEO系列三:周珍谈新手如何快速入门

热门文章

  1. win7右键菜单管理_Win7系统电脑不能搜索到蓝牙设备的解决办法
  2. 粤教版管理计算机中的文件教案,粤教版高中信息技术教案(数据库).doc
  3. 机电一体化概论【2】
  4. 【Linux】Linux基础知识(Linux模块)
  5. 推荐算法遇到后悔药:评蚂蚁的ESCM2模型
  6. html5 语言购物车,基于html5 localStorage的购物车JS脚本详解
  7. 复制帧数据到内存空间
  8. 1.OpenHarmony
  9. 网络监控、上网行为管理产品大解析。
  10. 【面试】1110- 一年前端社招面试总结,入职阿里菜鸟