【发布时间】:2023-04-09 13:22:01
【问题描述】:
我正在构建一个小型演示,其中两个对象可以相互碰撞。基本上,一个对象将被放置在一个平面上。我有以下代码用于将物理体添加到飞机。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
if anchor is ARPlaneAnchor {
let plane = SCNPlane(width: 0.5, height: 0.5)
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = UIImage(named: "overlay_grid")
plane.firstMaterial = material
let planeNode = SCNNode(geometry: plane)
planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil)
planeNode.physicsBody?.categoryBitMask = BodyType.plane.rawValue
planeNode.eulerAngles.x = .pi/2
node.addChildNode(planeNode)
}
即使添加了飞机,它也不会参与任何物理碰撞。如果我试图在上面放置物体,它会直接穿过它。但是,如果我将最后一行更改为以下内容,则可以:
// node.addChildNode(planeNode) // INSTEAD OF THIS
planeNode.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
self.sceneView.scene.rootNode.addChildNode(planeNode) // THIS WORKS
我的理解是,所有与碰撞相关的东西都由 SceneView 维护,为了参与碰撞,我需要将其添加到 SceneView 层次结构而不是 ARSCNView 层次结构。
问题:
// node.addChildNode(planeNode) // WHY THIS DOES NOT WORK
planeNode.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
self.sceneView.scene.rootNode.addChildNode(planeNode) // WHY THIS WORKS
【问题讨论】:
-
有什么问题?
-
请参阅上面的更新问题。