AR星球家族联盟

我们现在做一个简单的案例,所谓星球家族联盟,我们这里通过切换空间中球型体改变不同的星球图片,把这一家子聚到一起碰个面.

我已经找了星球图片,当然你的图片越多,你的星球联盟家族越富有.

地球.png
木星.png
金星.png
火星.png

把这几张图片拖入到您的项目中.
首先呢,我们先创建星球家族数组,把这个星球放到一起

let plantFamily = ["地球.png","木星.png","金星.png","火星.png"]

同时,需要定义,我们的索引值,下面手势code中会使用到

index = 1

同创建立方体一样,创建我们的球型模型
我们继续,创建场景

let scene = SCNScene()

接下来,创建几个模型

let sphere = SCNSphere(radius:0.1)

创建渲染器

let material = SCNMaterial()

给我的球型模型加上衣服

material.diffuse.contents = UIImage(named:"地球.png")
sphere.materials = [material]

好了,
接下来我们继续创建球型节点

let sphereNode = SCNNode(geometry:sphere)

我们设置球型节点的位置

sphereNode.postition = SCNVector3(0,0,-0.5)

就在您的正前方50公分处
我们在把节点添加到根节点上面

scene.rootNode.addChildNode(sphereNode)

把场景添加到视图上

sceneView.scene = scene

到这里呢,我们已经完成了一半了,花费几分钟,很快就把地球给创建好了,运行一下看看,我们的成果,还蛮不错吧.

接下来,我们要完成另一半的任务了
就是进行星球切换交互呢?
我们就简单制作吧
我们就在视图增加一个手势吧
讲到手势,大家开发很长时间了,使用手势都不会太陌生的.
ok,我们来创建注册手势!

let tapGes = UITapGestureRecognizer(target:self,action:#selector(tapped))

把手势添加到场景视图

self.sceneView.addGestureRecognizer(tapGes)

然后,创建我们的tapped方法

@objc func tapped(regcognizer:UIGestureRecognizer){
}

我们所有的切换功能要在tapped方法中实现了哦,
我们先获取场景视图吧.

let sceneV = regcognizer.view as! ARSCNView

获取单击位置的CGPoint点

let touchuLoaction = regcognizer.location(in: sceneV)

我们在获取点击结果

let hitRes = scneneView.hitTest(touchLoaction,options:[:])

我们获取了hitRes结果后,我们首先要判断hitRes是否为空

if !hitResults.isEmpty{
}

如果不为空,才是我们接下来要做的,所以我们判断不是空数组的话,我们继续我们的code.
当我们的索引值与数组的个数相同的时候呢,首先我们判断,让它的索引值为0

if index == self. plantFamily.count{
   index =0
}

我们在判断星球家族数组的第一项是否存在呢,

guard let hitRes = hitRes.first else{
      return 
}

获取节点

let node = hitRes.node

我们获取到节点后,我们就可以进行图片切换交互了

node.geometry?.firstMaterial?.diffuse.contents = UIImage(named: plantFamily[index])

我们的索引值+1

index += 1

ok,到这里,大功告成!!.
我们任务完成了.
是不是挺惊喜的,
一番努力后,
自己是不是对ARkit,
又有了进一层的了解.

你可能感兴趣的:(AR星球家族联盟)