2016-12-21 5 views
0

В моем проекте SceneKit используется импортированный файл .OBJ, который содержит только один узел с огромным изображением. Изображение содержит различные объекты или части. Мне нужно нажать на ногу или конкретную часть изображения и выделить ее. Это код импортировать .obj файлСцены SceneKit NSNode

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 

и здесь я использую водопроводная жест распознаватель

// 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)   
} 

У меня есть 3D-модели с различными частями, как левой ноги правой ноги и необходимо быть перехвачен полу и показать на них другой цвет. Проблема в том, что все они находятся в одном узле.

+0

Вы уверены, что это всего лишь один узел и у него нет детей? Обычно для каждого узла имеется 1 изображение. Проверьте иерархию узлов еще раз. В противном случае, как говорит Хэл Мюллер, разумно вернуться к программному обеспечению для 3D-моделирования и просто разбить эту сетку на несколько сеток. –

+0

Да, я уверен, что есть только один узел. Узел содержит множество элементов геометрии, которые я получил с помощью метода HitTest. Наконец, я получил каждую часть 3D-модели. Теперь я сталкиваюсь с проблемой, что как я могу применять материалы для диффузии цветов элементов геометрии? –

+0

Ознакомьтесь с документацией для 'SCNGeometryElement' https://developer.apple.com/reference/scenekit/scngeometryelement. Ваша геометрия состоит из нескольких элементов, которые могут соответствовать нескольким материалам. –

ответ

0

Ваш SCNHitTestResult даст вам указатель треугольника, который был использован. Но вам все равно придется выработать логику перехода от одного треугольника к распознаванию «это была левая рука».

Я думаю, что лучше всего вернуться к вашему программному обеспечению 3D-моделирования и разбить объект на более мелкие логические компоненты.

+0

Я выполнил первую задачу, чтобы узнать объект, как я могу оттенять или рассеивать цвет ElementIndex, который возвращался HITTEST Array? –

+0

Фактически, вы не можете. Теоретически, конечно, вы можете, но это потребует от вас глубокого знания того, как ваш инструмент моделирования присваивает материалы треугольникам и как индексы элементов назначаются. Я уверен, что есть кто-то, кто знает, как это сделать, но лучше всего использовать Blender или Maya или 3ds Max или Cheetah3D, чтобы разбить ваш .OBJ на более мелкие компоненты. –

+0

сэр, на самом деле у меня есть массив методом HitTest, который состоит из многих объектов SCHHITTESTRESULT, которые я взял первым и использовал свойство geometryIndex, который возвратил мне все части 3D-модели от 1 до 36. Теперь головная боль заключается в том, как я могу применять разные цвет на этой части geometryIndex? –