2016-03-23 9 views
0

Als ob ich einige benutzerdefinierte Form erstellen möchte, indem Sie einige SCNBox und SCNPyramid usw. kombinieren, kann ich sie zusammensetzen, indem Sie die richtigen Positionen und Geometrien einstellen. Wie auch immer, ich kann einfach keinen Weg finden, sie als eine Einheit zu kombinieren, die in der physischen Welt modifiziert oder reagiert werden kann. Der Code unten, dass ich möchte, erstellen Sie eine einfache Haus Form SCNNode, und ich möchte den Knoten aneinander befestigt, wenn durch Kollisionen und Schwerkraft betroffen. Kann jemand einige Hinweise geben?So kombinieren Sie zwei oder mehr SCNGeometry/SCNNode zu einem

let boxGeo = SCNBox(width: 5, height: 5, length: 5, chamferRadius: 0) 
    boxGeo.firstMaterial?.diffuse.contents = UIColor.blueColor() 

    let box = SCNNode(geometry: boxGeo) 
    box.position = SCNVector3Make(0, -2.5, 0) 
    scene.rootNode.addChildNode(box) 

    let pyramidGeo = SCNPyramid(width: 7, height: 7, length: 7) 
    pyramidGeo.firstMaterial?.diffuse.contents = UIColor.greenColor() 

    let pyramid = SCNNode(geometry: pyramidGeo) 
    pyramid.position = SCNVector3Make(0, 0, 0) 
    scene.rootNode.addChildNode(pyramid) 

enter image description here

Antwort

1

einen Container Knoten Machen, einfach einen leeren Knoten ohne Geometrie. Nennen wir es "houseNode", da es so aussieht, als ob man es baut.

let houseNode = SCNNode() 

Jetzt machen Sie Ihre anderen zwei Knoten Kinder von diesem.

houseNode.addChildNode(pyramid) 
houseNode.addChildNode(box) 

Verwenden Sie jetzt den Container-Knoten, wenn Sie immer auf die beiden kombinierten Knoten zugreifen möchten.

Bearbeiten: Sie können durch Aufzählung in Ihrem Container Änderungen an der Geometrie der Objekte bewirken:

houseNode.enumerateChildNodesUsingBlock({ 
     node, stop in 
     // change the color of all the children 
     node.geometry?.firstMaterial?.diffuse.contents = UIColor.purpleColor() 
     // I'm not sure on this next one, I've yet to use "physics". 
     houseNode.physicsBody?.affectedByGravity = true 
    }) 
+0

houseNode.geometry? .firstMaterial? .diffuse.contents = UIColor.purpleColor() houseNode.physicsBody? .affectedByGravity = true – NEO

+0

Wenn ich möchte seine Farbe oder physicsBody wie der oben genannte Code ändern, dies nur würde nicht funktionieren! Ich glaube, das liegt daran, dass die Geometrie- und Physik-Form von houseNode noch nicht definiert wurde. Und das will ich herausfinden. – NEO

+0

Der Container ist nützlich für Positionierung, Orientierung, Bewegung usw. Versuchen Sie den bearbeiteten Vorschlag, den ich oben hinzugefügt habe. Ich habe die Physik-Engine noch nicht benutzt, ich bin mir nicht sicher über diesen Teil des Vorschlags. – bpedit

1

Dank bpedit!

Mit der childNodes-Methode und dem folgenden Code, um eine physicsShape zu setzen, fand ich die Lösung dafür.

 houseNode.physicsBody = SCNPhysicsBody(type: .Dynamic, 
             shape: SCNPhysicsShape(node: houseNode, 
             options: [SCNPhysicsShapeKeepAsCompoundKey: true])) 
+0

Diese SCNPhysicsShape ist nicht dieselbe wie normale SCNPhysicsShape, die wie SCNBox erstellt wurde. Als Folge davon hat dies ein seltsames Phänomen, dass der Hausknoten nicht fallen würde, wenn ein kleiner Teil an einem kinetischen Körpertyp anhaftet. Arbeitet immer noch daran. – NEO