2017-10-17 6 views
1

Je suis coincé avec un problème sur ARKit et j'ai besoin d'aide. Je fais une petite démo où je place une géométrie SCNTorus simple dans la scène et j'essaye de lancer une petite boule (SCNSphere) dans le trou du tore. Le problème est que la balle rebondit au milieu plutôt que de passer à travers. Il est le code pour le torus:ARKit: Balle ne passant pas par le trou 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) 

Et pour la balle:

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

double possible: https://stackoverflow.com/q/27391763/957768 – rickster

Répondre

1

Le code que vous utilisez pour créer les résultats sous une forme simplifiée « convexe physicsbody (type de corps kinametic et la forme nulle) coque "représentation de la géométrie. Autrement dit, la géométrie que vous voyez est un tore, mais la géométrie utilisée pour la détection de collision ne l'est pas.

Cette ligne de (obj c) le code est en fait de l'un des projets de code exemple d'Apple:

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

En d'autres termes, vous devez créer un corps de type statique et une forme basée sur la géométrie elle-même l'utilisation de la valeur de clé SCNPhysicsShapeTypeConcavePolyhedron (qui ne fonctionne que pour les corps statiques) aboutit à une représentation plus précise de la géométrie du tore en tant que corps physique.

Pour plus de détails: https://developer.apple.com/documentation/scenekit/scnphysicsshape

0

Merci! ça marche! il y a le code:

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