2017-10-21 14 views
0

私は壁が4つ、天井が1つ、床が1つ、家具があります。私は部屋の中で家具を引きずっていますが、壁を通っています。私は知っているすべてを試しました。それでも問題は解決できません。接触検出が機能しています。 furniture.physicsBody!.damping = 1.0プロパティを与えなければ、私の家具ノードは床にとどまっていません。ビデオをチェックしてください:https://youtu.be/1iwq7gvTzA4SceneKitの物理が意図通りに動作しない

enum ABC:Int { 
    case furni = 1 
    case wall = 4 
    case floor = 6 
} 

private func setup() { 
    // create the wall geometry 
    let wallGeometry = SCNPlane(width: 2000, height: 300) 
    wallGeometry.firstMaterial!.diffuse.contents = "Wallpaper1.png" 
    wallGeometry.firstMaterial!.isDoubleSided = false 
    wallGeometry.firstMaterial!.locksAmbientWithDiffuse = true 

    let wallWithBaseboardNode = SCNNode(geometry: wallGeometry) 
    wallWithBaseboardNode.position = SCNVector3Make(0, 150, 0) 
    wallWithBaseboardNode.physicsBody = .static() 
    wallWithBaseboardNode.physicsBody!.restitution = 1.0 
    wallWithBaseboardNode.physicsBody!.contactTestBitMask = ABC.furni.rawValue 

    //front 
    _wallNode = wallWithBaseboardNode.clone() 
    _scene.rootNode.addChildNode(_wallNode) 

    //left 
    _wallNode = wallWithBaseboardNode.clone() 
    _wallNode.position = SCNVector3Make(0, 150, 0) 
    _wallNode.rotation = SCNVector4Make(0, 1, 0, .pi/2) 
    _scene.rootNode.addChildNode(_wallNode) 

    //right 
    _wallNode = wallWithBaseboardNode.clone() 
    _wallNode.position = SCNVector3Make(roomDimensions[0], 150, 0) 
    _wallNode.rotation = SCNVector4Make(0, 1, 0, -.pi/2) 
    _scene.rootNode.addChildNode(_wallNode) 

    //back 
    _wallNode = wallWithBaseboardNode.clone() 
    _wallNode.position = SCNVector3Make(0, 150, roomDimensions[1]) 
    _wallNode.rotation = SCNVector4Make(0, 1, 0, .pi/1) 
    _scene.rootNode.addChildNode(_wallNode) 

    //ceiling 
    var ceilingNode = wallWithBaseboardNode.clone() 
    ceilingNode = wallWithBaseboardNode.copy() as! SCNNode 
    ceilingNode.geometry = (ceilingNode.geometry!.copy() as! SCNGeometry) 
    ceilingNode.geometry!.firstMaterial = SCNMaterial() 
    ceilingNode.geometry!.firstMaterial!.diffuse.contents = UIColor.white 
    ceilingNode.position = SCNVector3Make(0, Float(wallGeometry.height), 0) 
    ceilingNode.scale = SCNVector3Make(10, 10, 10) 
    ceilingNode.rotation = SCNVector4Make(1, 0, 0, .pi/2) 
    _scene.rootNode.addChildNode(ceilingNode) 

    //floor 
    let floor = SCNFloor() 
    floor.reflectionFalloffEnd = 0 
    floor.reflectivity = 0 

    _floorNode = SCNNode() 
    _floorNode.geometry = floor 
    _floorNode.geometry!.firstMaterial!.diffuse.contents = "Wood3.jpg" 
    _floorNode.geometry!.firstMaterial!.locksAmbientWithDiffuse = true 
    _floorNode.geometry!.firstMaterial!.diffuse.wrapS = .repeat 
    _floorNode.geometry!.firstMaterial!.diffuse.wrapT = .repeat 
    _floorNode.geometry!.firstMaterial!.diffuse.mipFilter = .nearest 
    _floorNode.geometry!.firstMaterial!.isDoubleSided = false 

    _floorNode.physicsBody = .static() 
    _floorNode.physicsBody!.restitution = 1.0 

    //_floorNode.physicsBody!.contactTestBitMask = ABC.furni.rawValue 

    _scene.rootNode.addChildNode(_floorNode) 
} 

をそして、これは

private func addFurniture() { 
    let furnitureScene = SCNScene(named: "a.dae", inDirectory: "assets.scnassets/models/", options: nil)! 
    let furniture = furnitureScene.rootNode.childNode(withName: "a", recursively: true)! 

    furniture.physicsBody = .dynamic() 
    furniture.physicsBody!.restitution = 1.0 
    furniture.physicsBody!.damping = 1.0 

    furniture.physicsBody!.contactTestBitMask = ABC.wall.rawValue 

    _scene.rootNode.addChildNode(furniture) 

    scnView.prepare(_scene, shouldAbortBlock: nil) 

    _furniture = furniture 

    scnView.debugOptions = [.showPhysicsShapes, .showPhysicsFields] 
} 
+0

あなたはcontactTestBitMaskとcollisionBitMaskの違いを知っていますか?その場合、contactTestBitMaskをノードに割り当てる目的は何ですか? –

+0

@ElTomatoいいえわからない。問題を解決するために私を案内してくれませんか?私はSceneKitが初めてです。それが起こるのを止めるために私は何をすべきですか?ありがとう。 – Mamedoff

+0

とにかく、affectedByGravityプロパティの物理的ボディを関連パーティーに対してfalseに設定します。 –

答えて

0

あなたは(すなわち力を使用していない)家具てmanualyを移動したい場合は、ボディタイプへの変更私の家具のノードのためのコードです。キネマティック

ノードを移動すると、contactTest(with:options:)を実行して、壁に当たった場合に連絡先リストを返すことができます。 renderer(_:willRenderScene:atTime:)では、家具の位置を固定して壁の壁のオフセットを壁に「固定」することができます。あなたがここにも同様の問題の私の解決策を見ることができます

:このことができます https://stackoverflow.com/a/46915698/1389597

希望を、私はこれを理解しようとしている数日費やしてきた:)

関連する問題