当一个节点(例如一个被抛出的球)进入SceneKit / ARKit中的某个边界框(例如一个篮子)时,有没有办法触发一个功能?如果没有,你会如何实现这个问题?
答案 0 :(得分:1)
我可能接近这个的方式。获得篮球箍3D dae模型后。
https://3dwarehouse.sketchup.com/model/fa42320b3def2c6b4741187cebbc52b3/Basketball-Hoop
我首先要为不同的元素设置physicsShapes ....背板,杆和杆;戒指/箍,地板和球。然后我会计算出圆柱尺寸以适应环内。
使用:
let cylinder = SCNCylinder(radius: 1.0, height: 0.1)
这成为了箍的物理体。
hoopNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry:cylinder))
然后我会训练球与每个不同的篮球元素/节点的碰撞。
不要忘记使用调试功能
SceneView.debugOptions = .showPhysicsShapes
这将有助于在视觉上调整与物理形状和碰撞的碰撞。确保物理形状准确缩放并处于正确位置。
如何进行设置碰撞已在此前的帖子中得到解答......
how to setup SceneKit collision detection
你可能希望球从篮板,杆和环上反弹,但是如果它击中篮筐的物理形状......你可能想要让球消失并创造一个漂亮的火花/火焰动画或其他东西。然后你可以有一个记录的分数。
github上的这款Arkit游戏将为您提供一个很好的模板来处理所有这些事情,碰撞,动画和得分
答案 1 :(得分:0)
你必须使用球的世界位置和篮子世界位置+边界框来实现它。
使用它的边界框计算篮子的大小:
var (basketBoundingBoxMin, basketBoundingBoxMax) = (basket?.presentation.boundingBox)!
let size = basketBoundingBoxMax - basketBoundingBoxMin
使用此大小和篮子的世界位置来计算:
然后检查球的世界位置是否在篮筐的最小和最大位置。