2016-07-28 12 views
5

Ich versuche, einen ausgewählten Knoten in SceneKit mit einer Tippgeste hervorzuheben. Leider habe ich es nicht geschafft. Das Beste, was ich tun konnte, war, das Material zu ändern, wenn der Knoten angetippt wurde.Hinzufügen eines Rahmens um den SceneKit-Knoten

let material = key.geometry!.firstMaterial! 
material.emission.contents = UIColor.blackColor() 

Kann jemand einen Weg schlage ich gehen, nur eine Grenze oder Kontur um das Objekt hinzufügen, anstatt die Farbe des ganzen Knotens zu ändern?

+0

Sie meinen, eine 'SKSpriteNode' richtig? Kein 'SKNode'. –

+0

Sorry für jede Verwirrung, ich benutze Szene Kit .. scnnode –

Antwort

2

SCNNode entspricht dem SCNBoundingVolume Protokoll.

Dieses Protokoll definiert die getBoundingBoxMin:max: Methode.

verwenden die minimalen und maximalen Koordinaten des Begrenzungskastens der Geometrie an den Knoten angehängt zu bekommen.

verwenden dann den SceneKit Urtyp SCNGeometryPrimitiveTypeLine die Linien des Begrenzungsrahmens zu ziehen. Überprüfen Sie SCNGeometryElement.

+1

Können Sie bitte einige Beispielcode, wie dies zu tun? Auch ich suche nach der gleichen Lösung – yaali

0

Basierend auf @Karl Sigiscar Antwort und eine andere Antwort hier in so kam ich mit auf den Punkt:

func createLineNode(fromPos origin: SCNVector3, toPos destination: SCNVector3, color: UIColor) -> SCNNode { 
    let line = lineFrom(vector: origin, toVector: destination) 
    let lineNode = SCNNode(geometry: line) 
    let planeMaterial = SCNMaterial() 
    planeMaterial.diffuse.contents = color 
    line.materials = [planeMaterial] 

    return lineNode 
} 

func lineFrom(vector vector1: SCNVector3, toVector vector2: SCNVector3) -> SCNGeometry { 
    let indices: [Int32] = [0, 1] 

    let source = SCNGeometrySource(vertices: [vector1, vector2]) 
    let element = SCNGeometryElement(indices: indices, primitiveType: .line) 

    return SCNGeometry(sources: [source], elements: [element]) 
} 


func highlightNode(_ node: SCNNode) { 
    let (min, max) = node.boundingBox 
    let zCoord = node.position.z 
    let topLeft = SCNVector3Make(min.x, max.y, zCoord) 
    let bottomLeft = SCNVector3Make(min.x, min.y, zCoord) 
    let topRight = SCNVector3Make(max.x, max.y, zCoord) 
    let bottomRight = SCNVector3Make(max.x, min.y, zCoord) 


    let bottomSide = createLineNode(fromPos: bottomLeft, toPos: bottomRight, color: .yellow) 
    let leftSide = createLineNode(fromPos: bottomLeft, toPos: topLeft, color: .yellow) 
    let rightSide = createLineNode(fromPos: bottomRight, toPos: topRight, color: .yellow) 
    let topSide = createLineNode(fromPos: topLeft, toPos: topRight, color: .yellow) 

    [bottomSide, leftSide, rightSide, topSide].forEach { 
     $0.name = kHighlightingNode // Whatever name you want so you can unhighlight later if needed 
     node.addChildNode($0) 
    } 
} 

func unhighlightNode(_ node: SCNNode) { 
    let highlightningNodes = node.childNodes { (child, stop) -> Bool in 
     child.name == kHighlightingNode 
    } 
    highlightningNodes.forEach { 
     $0.removeFromParentNode() 
    } 
}