私は壁が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]
}
あなたはcontactTestBitMaskとcollisionBitMaskの違いを知っていますか?その場合、contactTestBitMaskをノードに割り当てる目的は何ですか? –
@ElTomatoいいえわからない。問題を解決するために私を案内してくれませんか?私はSceneKitが初めてです。それが起こるのを止めるために私は何をすべきですか?ありがとう。 – Mamedoff
とにかく、affectedByGravityプロパティの物理的ボディを関連パーティーに対してfalseに設定します。 –