【问题标题】:Notice when node position enters certain bounding box in scene kit?注意节点位置何时进入场景套件中的某个边界框?
【发布时间】:2018-06-03 10:23:01
【问题描述】:

当一个节点(例如扔出的球)进入 SceneKit / ARKit 中的某个边界框(例如篮子)时,有没有办法触发功能?如果没有,你将如何实现这个问题?

【问题讨论】:

    标签: ios swift scenekit arkit


    【解决方案1】:

    我可能会采用这种方式。获得篮球框3D dae模型后。

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

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

    使用:

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

    这变成了箍的 physicBody。

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

    然后,我将锻炼球与每个不同篮球元素/节点的碰撞。

    别忘了使用调试功能

    SceneView.debugOptions = .showPhysicsShapes

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

    如何设置冲突已经在之前的帖子中回答过......

    how to setup SceneKit collision detection

    您可能希望球从篮板、杆和环上反弹,但如果它击中篮筐的物理形状......您可能希望让球消失并创建一个漂亮的火花/火焰动画或其他东西。然后,您也可以拥有一个记录的分数。

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

    https://github.com/farice/ARShooter

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2017-04-09
        • 2017-12-03
        • 1970-01-01
        相关资源
        最近更新 更多