2017-09-13 2 views
1

scn 노드 내에서 여러 물질간에 충돌 탐지를 시도하고 있습니다. 큐브에는 6 가지 재료/색상과 볼이 있습니다. 동일하고 다른 색깔의 충돌을 감지하고 싶지만 각 자료에 다른 카테고리를 적용하는 방법을 모릅니다.scn 노드 내에서 다른 물질에 충돌 감지를 얻는 방법

import UIKit 
import SceneKit 

class GameViewController: UIViewController, SCNPhysicsContactDelegate { 

나중에 큐브의 다른면에 지정할 범주를 만들 수 있습니까?

let ballCategory = 0 
let cubeCategory = 1 
let ballGreen = 2 
let ballRed = 3 
let ballBlue = 4 
let ballYellow = 5 
let ballPurple = 6 
let ballOrange = 7 
let cubeGreen = 8 
let cubeRed = 9 
let cubeBlue = 10 
let cubeYellow = 11 
let cubePurple = 12 
let cubeOrange = 13 

설치 물건

var scnView: SCNView! 
var scnScene = SCNScene() 
var cameraNode: SCNNode! 
var cubeNode = SCNNode() 
var ball = SCNNode() 

var randomColor: UIColor? 

var timer = Timer() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    scnScene.physicsWorld.contactDelegate = self 

    scnView = self.view as? SCNView 

     view.scene = scnScene 
     view.isPlaying = true 

    } 

    setupView() 
    setupScene() 
    setupCamera() 
    spawnCube() 

} 

윌 물리학의 세계는 접촉 작업을 시작 했습니까? 내가하려고 할 때 내가 다른 측면에 카테고리를 추가 할 때

