美文网首页ARKIT
七、<ARKit> 提供三维虚拟特征

七、<ARKit> 提供三维虚拟特征

作者: Dosun | 来源:发表于2017-07-03 17:19 被阅读54次

    本文译自官方文档 Providing 3D Virtual Content with SceneKit。不足之处,请纠正。

    使用 SceneKit 在 AR 中增加三维的虚拟特征。


    一、简介

    在 AR 中放置 SceneKit 内容,你一定要运行 AR 会话(具体操作请参考 Building a Basic AR Experience)。
    因为 ARKit 自动将 SceneKit 与真实世界的空间相互配对,放置虚拟特征时,从而保证它是 SceneKit 设计的位置。如,默认的配置,如下在代码中,是在 距离镜头前 20厘米和 10厘米的立方体的小立方体。

        SCNNode *cubNobe = [SCNNode nodeWithGeometry:[SCNBox boxWithWidth:0.1 height:0.1 length:0.1 chamferRadius:0]];
        cubNobe.position = SCNVector3Make(0, 0, -0.2);
        [self.scnview.scene.rootNode addChildNode:cubNobe]
    

    上面的代码是直接在 SceneKit 的 scene 属性中增加一个虚拟的立方体。这个虚拟的立方体会自动找到在现实世界中的位置,因为 ARKit 已经将 SceneKit 空间与现实的空间相互配对。
    或者,你也可以用 ARAnchor
    类去追踪现实世界的位置,要么通过创建锚点并将它们添加到 AR 会话或通过观察 ARKit 自动创建的锚点。例如,当水平面侦测可以使用,ARKit 为侦测到的水平面增加和更新锚点。如果你想想在这些锚点增加虚拟特征时,请使用ARSCNViewDelegate
    代理,代码如下:

    - (void)renderer:(id<SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{
    
    //在可见的节点上,并利其位置和扩展创建 SceneKit 平面。
        ARPlaneAnchor *planeAnchor = anchor;
        SCNPlane *plane = [SCNPlane planeWithWidth:planeAnchor.extent.x height:planeAnchor.extent.z];
        
        //SCNPlanes 垂直面向的本地坐标空间。
        // 旋转匹配 ARPlaneAnchor 的水平方向。
        SCNNode *planeNode = [SCNNode nodeWithGeometry:plane];
        planeNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z);
        planeNode.transform = SCNMatrix4MakeRotation(- M_PI / 2, 1, 0, 0);
        
      //ARKit 自己有节点在锚点上,所以需要将节点增加子类节点。
        [node addChildNode:planeNode];
    }
    

    二、如下方案是提供最佳的 3D AR 体验

    • 使用 SceneKit 物理特性,如基础照明下更加现实模型材料的外观(SCNMaterial
      类 和 Badger: Advanced Rendering in SceneKit 事例代码)。
    • 烘烤环境遮挡阴影,这样适当照亮物体出现在各种场景的照明条件。(也没太明白)
    • 在 AR 技术中, 如果你创建了一个虚拟对象,并打算把它放在真实的平面上,在 3D AR 中,包括一个透明平面上用软阴影纹理虚拟特征。(也没太明白)

    相关文章

      网友评论

        本文标题:七、<ARKit> 提供三维虚拟特征

        本文链接:https://www.haomeiwen.com/subject/sdqzcxtx.html