Swift 阿基特&x2013;“球没有穿过”;斯坎特罗斯“;孔

Swift 阿基特&x2013;“球没有穿过”;斯坎特罗斯“;孔,swift,ios11,augmented-reality,xcode9,arkit,Swift,Ios11,Augmented Reality,Xcode9,Arkit,我在ARKit上遇到了一个问题,我需要帮助。 我正在做一个小演示,我在场景中放置了一个简单的SCNTorus几何体,我试图把一个小球(SCNSphere)扔进圆环孔。问题是球在中间跳动而不是通过。 这是圆环体的代码: let ring = SCNTorus(ringRadius: 0.4, pipeRadius: 0.1) ring.ringSegmentCount = 100 let ringMaterial = SCNMaterial() ringMaterial.diffuse.cont

我在ARKit上遇到了一个问题,我需要帮助。 我正在做一个小演示,我在场景中放置了一个简单的SCNTorus几何体,我试图把一个小球(SCNSphere)扔进圆环孔。问题是球在中间跳动而不是通过。 这是圆环体的代码:

let ring = SCNTorus(ringRadius: 0.4, pipeRadius: 0.1)
ring.ringSegmentCount = 100

let ringMaterial = SCNMaterial()
ringMaterial.diffuse.contents = UIImage(named: "art.scnassets/Ball/BeachBallColor.jpg")

ring.materials = [ringMaterial]

let ringNode = SCNNode()
ringNode.position = SCNVector3(x: location.worldTransform.columns.3.x,
                               y: location.worldTransform.columns.3.y + 0.8,
                               z: location.worldTransform.columns.3.z)

ringNode.geometry = ring

let body = SCNPhysicsBody(type: SCNPhysicsBodyType.kinematic,
                               shape: nil)
body.categoryBitMask = CollisionTypes.wall.rawValue
body.collisionBitMask = CollisionTypes.beachball.rawValue
// body.contactTestBitMask = CollisionTypes.beachball.rawValue
body.isAffectedByGravity = false
body.mass = 0.5

ringNode.physicsBody = body

sceneView.scene.rootNode.addChildNode(ringNode)
对于舞会:

let node = SCNNode(geometry: sphere!)
node.renderingOrder = 10

let body = SCNPhysicsBody(type: SCNPhysicsBodyType.dynamic,shape: nil)
body.categoryBitMask = CollisionTypes.beachball.rawValue
body.collisionBitMask = CollisionTypes.solid.rawValue|CollisionTypes.wall.rawValue|CollisionTypes.beachball.rawValue
// body.contactTestBitMask = CollisionTypes.fireball.rawValue|CollisionTypes.wall.rawValue
body.isAffectedByGravity = true
body.mass = 0.5
body.restitution = 0.75
body.damping = 0.1
body.friction = 0.8

node.physicsBody = body

用于创建physicsbody(body type kinametic和shape nil)的代码将生成几何体的简化“凸包”表示。简单地说,您看到的几何体是圆环体,但用于碰撞检测的几何体不是

这行(obj c)代码实际上来自苹果的一个示例代码项目:

_torus.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:[SCNPhysicsShape shapeWithGeometry:_torus.geometry options: @{SCNPhysicsShapeTypeKey : SCNPhysicsShapeTypeConcavePolyhedron} ] ];
换句话说,您需要使用SCNPHYPERSOSSHAPETYPECONCAVE多面体关键字值(仅适用于静态实体)基于几何体本身创建静态类型实体和形状,以更精确地表示作为物理实体的圆环体几何体

有关更多详细信息,请参阅:

谢谢!成功了! 代码如下:

    let ring = SCNTorus(ringRadius: 0.4, pipeRadius: 0.1)
    ringNode.geometry = ring

    let shapeOptions = [ SCNPhysicsShape.Option.type : SCNPhysicsShape.ShapeType.concavePolyhedron]
    let physicShape = SCNPhysicsShape(geometry: ring, options: shapeOptions)

    let body = SCNPhysicsBody(type: SCNPhysicsBodyType.kinematic,
                              shape: physicShape)
    body.categoryBitMask = CollisionTypes.wall.rawValue
    body.collisionBitMask = CollisionTypes.beachball.rawValue
    body.isAffectedByGravity = false
    body.mass = 0.5
    ringNode.physicsBody = body

可能的重复:你是如何发现球是通过圆环的?