如何为单个图像提供多个选择选项?

问题描述:

我正在使用SceneKit导入人体的三维图像模型。当我在图像中选择特定的位置点时,我希望应用识别身体部位并为每个部位执行不同的功能。我如何去实施这个?做这个的最好方式是什么?如何为单个图像提供多个选择选项?

P.s.当图像旋转时,它会显示不同的视图。我需要应用程序能够识别身体的部分,即使它是由用户旋转。任何指导如何进行,将不胜感激..

这是一个简单的SceneKit采摘的例子。

场景设置在viewDidLoad中,对于您的用例,我希望场景可以从文件加载(最好用另一种方法完成)。这个文件将希望将不同的组件作为树状分层结构中的独立组件。这个3D身体模型的作者将有希望地标记这些组件,以便您的代码可以识别当您选择左股骨(而不是comp2345)时要做什么。

对于一个复杂的模型来说,任何xy坐标都会有几个'命中',因为您将返回所有与该命中射线相交的节点。你不妨只使用第一次击中。

import UIKit 
import SceneKit 

class ViewController: UIViewController { 

    @IBOutlet var scenekitView: SCNView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let scene = SCNScene() 

     let boxNode = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)) 
     boxNode.name = "box" 
     scene.rootNode.addChildNode(boxNode) 

     let sphereNode = SCNNode(geometry: SCNSphere(radius: 1)) 
     sphereNode.name = "sphere" 
     sphereNode.position = SCNVector3Make(2, 0, 0) 
     boxNode.addChildNode(sphereNode) 

     let torusNode = SCNNode(geometry: SCNTorus(ringRadius: 1, pipeRadius: 0.3)) 
     torusNode.name = "torus" 
     torusNode.position = SCNVector3Make(2, 0, 0) 
     sphereNode.addChildNode(torusNode) 

     scenekitView.scene = scene 
     scenekitView.autoenablesDefaultLighting = true 
     scenekitView.allowsCameraControl = true 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

     //get the first touch location in screen coordinates 
     guard let touch = touches.first else { 
      return 
     } 

     //convert the screen coordinates to view coordinates as the SCNView make not take 
     //up the entire screen. 
     let pt = touch.locationInView(self.scenekitView) 

     //pass a ray from the points 2d coordinates into the scene, returning a list 
     //of objects it hits 
     let hits = self.scenekitView.hitTest(pt, options: nil) 

     for hit in hits { 
      //do something with each hit 
      print("touched ", hit.node.name!) 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 
+0

感谢您的信息兄弟。我的图像模型将是一个COLLADA文件。当我输入它时,它本身就是一个完整的实体。你在答案中使用了不同的节点。我的情况是,我导入的整个图像将是一个节点。有什么办法可以用不同的方式引用单个节点吗?或者如果我可以将我的图像节点分成多个可以引用的子节点? – Jobs

+0

是的,我预计它会是一个Collada文件。但是,将它导入SceneKit时,它应包含多个节点。 Collada文件可以表示整个场景(当然,场景可能只包含一个节点)。 – lock

+0

您可以简单介绍一下我应该如何创建多个节点到示例dae文件中的文档或材料? – Jobs