首页 > 解决方案 > 如何使用 ARKit 点击将 SCNNode 添加到场景视图?

问题描述

我正在尝试实现一个功能,该功能允许用户在用户单击的位置点击并将节点添加到场景中。我希望这是在飞机上。我做了一些研究,发现了以下功能,但我得到了Value of type 'simd_float4x4' has no member 'translation'在线警告let translation = hitTestResult.worldTransform.translation

有谁知道我可以如何改变这一点,所以我没有收到警告?

@objc func addRoomToSceneView(withGestureRecognizer recognizer: UIGestureRecognizer) {
        let tapLocation = recognizer.location(in: sceneView)
        let hitTestResults = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)
        
        guard let hitTestResult = hitTestResults.first else { return }
        //THE FOLLOWING LINE HAS THE warning: Value of type 'simd_float4x4' has no member 'translation'
        let translation = hitTestResult.worldTransform.translation
        let x = translation.x
        let y = translation.y
        let z = translation.z
        
        let room = createMaskedRectangleRoom(width: 4, height: 4, depth: 4, color: .white)
        room.scale = SCNVector3(2, 2, 2)
        room.position = SCNVector3(x,y,z)
        sceneView.scene.rootNode.addChildNode(room)
    }

标签: iosswiftxcodearkitxcode13

解决方案


的结果hitResult.worldTransformSCNMatrix4一个 4x4 矩阵没有translation属性。当使用矩阵乘法应用于一个点时,完成的转换可能包括平移,但底层数据类型本质上是一个 16 元素矩形数组。

您可能可以使用以下方法提取矩阵的翻译方面:

let translation = SCNVector4(float4x4(hitTestResult.worldTransform) * SIMD4<Float>(0,0,0,1))

我假设hitTestResult.worldTransform 矩阵是仿射的。如果不是,那就太奇怪了。


推荐阅读