在 ARSCNView 中显示 "ARAnchor"
Displaying an "ARAnchor" in ARSCNView
在 ARKit 中,我们可以通过 .showFeaturePoints
类型 属性:
可视化在 ARSession 中检测到的 Feature Points' Cloud
self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
此外,我们还可以显示坐标轴可视化,指示 AR 世界坐标系的位置和方向:
static let showWorldOrigin: SCNDebugOptions
但是可以在ARSCNView中显示ARAnchors
吗?
如果是,我们怎么办?
ARAnchor
只代表'position and orientation'。你能看到的东西是 SCNNode
s.
您可以通过 ARSCNViewDelegate
中的方法为您添加的每个锚附加一个节点
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
//create a node so you can visualize the location.
let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.5))
sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
return sphereNode
}
这会在您添加锚点后调用(或者当系统添加锚点时,例如当您打开了平面检测或 image/object 检测时)
sceneView.session.add(anchor:)
只是为了跟进@sj-r 和@Rickster 的评论。
@Rickster 谈论的关于 coordinateOrigin.scn
的示例代码可在此处找到:Creating Face Based Experiences
这是我之前用来可视化 Axis 的一个小片段:
class BMOriginVisualizer: SCNNode {
//----------------------
//MARK: - Initialization
//---------------------
/// Creates An AxisNode To Vizualize ARAnchors
///
/// - Parameter scale: CGFloat
init(scale: CGFloat = 1) {
super.init()
//1. Create The X Axis
let xNode = SCNNode()
let xNodeGeometry = SCNBox(width: 1, height: 0.01, length: 0.01, chamferRadius: 0)
xNode.geometry = xNodeGeometry
xNodeGeometry.firstMaterial?.diffuse.contents = UIColor.red
xNode.position = SCNVector3(0.5, 0, 0)
self.addChildNode(xNode)
//2. Create The Y Axis
let yNode = SCNNode()
let yNodeGeometry = SCNBox(width: 0.01, height: 1, length: 0.01, chamferRadius: 0)
yNode.geometry = yNodeGeometry
yNode.position = SCNVector3(0, 0.5, 0)
yNodeGeometry.firstMaterial?.diffuse.contents = UIColor.green
self.addChildNode(yNode)
//3. Create The Z Axis
let zNode = SCNNode()
let zNodeGeometry = SCNBox(width: 0.01, height: 0.01, length: 1, chamferRadius: 0)
zNode.geometry = zNodeGeometry
zNodeGeometry.firstMaterial?.diffuse.contents = UIColor.blue
zNode.position = SCNVector3(0, 0, 0.5)
self.addChildNode(zNode)
//4. Scale Our Axis
self.scale = SCNVector3(scale, scale, scale)
}
required init?(coder aDecoder: NSCoder) { fatalError("Vizualizer Coder Not Implemented") }
}
可以这样初始化:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
let anchorVizualizer = BMOriginVisualizer(scale: 0.5)
node.addChildNode(anchorVizualizer)
}
希望这对@sj-r 提供的答案的扩展有用。
在 ARKit 中,我们可以通过 .showFeaturePoints
类型 属性:
Feature Points' Cloud
self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
此外,我们还可以显示坐标轴可视化,指示 AR 世界坐标系的位置和方向:
static let showWorldOrigin: SCNDebugOptions
但是可以在ARSCNView中显示ARAnchors
吗?
如果是,我们怎么办?
ARAnchor
只代表'position and orientation'。你能看到的东西是 SCNNode
s.
您可以通过 ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
//create a node so you can visualize the location.
let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.5))
sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
return sphereNode
}
这会在您添加锚点后调用(或者当系统添加锚点时,例如当您打开了平面检测或 image/object 检测时)
sceneView.session.add(anchor:)
只是为了跟进@sj-r 和@Rickster 的评论。
@Rickster 谈论的关于 coordinateOrigin.scn
的示例代码可在此处找到:Creating Face Based Experiences
这是我之前用来可视化 Axis 的一个小片段:
class BMOriginVisualizer: SCNNode {
//----------------------
//MARK: - Initialization
//---------------------
/// Creates An AxisNode To Vizualize ARAnchors
///
/// - Parameter scale: CGFloat
init(scale: CGFloat = 1) {
super.init()
//1. Create The X Axis
let xNode = SCNNode()
let xNodeGeometry = SCNBox(width: 1, height: 0.01, length: 0.01, chamferRadius: 0)
xNode.geometry = xNodeGeometry
xNodeGeometry.firstMaterial?.diffuse.contents = UIColor.red
xNode.position = SCNVector3(0.5, 0, 0)
self.addChildNode(xNode)
//2. Create The Y Axis
let yNode = SCNNode()
let yNodeGeometry = SCNBox(width: 0.01, height: 1, length: 0.01, chamferRadius: 0)
yNode.geometry = yNodeGeometry
yNode.position = SCNVector3(0, 0.5, 0)
yNodeGeometry.firstMaterial?.diffuse.contents = UIColor.green
self.addChildNode(yNode)
//3. Create The Z Axis
let zNode = SCNNode()
let zNodeGeometry = SCNBox(width: 0.01, height: 0.01, length: 1, chamferRadius: 0)
zNode.geometry = zNodeGeometry
zNodeGeometry.firstMaterial?.diffuse.contents = UIColor.blue
zNode.position = SCNVector3(0, 0, 0.5)
self.addChildNode(zNode)
//4. Scale Our Axis
self.scale = SCNVector3(scale, scale, scale)
}
required init?(coder aDecoder: NSCoder) { fatalError("Vizualizer Coder Not Implemented") }
}
可以这样初始化:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
let anchorVizualizer = BMOriginVisualizer(scale: 0.5)
node.addChildNode(anchorVizualizer)
}
希望这对@sj-r 提供的答案的扩展有用。