ARKIT

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

2017-07-03  本文已影响54人  Dosun

本文译自官方文档 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 体验

上一篇下一篇

猜你喜欢

热点阅读