close
当前位置: 物联网在线 > 技术文库 > ios >

iOS 借助 ARKit 实现六自由度的 VR

iOS 借助 ARKit 实现六自由度的 VR

图展示了『前后左右上下+头部随动』即六自由度的VR效果。

原理解析 涉及的库

ARKit & SceneKit

原理

github上有Google CardBoard供大家使用,也有早期某好人开源后不更新的版本。

我接触SceneKit发现可以便捷的实现VR效果,当然需要舍弃一部分内容。

个人以为,VR项目中核心组成有三:渲染引擎,九轴算法,反畸变算法。在此处我们可以基本舍弃反畸变算法与九轴算法,依靠SceneKit实现渲染部分。

iOS 借助 ARKit 实现六自由度的 VR

层级关系

直接使用Xcode9beta在ARKit新建工程Demo的基础上添加ARSCNView双屏即可。

// retrieve the SCNView SCNView *scnViewLeft = [[SCNView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width*0.5, self.view.frame.size.height)]; scnViewLeft.pointOfView = cameraNodeLeft; scnViewLeft.scene = scene; scnViewLeft.backgroundColor = [UIColor blackColor]; [self.sceneView addSubview:scnViewLeft]; SCNView *scnViewRight = [[SCNView alloc]initWithFrame:CGRectMake(self.view.frame.size.width*0.5, 0, 0.5*self.view.frame.size.width, self.view.frame.size.height)]; scnViewRight.pointOfView = cameraNodeRight; scnViewRight.scene = scene; scnViewRight.backgroundColor = [UIColor blackColor]; [self.sceneView addSubview:scnViewRight]; 关于自由度

目前iPhone上可以下载到的VRAPP基本都是三自由度,即围绕XYZ三轴心旋转实现camera跟随头部转动的效果。用户无法自由移动从而接近或沿四周观察物体。手机在不借助外接设备的情况下实现VR空间定位的产品目前基本没有。但是借助ARKit,我们可以实现且误差估计在十厘米左右。

iOS 借助 ARKit 实现六自由度的 VR

六轴自由度

图示为六自由度,三自由度为去除up/down,left/right,forward/back三轴的剩余部分。

Part3 VR部分的实现 Camera设置

在此Demo中需要注意的就是camera的设置。与一般游戏开发不同的是,我们这里需要2个camera,分别用于左右眼内容显示。

iOS 借助 ARKit 实现六自由度的 VR

因为左右眼内容实际是不一样的,所以需要2个camera在增强视差实现立体效果。

考虑到后续需要2个眼睛随着头部转动,会产生位移与旋转,所以我们需要增加一个新的camera作为2个camera的容器。

// Containor Camera. _cameraNode = [SCNNode node]; _cameraNode.camera = [SCNCamera camera]; [_cameraNode setPosition:SCNVector3Make(0, 0, 0)]; [scene.rootNode addChildNode:_cameraNode]; // Camera left SCNNode *cameraNodeLeft = [SCNNode node]; cameraNodeLeft.camera = [SCNCamera camera]; [cameraNodeLeft setPosition:SCNVector3Make(-0.1, 0, 0)]; [_cameraNode addChildNode:cameraNodeLeft]; // Camera right SCNNode *cameraNodeRight = [SCNNode node]; cameraNodeRight.camera = [SCNCamera camera]; [cameraNodeRight setPosition:SCNVector3Make(0.1, 0, 0)]; [_cameraNode addChildNode:cameraNodeRight];

之后针对摄像头组的矩阵直接赋与containor camera即可。

关于摄像头的空间坐标

借助WWDC2017发布的ARKit-ARCamera.transform实现头部随动与空间定位。

#pragma mark - ARSessionDelegate - (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame { // Retrive the matrix from ARKit - ARFrame - camera. _transform = frame.camera.transform; [_cameraNode setTransform:SCNMatrix4FromMat4(_transform)]; }

文档提到过ARFrame提供的transform,这里的transform是六自由度的。

/** The transformation matrix that defines the camera's rotation and translation in world coordinates. */ 关于PBR材质

这篇博文很详细,可供参考。

PBR,即Physically based rendering,可以实现很逼真的光影效果。

