ARKit Pods — SCNPath


许多ARKit开发人员正在使用SceneKit作为其入门框架,这是一个很好的选择,主要是因为它可以访问iOS开发人员用于所有其他应用程序的所有本机功能。 使用SceneKit,您可以访问许多默认的几何类型,SCNBox,SCNSphere,SCNPyramid甚至SCNShape。 这些是很好的构建基块,但是当您要构建一些稍有不同的东西时,则必须更深入地自己构建几何。 我认为这是所有ARKit开发人员至少应该意识到的事情,这就是为什么我在之前的一些Medium帖子中展示了示例的原因,从我的第一个帖子开始:

ARKit + SceneKit几何图形教程(第1部分)

在SceneKit中创建自己的几何形状,无需离开即可拥有各种场景和动画。

medium.com

大多数iOS开发人员不一定都具有3D几何或图形方面的背景知识,而且我认为他们不需要为了构建出色的东西而拥有背景知识!


因此,我最新的开放源代码框架用于创建基本为三角形的路径,这些路径可以围绕点集(SCNVector3的数组),如下面的GIF所示。

SCNGeomtry.path(path: positionArray)

SCNPathNode(path: positionArray)

要创建一条从世界原点(或下面的1m)开始,向前然后向右的路径,您需要做的就是创建这样的类:

 让pathNode = SCNPathNode(path:[ 
SCNVector3(0,-1,0),
SCNVector3(0,-1,-1),
SCNVector3(1,-1,-1)
])

默认情况下,该路径的宽度为0.5m,它具有可以更改的其他属性,有关所有信息,请参见GitHub存储库:

maxxfrazer / ARKit-SCNPath

仅使用点代表路径的中心为增强现实环境创建路径。 …

github.com


好的,让我们来制作我在推文中展示的应用程序:

接下来,我们要添加点击手势。 当且仅当正方形未初始化(附加到屏幕)时,我才选择仅使用轻击手势来获取FocusSquare的当前位置,但是如果您希望执行的话,可以执行一次hitTest,用手指代替屏幕。 这些函数在ViewController中或在其扩展中。

  var hitPoints = [SCNVector3]() func setupGestures(){ 

let tapGesture = UITapGestureRecognizer(target: self ,action: #selector (handleTap( _ :)))
tapGesture.delegate =


.view.addGestureRecognizer(tapGesture)
}
@IBAction 函数 handleTap( _ poseRecognizer:UITapGestureRecognizer){

警卫手势Recognizer.state ==。 其他
返回
}
如果
自我 .focusSquare.state!=。初始化{
打印(self.focusSquare.position)

self .hitPoints.append( self .focusSquare.position)
}
}

确保从viewDidLoad或类似位置调用setupGestures,以便每当您点击时都应看到SCNVector3已打印并添加到数组中。

接下来需要的是实际创建一个SCNPathNode对象,并在每次更新时将这些点添加到该对象中。 为了创建我们的对象,我将其添加到我们的ViewController中:

 让pathNode = SCNPathNode(path:[]) 

将任何材料直接添加到self.pathNode ,以便每当几何体更新时,它也将沿着材料数组传递。 目前,几何图形仅使用阵列中的第一种材料。 如果您尝试不带纹理的此示例,则它将默认为具有蓝色漫反射的材质-我以这种方式进行设置,如果有人讨厌,我可能会将其更改为默认的白色。 但是在这里的示例中,我将随机地将两个纹理之一应用于路径。 我还设置了其中之一来使用textureRepeats属性,这在GitHub README.md中进行了说明。

最后,对于这部分,我们需要做的就是每次将位置添加到hitPoints数组时更新hitPoints 。 我发现执行此操作的最佳方法是将didSet添加到变量,在这种情况下,将其hitPointshitPoints变量中,如下所示:

  var hitPoints = [SCNVector3](){ 

didSet {

自。 pathNode.path = self .hitPoints
}
}

现在我们只需要添加一点遮挡,但是不用担心,这几乎和使用SCNPathNode类一样容易。

我们需要首先在每个垂直检测到的表面的顶部渲染一个ARSCNPlaneGeometry ,然后仅将alpha通道写入深度缓冲区。

  功能渲染器( 

_渲染器:SCNSceneRenderer,
didAdd节点:SCNNode,用于锚点:ARAnchor
){
如果 planeAnchor =锚定 ? ARPlaneAnchor,
planeAnchor.alignment == .vertical,

geom = ARSCNPlaneGeometry(设备:MTLCreateSystemDefaultDevice()!)
{
geom.update(来自:planeAnchor.geometry)
geom.firstMaterial?.colorBufferWriteMask = .alpha
node.geometry =几何
}
}
func renderer( _ renderer:SCNSceneRenderer,didUpdate节点:SCNNode,锚点:ARAnchor){

如果 planeAnchor =锚定 ? ARPlaneAnchor,
planeAnchor.alignment == .vertical,

geom = node.geometry ? ARSCN平面几何
{
geom.update(来自:planeAnchor.geometry)
}
}

我也在GitHub上为ARKit中的遮挡创建了一个Gist。

这就是遮挡的全部内容。如果要查看正在创建的墙,只需注释掉更改firstMaterial.colorBufferWriteMask的行firstMaterial.colorBufferWriteMask 。 以下示例说明了我们的应用现在的外观:

就是这样!

希望您喜欢SCNPath本教程,并将用它来做一些很棒的事情! 在接下来的几周内,我想对此Pod进行一些更改,如果对文档的使用有任何重大更改,则将对其进行更新。

在与Pod相同的存储库中下载此完整示例:

maxxfrazer / ARKit-SCNPath

仅使用点代表路径的中心为增强现实环境创建路径。 …

github.com


如果您对此Pod有任何建议或希望看到的其他项目的想法,请提出更新建议,或者让我知道您认为ARKit甚至SceneKit缺少的东西。 我的目标是从ARKit开发中剔除复杂数学的剩余部分,以便所有开发人员拥有所需的一切工具来完成令人惊奇的事情!

在Twitter或LinkedIn上找到我,并在GitHub上查看我正在从事或过去的其他公共项目。