2017-10-17 74 views
1

我在ARKit上遇到问题,我需要帮助。 我正在做一个小演示,我在场景中放置一个简单的SCNTorus几何体,并且试图将一个小球(SCNSphere)扔进圆环孔。问题在于球在中间弹跳而不是通过。 没有为环面的代码:ARKit:球没有穿过SCNTorus洞

 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 
+0

可能的重复:https://stackoverflow.com/q/27391763/957768 – rickster

回答

1

使用创建physicsbody(体型kinametic和形状无)以简化的“凸结果的代码船体“几何形状的表示。简而言之,您看到的几何体是圆环面,但用于碰撞检测的几何体不是。

的(OBJ C)这行代码实际上是从苹果的示例代码项目之一:

_torus.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:[SCNPhysicsShape shapeWithGeometry:_torus.geometry options: @{SCNPhysicsShapeTypeKey : SCNPhysicsShapeTypeConcavePolyhedron} ] ]; 

换句话说,你需要根据几何自己创建一个静态类型的身体和形状使用SCNPhysicsShapeTypeConcavePolyhedron键值(仅适用于静态物体)最终以环体几何形状的更精确表示作为物理体。

有关详细信息,请参阅:https://developer.apple.com/documentation/scenekit/scnphysicsshape

0

谢谢!这行得通! 有代码:

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