至此我们就可以实现文头提供的Demo效果了。虽然误差还是有的,但是毕竟是单目SLAM,是不是已经很厉害了呢。

使用注意点

因为这里空间定位基本依赖于ARKit提供的数据,所以ARKit的精确度直接影响到视觉效果。所以记得使用时记得遵守ARKit提到的运行条件,即 https://developer.apple.com/documentation/arkit 提到的

ARKit requires an iOS device with an A9 or later processor. & Understanding Augmented Reality: Best Practices and Limitations段落中 However, it relies on details of the device’s physical environment that are not always consistent or are difficult to measure in real time without some degree of error. To build high-quality AR experiences, be aware of these caveats and tips.

简而言之:6S以上的设备,良好的光线环境,避免对着白墙(无法获取特征点)。

这里我分享个没有严谨验证过的适用于ARKit快速稳定的技巧:

斜对着方形区域,水平环绕扫视矩形后继续瞄准沿竖直方向观测,基本就能保持稳定了。

如果您觉得有价值,请在github赏个star,不胜感激。

如果有什么想交流的,欢迎私信。


(责任编辑:ioter)

用户喜欢...

在智能手机上实现 1 Gbps RF 前端的简单方法

有人可能会问,我们为什么需要 1 Gbps 的下载速度?当前的下载速度还不够快吗?让我们面对现实吧:我们都讨厌看到手机上旋转的缓冲符号,而且我们总是想要更多数据。运营商也希望用户有...


实现5G新型无线电大规模MIMO系统

大规模MIMO依赖于使用大量天线,是实现必要改进的关键技术,以证明从4G到5G无线网络的演进是合理的。 正在定义第五代(5G)无线接入网络,以满足2020年及以后的容量需求的持续增长,并解决...


应用最新的CAN总线增强功能,实现安全可靠的高速汽车通信

设计人员多年来一直依赖控制器局域网(CAN)来实现汽车各子系统和电子控制单元(ECU)之间的可靠通信。然而,随着机载网络节点的数量增加,所需的数据吞吐量以及对更低延迟和更高级安...


射频收发器在数字波束合成相控阵中实现强制杂散去相关性

在大型数字波束合成天线中,人们非常希望通过组合来自分布式波形发生器和接收器的信号这一波束合成过程改善动态范围。如果关联误差项不相关,则可以在噪声和杂散性能方面使动态范围提...


在不需要大量使用资源的情况下为HMI实现带来新的维度

十多年前,iPhone的推出预示着我们日常生活中几个关键要素的大变革。这些改变游戏规则的手机将在我们如何立即与技术互动方面发挥关键作用 - 即通过使用触摸。虽然触摸屏在此之前已经存在...


使用微控制器的功能,在紧凑设计中快速实现模拟信号链

许多针对物联网 (IoT) 的设计都依靠模拟电路,以便满足应用对传感器和致动器的信号调节、电流控制和其他功能的独特要求。虽然专用的信号链 IC 可以满足这种需求,但是成本和空间严格受限...


模拟器件继续实现高效电机控制的无传感器矢量控制技术

基于使用磁显着性的空间显着性跟踪的技术适用于零速操作并且使得可以在没有参数影响的情况下估计初始转子位置。对于初始转子位置,主要有两种基于脉冲信号注入或正弦载波信号注入的基...


设计实例 #13:实现四通道通用模拟输入

MAXREFDES1152是一款四通道通用模拟输入,可测量电压或电流信号。每个通道可配置为0至10V的电压输入或0至20mA的电流输入。可以切换24V电源为外部2线,3线或4线传感器供电。 MAXREFDES1152为工业电...


使用 Google 视觉 API 实现基于云的低成本嵌入式图像识别

不论是人脸、文本或其他图像数据,使用嵌入式系统执行现场图像识别的需求与日俱增。许多实现需要昂贵的高端应用处理器以及昂贵的定制应用代码。此外,图像处理是在片上执行的,这可能...


物联网平台:实现物联网 白皮书

物联网正在改变工业和社会 预测物联网的大规模增长 三个关键影响的物联网行业 实现普遍物联网的挑战 管理复杂性 创建和维护可靠连接 确保数据安全和隐私 使用数据最优 启用一个开放的物...