2017-07-06 2 views
2

J'ai un cube avec un corps physique dynamique et un plan avec un corps physique cinématique.Lorsque je place un cube au-dessus du plan, il tombera sur le plan et un rebond est prévu.sceneKit corps physique dynamique tomber à travers le plancher

Le PROBLÈME est la suivante: lorsque le cube est petit ou léger, il suffit de passer par exemple plane.For, cube a 0,1 * 0,1 * 0,1 fin de travail, mais 0,05 * 0,05 * 0,05 sucks.In ce cas, je reçois toujours notification de contact avec le corps physique.

ceci est mon code pour créer la géométrie:

//cube 
//when dimension is 0.1 everything is fine 
float dimension = 0.05; 
SCNBox *cube = [SCNBox boxWithWidth:dimension height:dimension length:dimension chamferRadius:0]; 
cube.materials = @[material]; 
SCNNode *node = [SCNNode nodeWithGeometry:cube]; 
node.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:nil]; 
node.physicsBody.mass = 1; 
node.physicsBody.categoryBitMask = phsicBodyCategoryCube; 
node.physicsBody.collisionBitMask = phsicBodyCategoryPlane; 
node.physicsBody.contactTestBitMask = phsicBodyCategoryPlane; 

//plane 
self.planeGeometry = [SCNBox boxWithWidth:100 height:0.01 length:100 chamferRadius:0 
plane.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeKinematic 
        shape: [SCNPhysicsShape shapeWithGeometry:self.planeGeometry options:nil]]; 
plane.physicsBody.categoryBitMask = phsicBodyCategoryPlane; 
plane.physicsBody.collisionBitMask = phsicBodyCategoryCube; 
plane.physicsBody.contactTestBitMask = phsicBodyCategoryCube; 
+0

Avez-vous essayé de changer la valeur 'physicsWorld.timeStep'? –

+0

NON, je ne l'ai pas changé. – ooOlly

Répondre

1

Je suis surpris que vous obtenez des collisions du tout. Voir le SCNPhysicsBodyType docs - le type cinématique est pour les corps que vous déplacez (en positionnant leur position, etc) pour causes collisions, mais qui ne sont pas eux-mêmes affectés par d'autres corps en collision avec eux.

Si vous définissez le type de sol à static, vous obtiendrez probablement de meilleurs résultats. Un corps statique ne bouge pas (soit à la suite d'interactions physiques, soit en définissant sa position), de sorte que le moteur physique peut vérifier avec plus de précision si d'autres corps entrent en collision avec lui.


modifier: Autres choses à regarder dans:

  • Utilisez un SCNPlane plutôt que d'un SCNBox pour votre plancher. (Notez que vous pouvez créer des corps physiques avec des formes différentes de leur géométrie visible, si cela vous aide.) Je ne suis pas sûr de SceneKit, mais il est plus facile pour beaucoup de moteurs physiques de vérifier "un objet passé cet infini frontière depuis la dernière image? " que "est un objet à l'intérieur cette région finie sur ce cadre?"
  • Activez la détection de collision précise pour vos objets en mouvement.
+0

Merci beaucoup! J'ai mal compris le SCNPhysicsBodyTypeKinematic. Mais quand j'essaye SCNPhysicsBodyTypeStatic, le cube passe toujours par le plancher. – ooOlly

0

Enfin, j'ai trouvé que tout cela concerne la simulation physique de SceneKit. Si le cube tombe trop vite, il fera une grande pénétration avec plan dans les étapes de simulation physique. Dans ce cas, sceneKit le laisse tomber à travers l'avion au lieu de la collision. Quand je change la vitesse du cube à une petite valeur Il est entré en collision avec le plan.

Ma solution est de donner une vitesse ascendante au cube lorsque survient une sur-pénétration importante, qui correspond à 30% de la vitesse de chute. L'astuce consiste à ajuster la vélocité du cube jusqu'à ce qu'une collision se produise.