2015-02-05 19 views
7

Angenommen, ich habe eine Collada-Datei, die eine Box enthält, und ich importiere die Dae-Datei in die Szene. Jetzt, nachdem ich in die Szene importiert habe, weiß ich, dass das Dae-Objekt eine Box ist. Wie bekomme ich die Abmessungen der Box in Scenekit nach dem Hinzufügen der Szene in die SzeneGröße des Dae-Knotens

Wenn ich den Knoten als SCNBox importieren, bekomme ich Fehler, dass SNCBox ist kein Untertyp von SCNNode.

Wie bekomme ich die Dimensionen, wenn SCNNode die einzige Möglichkeit ist, Knoten zu importieren?

Antwort

9

SCNBox ist nur Helfer Unterklasse von SCNGeometry für Box Geometrie erstellen. Wenn Sie Collada in eine Szene importieren, erhalten Sie Szenendiagramm von SCNNodes mit SCNGeometries, nicht SCNBox'es oder SCNCones usw., egal wie sie aussehen. Wenn Sie Dimensionen von jedem Knoten erhalten möchten, sollten Sie SCNBoundingVolume Protokoll verwenden, die von beiden SCNNode und SCNGeometry Klassen implementiert:

func getBoundingBoxMin(_ min: UnsafeMutablePointer, max max: UnsafeMutablePointer) -> Bool

Mit dieser Methode erhalten Sie Box Ecken begrenzen. Bei kastenförmiger Geometrie entsprechen die Abmessungen der Begrenzungsbox.

Beispiel:

var v1 = SCNVector3(x:0, y:0, z:0) 
var v2 = SCNVector3(x:0, y:0, z:0) 
node.getBoundingBoxMin(&v1, max:&v2) 

Wo Knoten ist der Knoten Sie Begrenzungsrahmen erhalten möchten. Ergebnisse werden in v1 und v2 sein.

Swift 3

Mit Swift 3 Sie einfach node.boundingBox.min und node.boundingBox.max bzw. verwenden können.

+0

Hallo Dank !. Können Sie zeigen, wie Sie die Funktion getBoundingBox verwenden? Ich meine, ich verstehe die Bedeutung von unsafeMutablePoints nicht. : D –

+0

Aktualisierte Antwort mit Beispiel. In diesem Fall sind unsichere Zeiger genau wie in C. –

+0

Oh ok. Vielen Dank! Also kann ich mit der Bounding Box auf Kollision prüfen? Wenn ich Physik nicht für die Kollisionserkennung verwenden wollte. Hat Scenekit so etwas wie Schnittpunkte? CollisionBox?!?! –

5

Beispiel SWIFT-Code, wie getBoundingBoxMin verwenden:

var min = SCNVector3Zero 
    var max = SCNVector3Zero 
    let b = shipNode.getBoundingBoxMin(&min , max: &max) 
    let w = CGFloat(max.x - min.x) 
    let h = CGFloat(max.y - min.y) 
    let l = CGFloat(max.z - min.z) 
    let boxShape = SCNBox (width: w , height: h , length: l, chamferRadius: 0.0) 
    let shape = SCNPhysicsShape(geometry: boxShape, options: nil) 

    shipNode.physicsBody!.physicsShape = SCNPhysicsShape(geometry: boxShape, options: nil) 
    shipNode.physicsBody = SCNPhysicsBody.dynamicBody()