2017-08-18 4 views
0

Je fabrique une voiture dans une scène et les roues semblent couler dans le sol. J'ai utilisé le code Apples pour le faire. Quand j'utilise leur modèle, cela fonctionne très bien. Mais quand j'utilise le mien, non. Je ne peux pas comprendre pourquoi cela se passe. Heres une image des roues de voiture coulant et le code est juste en dessous. enter image description hereenter image description hereLes roues du véhicule s'enfoncent dans le plancher - Scenekit (IOS)

@IBAction func AddFloor(_ sender: Any) { 
    let floor = SCNNode() 
    let floorGeom = SCNFloor() 
    floorGeom.firstMaterial?.diffuse.contents = "concrete.png" 

    floor.geometry = floorGeom 
    let staticBody = SCNPhysicsBody.static() 
    floor.physicsBody = staticBody 

    floor.position = SCNVector3(0, -10, 0) 

    sceneView.scene.rootNode.addChildNode(floor) 
} 


@IBAction func AddCar(_ sender: Any) { 
    let chassisNode = getNode("rccarBody", fromDaePath: "Models.scnassets/rc_car.scn") 
    let wheelnode0 = chassisNode 
     .childNode(withName: "wheelFrontL", recursively: false) 
    let wheelnode1 = chassisNode 
     .childNode(withName: "wheelFrontR1", recursively: false) 
    let wheelnode2 = chassisNode 
     .childNode(withName: "wheelRearL", recursively: false) 
    let wheelnode3 = chassisNode 
     .childNode(withName: "wheelRearR", recursively: false) 


    let body = SCNPhysicsBody.dynamic() 
    body.allowsResting = false 
    body.mass = 80 
    body.restitution = 0.1 
    body.friction = 0.5 
    body.rollingFriction = 0 
    chassisNode.physicsBody = body 
    sceneView.scene.rootNode.addChildNode(chassisNode) 



    // add wheels 
    let wheel0 = SCNPhysicsVehicleWheel(node: wheelnode0!) 
    let wheel1 = SCNPhysicsVehicleWheel(node: wheelnode1!) 
    let wheel2 = SCNPhysicsVehicleWheel(node: wheelnode2!) 
    let wheel3 = SCNPhysicsVehicleWheel(node: wheelnode3!) 
    // set physics 
    vehicle = SCNPhysicsVehicle(chassisBody: chassisNode.physicsBody!, 
           wheels: [wheel1, wheel0, wheel3,wheel2 ]) 
    chassisNode.position = SCNVector3(0,-8,0) 

    sceneView.scene.physicsWorld.addBehavior(vehicle) 
} 

Répondre

0

Je viens de travailler sur une question similaire, et réalisé que l'ajout d'un SCNFloor n'a pas créé necesarily une bonne géométrie pour interagir avec comme PhysicsBody.

Je recommande d'ajouter sceneView.debugOptions = [.showPhysicsShapes] afin que vous puissiez voir les boîtes englobantes des différents objets physiques interagissant. Dans mon cas, j'ai fait de la géométrie du sol une forme de boîte très large, longue et mince plutôt que d'essayer d'utiliser la géométrie intégrée du «plancher», qui ne créait qu'un minuscule cube pour les interactions de collision.

J'ai un peu d'exemple de code dans un terrain de jeu macOS à github.com/heckj/scenekit-physics-playground si vous voulez voir et voler quelque chose d'utile pour le débogage.