ARkit 收藏本版 已有4人收藏 +发表新主题
查看: 22531|回复: 4
打印 上一主题 下一主题

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

[复制链接]

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

我揍四謯尅 发表于 2017-8-8 18:40:44 浏览:  22531 回复:  4 只看该作者 复制链接
本帖最后由 我揍四謯尅 于 2017-8-8 18:55 编辑

Part1.效果展示

Demo01



Demo02


       上图展示了『前后左右上下+头部随动』即六自由度的VR效果。
       工程源码:
       https://github.com/WorkerAmo/ARKitPlusVR
       已被录入 https://github.com/olucurious/awesome-arkit
Part2.原理解析
       涉及的库       ARKit & SceneKit
       原理
       github上有Google CardBoard供大家使用,也有早期某好人开源后不更新的版本。
       我接触SceneKit发现可以便捷的实现VR效果,当然需要舍弃一部分内容。
       个人以为,VR项目中核心组成有三:渲染引擎,九轴算法,反畸变算法。在此处我们可以基本舍弃反畸变算法与九轴算法,依靠SceneKit实现渲染部分。

     层级关系.png

       直接使用Xcode9beta在ARKit新建工程Demo的基础上添加ARSCNView双屏即可。
  1. // retrieve the SCNView
  2. SCNView *scnViewLeft = [[SCNView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width*0.5, self.view.frame.size.height)];
  3. scnViewLeft.pointOfView = cameraNodeLeft;
  4. scnViewLeft.scene = scene;
  5. scnViewLeft.backgroundColor = [UIColor blackColor];
  6. [self.sceneView addSubview:scnViewLeft];
  7. 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)];
  8. scnViewRight.pointOfView = cameraNodeRight;
  9. scnViewRight.scene = scene;
  10. scnViewRight.backgroundColor = [UIColor blackColor];
  11. [self.sceneView addSubview:scnViewRight];
复制代码

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

                             六轴自由度.jpg


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

Part3 VR部分的实现
       Camera设置

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


                                                                                                              双目视差(来自网络,侵删).jpg

       因为左右眼内容实际是不一样的,所以需要2个camera在增强视差实现立体效果。
       考虑到后续需要2个眼睛随着头部转动,会产生位移与旋转,所以我们需要增加一个新的camera作为2个camera的容器。
  1. // Containor Camera.        _cameraNode = [SCNNode node];
  2.        _cameraNode.camera = [SCNCamera camera];
  3.        [_cameraNode setPosition:SCNVector3Make(0, 0, 0)];
  4.        [scene.rootNode addChildNode:_cameraNode];
  5.        // Camera left
  6.        SCNNode *cameraNodeLeft = [SCNNode node];
  7.        cameraNodeLeft.camera = [SCNCamera camera];
  8.        [cameraNodeLeft setPosition:SCNVector3Make(-0.1, 0, 0)];
  9.        [_cameraNode addChildNode:cameraNodeLeft];
  10.        // Camera right
  11.        SCNNode *cameraNodeRight = [SCNNode node];
  12.        cameraNodeRight.camera = [SCNCamera camera];
  13.        [cameraNodeRight setPosition:SCNVector3Make(0.1, 0, 0)];
  14.        [_cameraNode addChildNode:cameraNodeRight];
复制代码
      之后针对摄像头组的矩阵直接赋与containor camera即可。

       关于摄像头的空间坐标
       借助WWDC2017发布的ARKit-ARCamera.transform实现头部随动与空间定位。
  1. #pragma mark - ARSessionDelegate

  2. - (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame
  3. {
  4.        // Retrive the matrix from ARKit - ARFrame - camera. _transform = frame.camera.transform;
  5.        [_cameraNode setTransform:SCNMatrix4FromMat4(_transform)];
  6. }
复制代码
      文档提到过ARFrame提供的transform,这里的transform是六自由度的。
  1. /*
  2. The transformation matrix that defines the camera's rotation and translation in world coordinates.
  3. */
复制代码
关于PBR材质
       这篇博文很详细,可供参考。
       PBR,即Physically based rendering,可以实现很逼真的光影效果。
http://www.jianshu.com/p/b30785bb6c97
       至此我们就可以实现文头提供的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 arenot always consistent or are difficult to measure in real time without somedegree of error. To build high-quality AR experiences, be aware of these caveats and tips.      

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

这里我分享个没有严谨验证过的适用于ARKit快速稳定的技巧:
斜对着方形区域,水平环绕扫视矩形后继续瞄准沿竖直方向观测,基本就能保持稳定了。


【转载】
ARKit技术交流qq群:482631386
ARVR训练营:www.arvrthink.com


分享至:
| 人收藏
回复

使用道具 举报

该用户从未签到

沙发
重庆生活网l 发表于 2017-10-25 22:24:15 只看该作者
谢谢分享哈













第五代QQ机器人QQ群机器人论坛QQ机器人智能客服机器人QQplus机器人QQ群互联机器人..联系QQ800829129 QQ群28352615
回复 支持 反对

使用道具 举报

该用户从未签到

板凳
重庆生活网l 发表于 2017-10-26 21:05:39 只看该作者
呵呵你真厉害,佩服哦













淘客机器人、淘客返利机器人、淘宝客机器人 联系客服QQ:4000017854
回复 支持 反对

使用道具 举报

  • TA的每日心情

    2019-3-25 21:42
  • 签到天数: 2 天

    [LV.1]初来乍到

    地板
    wj7636 发表于 2019-3-17 13:15:41 只看该作者
    其实我是奉吧主大人之命来顶贴的...!               悬浮门 http://www.ssmdd.com
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-3-25 21:42
  • 签到天数: 2 天

    [LV.1]初来乍到

    5#
    wj7636 发表于 2019-4-10 16:07:03 只看该作者
    【有前排就要占没前排也要灌一下水】 电动伸缩门 http://www.ssmdd.com
    回复 支持 反对

    使用道具 举报

    *滑动验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.