我做的很简单:
-
垂直平面检测
-
垂直平面上的图像识别
图像挂在检测到的平面上(在我的墙上) . 在这两种情况下,我都从ARSCNViewDelegate实现 renderer:didAddNode:forAnchor:
函数 . 我站在垂直平面检测和图像识别的地方 .
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let shipScene = SCNScene(named: "ship.scn"), let shipNode = shipScene.rootNode.childNode(withName: "ship", recursively: false) else { return }
shipNode.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
sceneView.scene.rootNode.addChildNode(shipNode)
print(anchor.transform)
}
在垂直平面检测的情况下, anchor
将是 ARPlaneAnchor
. 在图像识别的情况下, anchor
将是 ARImageAnchor
.
为什么这两个锚点的变换矩阵如此不同?我正在打印 anchor.transform
,我得到了这些结果:
1 .
simd_float4x4([
[0.941312, 0.0, -0.337538, 0.0)],
[0.336284, -0.0861278, 0.937814, 0.0)],
[-0.0290714,-0.996284, -0.0810731, 0.0)],
[0.191099, 0.172432, -1.14543, 1.0)]
])
2 .
simd_float4x4([
[0.361231, 0.10894, 0.926093, 0.0)],
[-0.919883, -0.121052, 0.373049, 0.0)],
[0.152743, -0.986651, 0.0564843, 0.0)],
[75.4418, 10.9618, -14.3788, 1.0)]
])
因此,如果我想在检测到的垂直平面上放置一个3D对象,我可以简单地使用 [x = 0.191099, y = 0.172432, z = -1.14543]
作为坐标来设置我的节点的位置( myNode
),然后使用 sceneView.scene.rootNode.addChildNode(myNode)
将此节点添加到场景中,但是如果我想放置一个3D对象在检测到的图像的锚点,我不能使用 [x = 75.4418, y = 10.9618, z = -14.3788]
.
如何在检测到的图像锚点上放置3D对象?我真的不明白ARImageAnchor的变换矩阵 .
1 回答
以下是我使用
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
方法的示例:从我的理解(我当然可能是错误的)你会知道你的位置区域是
referenceImage.physicalSize
的宽度和高度,以米为单位表示:因此,您需要在这些边界内扩展您的内容(如果需要适合),假设您希望它看起来覆盖图像 .