func physicsWorld(world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 
      print("Physics called") 

    if (contact.nodeA == cubeNode || contact.nodeA == ball) && (contact.nodeB == cubeNode || contact.nodeB == ball) { 

     print("contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 2 && contact.nodeB.physicsBody!.categoryBitMask == 8) || (contact.nodeB.physicsBody!.categoryBitMask == 2 && contact.nodeA.physicsBody!.categoryBitMask == 8) { 

     print("green contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 3 && contact.nodeB.physicsBody!.categoryBitMask == 9) || (contact.nodeB.physicsBody!.categoryBitMask == 3 && contact.nodeA.physicsBody!.categoryBitMask == 9) { 

     print("green contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 4 && contact.nodeB.physicsBody!.categoryBitMask == 10) || (contact.nodeB.physicsBody!.categoryBitMask == 4 && contact.nodeA.physicsBody!.categoryBitMask == 10) { 

     print("green contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 5 && contact.nodeB.physicsBody!.categoryBitMask == 11) || (contact.nodeB.physicsBody!.categoryBitMask == 5 && contact.nodeA.physicsBody!.categoryBitMask == 11) { 

     print("green contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 6 && contact.nodeB.physicsBody!.categoryBitMask == 12) || (contact.nodeB.physicsBody!.categoryBitMask == 6 && contact.nodeA.physicsBody!.categoryBitMask == 12) { 

     print("green contact") 

    } 

    if (contact.nodeA.physicsBody!.categoryBitMask == 7 && contact.nodeB.physicsBody!.categoryBitMask == 13) || (contact.nodeB.physicsBody!.categoryBitMask == 7 && contact.nodeA.physicsBody!.categoryBitMask == 13) { 

     print("green contact") 

    } 

} 

func setupView() { 
    scnView = self.view as! SCNView 
    scnView.showsStatistics = false 
    scnView.allowsCameraControl = false 
    scnView.autoenablesDefaultLighting = true 

} 

func setupScene() { 
    scnScene = SCNScene() 
    scnView.scene = scnScene 
    scnScene.background.contents = UIColor.black 
} 

func setupCamera() { 

    cameraNode = SCNNode() 

    cameraNode.camera = SCNCamera() 
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 10) 
    scnScene.rootNode.addChildNode(cameraNode) 

} 

큐브 설치, 나는 오류를 받고 있어요/재료

func spawnCube() { 

    var geometry:SCNGeometry 

    geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.05) 

    cubeNode = SCNNode(geometry: geometry) 

    let greenMaterial = SCNMaterial() 
    greenMaterial.diffuse.contents = UIColor.green 
    greenMaterial.locksAmbientWithDiffuse = true 

    let redMaterial = SCNMaterial() 
    redMaterial.diffuse.contents = UIColor.red 
    redMaterial.locksAmbientWithDiffuse = true 

    let blueMaterial = SCNMaterial() 
    blueMaterial.diffuse.contents = UIColor.blue 
    blueMaterial.locksAmbientWithDiffuse = true 

    let yellowMaterial = SCNMaterial() 
    yellowMaterial.diffuse.contents = UIColor.yellow 
    yellowMaterial.locksAmbientWithDiffuse = true 

    let purpleMaterial = SCNMaterial() 
    purpleMaterial.diffuse.contents = UIColor.purple 
    purpleMaterial.locksAmbientWithDiffuse = true 

    let orangeMaterial = SCNMaterial() 
    orangeMaterial.diffuse.contents = UIColor.orange 
    orangeMaterial.locksAmbientWithDiffuse = true 

    geometry.materials = [greenMaterial, redMaterial, blueMaterial, 
          yellowMaterial, purpleMaterial, orangeMaterial] 

    cubeNode.physicsBody?.mass = 10000 
    cubeNode.physicsBody?.restitution = 0 
    cubeNode.physicsBody?.damping = 0 
    cubeNode.physicsBody = SCNPhysicsBody.kinematic() 
    cubeNode.physicsBody?.categoryBitMask = Int(cubeCategory) 
    cubeNode.physicsBody?.contactTestBitMask = Int(ballCategory) 
    cubeNode.physicsBody?.isAffectedByGravity = false 

    cubeNode.position = SCNVector3(x: 0, y: 0, z: 0) 

    scnScene.rootNode.addChildNode(cubeNode) 
} 

볼 설정, 또한 오류를 받고 있어요 다른 볼 색상

func spawnBall() { 

    var geometry:SCNGeometry 

    geometry = SCNSphere(radius: 0.25) 

    let ball = SCNNode(geometry: geometry) 

    let randomNumberForColor = Int(arc4random_uniform(6)) 

    if randomNumberForColor == 1 { 
     randomColor = UIColor.green 
    } 
    if randomNumberForColor == 2 { 
     randomColor = UIColor.red 
    } 
    if randomNumberForColor == 3 { 
     randomColor = UIColor.blue 
    } 
    if randomNumberForColor == 4 { 
     randomColor = UIColor.yellow 
    } 
    if randomNumberForColor == 5 { 
     randomColor = UIColor.purple 
    } 
    if randomNumberForColor == 6 { 
     randomColor = UIColor.orange 
    } 
    if randomNumberForColor == nil { 
     randomColor = UIColor.green 
    } 

    let greenMaterial = SCNMaterial() 
    greenMaterial.diffuse.contents = randomColor 
    greenMaterial.locksAmbientWithDiffuse = true; 

    geometry.materials = [greenMaterial] 

    ball.physicsBody?.mass = 0.00001 
    ball.physicsBody?.restitution = 1 
    ball.physicsBody?.damping = 0 
    ball.physicsBody = SCNPhysicsBody.dynamic() 
    ball.physicsBody?.categoryBitMask = Int(ballCategory) 
    ball.physicsBody?.contactTestBitMask = Int(cubeCategory) 
    ball.physicsBody?.isAffectedByGravity = false 

    randomX() 
    randomY() 
    randomZ() 

    ball.position = SCNVector3(x: Float(randomNumX!), y: Float(randomNumY!), z: Float(randomNumZ!)) 

    scnScene.rootNode.addChildNode(ball) 

    let force = SCNVector3(x: Float(-randomNumX!)/2, y: Float(-randomNumY!)/2, z: Float(-randomNumZ!)/2) 

    ball.physicsBody?.applyForce(force, at: cubeNode.position, asImpulse: true) 

} 

func randomX() { 

    randomNumX = Int(arc4random_uniform(10)) - 5 

} 

func randomY() { 

    randomNumY = Int(arc4random_uniform(20)) - 10 

} 

func randomZ() { 

    randomNumZ = Int(arc4random_uniform(10)) - 5 

} 

}

에 다른 카테고리를 추가하는 것은 아마도이 문제를 단순화 할 수있는 방법이 일치하는 색상의 한정자로 볼 및 큐브 충돌을 감지 할 수 있습니까?

감사합니다.

+0

연락처를 검색 할 때 공의 색상과 얼굴의 색상을 비교하는 것이 가장 좋은 이유는 무엇입니까? 이게 너 니가 보낸거야? –

+0

예, 정확히 구현 했습니까? – spapp

답변

0

SCNBox 클래스는 재료 수를 처리하는 데 필요한대로 SCNGeometryElement 객체를 자동으로 만듭니다. 귀하의 경우 geometry.material에 6 개의 다른 재질을 추가하므로 큐브의 각면에 하나씩 6 개의 다른 GeometryElements가 자동으로 있습니다.

SCNPhysicsContact에서 두 물리 섹터 사이에 contact point을 가져올 수 있습니다.

이 시점에서 Hit Test을 수행하면 Hit Test Result의 배열을 얻을 수 있습니다. 이 경우 배열은 2 개의 결과를 의미하는 2 개의 요소를 가지며, 하나는 큐브 용이고 다른 하나는 공 용입니다.

두 요소를 살펴보고 어느 것이 큐브인지 확인하십시오. 결과의 '노드'속성을 가져 와서 노드 이름이 '큐브'또는 '공'인지 확인하십시오. 물론 노드를 만들 때 노드의 이름 속성을 설정하십시오.)

이제 큐브에 대한 결과가 어느 것인지 알았으므로 Geometry Index 결과를 얻으십시오. 이 인덱스를 사용하여 볼이 충돌 한 얼굴의 색상을 얻습니다.

지오메트리 요소는 재료 배열의 재료와 동일한 순서로 표시됩니다. 예를 들어 기하학적 요소 색인 0이 있으면 재료 배열의 첫 번째 재료 등입니다.

관련 문제