204959c3babc277ee35aa66c86e551d0
41-如何仿写一个简易版的 Holokit

说明

ARKit系列文章目录

Holokit 简介

Holokit 是一个利用 ARKit 制作的 app,它先以 AR 形式在地面上放上虚拟物体,然后点击右上角的 MR 按钮,进入到 MR 模式。配合十几块钱的纸盒子和半透半反膜,就能让手机上的虚拟物体出现在现实中。


基本思路

基本思路是利用 ARKit 建立场景,并进行 6Dof 的追踪,这样就能知道 3D 模型在什么位置,相机(即手机)在什么位置。

然后另外再建立一个 SceneKit 场景,背景设置为黑色,这个场景中添加一个同样的 3D 模型。然后再加两个相机,分别对应左视图和右视图。

接下来就是同步的工作了,当 AR 场景中的 3D 物体或者相机位置发生移动时,我们手动对 SceneKit 中的 3D 物体和头部 node 位置进行调整。

需要注意的细节

基本思路非常简单,但还是有一些细节需要处理。

如何让两只眼从不同位置看到同一个场景

这点其实非常简单,SceneKit 提供了 SCNView 与 camera 绑定的操作,我们可以让左右两个视图观看同一个场景,但使用的是不同的 camera

// 左视图看到的场景
leftView.scene = self.sceneForEyes;
// 左视图与左相机关联
leftView.pointOfView = self.leftCameraNode;

// 右视图看到的场景
rightView.scene = self.sceneForEyes;
// 右视图与右相机关联
rightView.pointOfView = self.rightCameraNode;

如何保证两只眼的相对位置始终正确

SceneKit 中有了代表左右眼的相机 Node,但是它们不能独立旋转,因为人是通过转动头部来让两只眼看另一个方向的。

什么意思呢?就是当朝左看看,我们想要的不是下面的效果

而是下面这样的效果。也就是说两个相机要在同一个父结点上,比如说 headNode。当需要转动时,不是直接转动两个相机,而是转动头部 Node,带动两个相机移动。

```objc
// 双目场景中代表头部的 Node
SCNNode *headNode = [SCNNode node];
self.headNode = headNode;
[self.sceneForEyes.rootNode addChildNode:headNode];

// 添加两个相机,对应左右眼视图
SCNNode *leftCameraNode = [SCNNode node];
self.leftCameraNode = leftCameraNode;
leftCameraNode.camera = [SCNCamera camera];
leftCameraNode.camera.zNear = 0;
top Created with Sketch.