注意到场景包中节点位置进入某个边界框了吗?

Notice when node position enters certain bounding box in scene kit?

有没有办法在 SceneKit / ARKit 中当节点(例如抛球)进入某个边界框(例如篮子)时触发功能?如果没有,你会如何解决这个问题?

你必须使用球的世界位置和篮子世界位置 + 边界框来实现它。

使用它的边界框计算篮子的大小:

var (basketBoundingBoxMin, basketBoundingBoxMax) = (basket?.presentation.boundingBox)!
let size = basketBoundingBoxMax - basketBoundingBoxMin

使用这个尺寸和篮筐的世界位置来计算:

  • 篮子的最小 x,y,z
  • 篮子的最大 x,y,z

然后检查球的世界位置是否在篮筐的最小和最大位置内。

我可能会采用的方式。获得篮球架3D模型后

https://3dwarehouse.sketchup.com/model/fa42320b3def2c6b4741187cebbc52b3/Basketball-Hoop

我会首先为不同的元素设置 physicsShapes....篮板、杆和 ring/hoop、地板和球。然后我会计算出适合环内的圆柱体尺寸。

使用:

let cylinder = SCNCylinder(radius: 1.0, height: 0.1)

这成为箍的物理体。

hoopNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry:cylinder))

然后我会练习球与每个不同篮球的碰撞 element/node。

别忘了使用调试功能

SceneView.debugOptions = .showPhysicsShapes

这将有助于直观地调试与物理形状的碰撞,并确保物理形状被准确缩放并处于正确的位置。

如何进行设置冲突已经在之前的 post 此处得到解答...

how to setup SceneKit collision detection

您可能希望球从篮板、杆和环上反弹,但如果它击中篮筐的物理形状...您可能希望让球消失并创建漂亮的 spark/flame 动画或某物。然后你也可以获得一个记录的分数。

github 上的这款 Arkit 游戏将为您提供一个很好的模板来处理所有这些事情、碰撞、动画和计分

https://github.com/farice/ARShooter