2016-12-21 4 views
0

Mein SceneKit-Projekt verwendet eine importierte OBJ-Datei, die nur einen Knoten mit einem großen Bild enthält. Bild umfasst verschiedene Objekte oder Teile. Ich muss auf einen Fuß oder ein bildspezifisches Teil tippen und es markieren lassen. Dies ist Code OBJ-DateiSceneKit NSNode Split-Teile

sceneView = SCNView(frame: self.view.frame) 
    self.view.addSubview(sceneView) 

    let scene = SCNScene(named: "OBJ.obj")! 
    print("\(scene.rootNode.childNodes.first?.geometry?.materials.count)") 
    sceneView.scene = scene 

und hier zu importieren Ich bin mit tap Gestenerkenner

// add a tap gesture recognizer 
    let doubleTapRecognizer = UITapGestureRecognizer(target: self, action : #selector(self.tapGesture(sender:))); 
    doubleTapRecognizer.numberOfTapsRequired = 1; 
    doubleTapRecognizer.numberOfTouchesRequired = 1; 
    sceneView.addGestureRecognizer(doubleTapRecognizer); 

func tapGesture(sender: UITapGestureRecognizer){ 
    let hitResult : SCNHitTestResult 
    // check what nodes are tapped 
    let p = sender.location(in: sceneView) 
    let hitResults = sceneView.hitTest(p, options: nil)   
} 

Ich habe 3D-Modell mit verschiedenen Teilen wie dem linken Fuß den rechten Fuß und Boden benötigt werden angezapft und zeige unterschiedliche Farbe auf ihnen. Das Problem ist, dass alle diese in einem einzelnen Knoten sind.

+0

Sind Sie sicher, dass es nur ein Knoten ist und keine Kinder hat? Es ist üblich, ein Bild für mehrere Knoten zu haben. Überprüfen Sie Ihre Knotenhierarchie erneut. Ansonsten, wie Hal Mueller sagt, ist es sinnvoll, zu einer 3D-Modellierungssoftware zurückzukehren und dieses Netz in mehrere Netze zu teilen. –

+0

ja bin sicher, dass es nur einen Knoten gibt. Der Knoten besteht aus vielen Geometrieelementen, die ich mithilfe der HitTest-Methode erhalten habe. Endlich habe ich jeden Teil des 3D Modells bekommen. Jetzt stehe ich vor dem Problem, wie kann ich Materialien anwenden, um Geometrieelementfarben zu streuen? –

+0

Überprüfen Sie die Dokumentation für 'SCNGeometryElement' https://developer.apple.com/reference/scenekit/scngeometryelement. Ihre Geometrie besteht aus mehreren Elementen, die mehreren Materialien entsprechen können. –

Antwort

0

Ihre SCNHitTestResult gibt Ihnen den Index des Dreiecks, das angezapft wurde. Aber Sie müssen immer noch die Logik ausarbeiten, von einem einzigen Dreieck zum Erkennen "das war der linke Arm" zu gehen.

Ich denke, Ihre beste Wette ist, zurück zu Ihrer 3D-Modellierungssoftware zu gehen und das Objekt in kleinere, logische Komponenten zu zerlegen.

+0

Ich habe die erste Aufgabe gemacht, um das Objekt zu erkennen, wie kann ich die Farbe von ElementIndex, die von HITTEST Array zurückgegeben wurde, schattieren oder streuen? –

+0

Effektiv können Sie nicht. Theoretisch können Sie das natürlich, aber Sie müssen wissen, wie Ihr Modellwerkzeug Materialien Dreiecken zuordnet und wie die Element-Indizes zugewiesen werden. Ich bin mir sicher, dass da draußen jemand ist, der weiß, wie man das macht, aber am besten ist es, Blender oder Maya oder 3ds Max oder Cheetah3D zu benutzen, um deine .OBJ in kleinere Komponenten zu zerlegen. –

+0

Sir eigentlich habe ich ein Array von HitTest-Methode, die aus vielen SCHHITTESTRESULT-Objekte besteht Ich nahm zuerst und verwendete Eigenschaft GeometrieIndex, die mir alle Teile des 3D-Modells von 1 bis 36 zurückgegeben. Jetzt ist die Kopfschmerzen, wie kann ich anders anwenden Farbe auf diesem geometryIndex Teil? –