简介:

上篇回看:

ARKit初探篇(链接)中写到怎么样开启一个AR项目,包涵支付条件,建立项目,及基础代码落成,在git的demo添加了手势的拍卖,简单达成点击球体落成渲染图轮换

初稿地址:http://www.2bjs.com

迎接插手q群 150731459

本篇介绍:

将虚拟世界与真正世界结合起来,那么真实世界是活的,那么虚拟世界也将是活的,那样才能让用户傻傻的分不清现实世界与虚拟世界;本篇参与了有的卡通(自转/公转)让效果更炫酷,并且对光线进行一些处理,让效果看起来更为实事求是

正文:

效益展示:

心想事成思路:

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在BETA版本中可运行>大家可以仔细看一下demo迎接大家下载,star
(其余demo–关于简单动画)

C博客地址

demo地址: swift版本(新,内带注释)
Xcode9可以运行 下载链接

转发请声明出处
  原文地址:http://www.2bjs.com作者Fujian
Bi

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图