ios - 如何使用 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)
}
解决方案
的结果hitResult.worldTransform
是SCNMatrix4
一个 4x4 矩阵没有translation
属性。当使用矩阵乘法应用于一个点时,完成的转换可能包括平移,但底层数据类型本质上是一个 16 元素矩形数组。
您可能可以使用以下方法提取矩阵的翻译方面:
let translation = SCNVector4(float4x4(hitTestResult.worldTransform) * SIMD4<Float>(0,0,0,1))
我假设hitTestResult.worldTransform
矩阵是仿射的。如果不是,那就太奇怪了。
推荐阅读
- java - 如何将图像移动到触摸位置?
- go - 在go中转换数据结构:恐慌:运行时错误:索引超出范围
- javascript - 如何在页面完全加载之前调用javascript函数
- python - 仅在出现特殊字符时计算行数
- directory - 是否有用于描述数据集(文件夹和文件)内容的特定 UML 图?
- node.js - 护照反序列化用户未被调用
- node.js - 如何从 Fastify 服务器中的 URL 解析查询字符串参数?
- bash - 匹配不包含特定模式的行并在最后附加字符串 - Bash
- cypress - 如何在 Cypress 中正确使用 .wrap()
- python-3.x - 如何在一维中变形/缩放 3 维 numpy 数组?