本文译自官方文档 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 中,包括一个透明平面上用软阴影纹理虚拟特征。(也没太明白);
网友评论