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

Ios 如何为单个图像提供多个选择选项?,ios,swift,3d,scenekit,Ios,Swift,3d,Scenekit,我正在使用SceneKit导入人体的三维图像模型。当我在图像中选择一个特定的位置点时,我希望应用程序能够识别身体部位,并为每个部位执行不同的功能。我如何着手实施这一点?最好的方法是什么 另外,当图像旋转时,它会显示不同的视图。我需要该应用程序能够识别身体部位,即使它是由用户旋转。任何关于如何进行的指导都将不胜感激。这里是一个简单的SceneKit挑选示例 场景是在viewDidLoad中设置的,对于您的用例,我希望可以从文件中加载场景(最好使用另一种方法)。希望此文件中包含您希望在树状层次结构中

我正在使用
SceneKit
导入人体的三维图像模型。当我在图像中选择一个特定的位置点时,我希望应用程序能够识别身体部位,并为每个部位执行不同的功能。我如何着手实施这一点?最好的方法是什么


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

这里是一个简单的SceneKit挑选示例

场景是在
viewDidLoad
中设置的,对于您的用例,我希望可以从文件中加载场景(最好使用另一种方法)。希望此文件中包含您希望在树状层次结构中作为单独组件拾取的不同组件。该三维人体模型的作者希望能够适当地标记这些组件,以便您的代码能够识别选择左股骨(而不是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()
    }
}
导入UIKit
导入SceneKit
类ViewController:UIViewController{
@IBVAR场景视图:SCNView!
重写func viewDidLoad(){
super.viewDidLoad()
让场景=SCNScene()
设boxNode=SCNNode(几何体:SCNBox(宽度:1,高度:1,长度:1,倒角:0))
boxNode.name=“box”
scene.rootNode.addChildNode(boxNode)
设sphereNode=SCNNode(几何体:SCNSphere(半径:1))
sphereNode.name=“球体”
sphereNode.position=SCInvector3Make(2,0,0)
boxNode.addChildNode(sphereNode)
设环形节点=SCNNode(几何图形:SCNTorus(环形半径:1,管道半径:0.3))
torusNode.name=“圆环体”
torusNode.position=SCInvector3Make(2,0,0)
sphereNode.addChildNode(环形节点)
scenekitView.scene=场景
scenekitView.autoenablesDefaultLighting=true
scenekitView.allowsCameraControl=true
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
//获取屏幕坐标中的第一个触摸位置
保护让触摸=触摸。首先触摸{
返回
}
//将屏幕坐标转换为SCNView make not take时的视图坐标
//在整个屏幕上。
让pt=touch.locationInView(self.scenekitView)
//将光线从二维坐标点传递到场景中,并返回列表
//它击中的物体的数量
让hits=self.scenekitView.hitTest(pt,选项:nil)
为命中命中率{
//对每一次打击都做些什么
打印(“触摸”,点击。节点。名称!)
}
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
}

感谢您提供的信息。我的图像模型将是一个COLLADA文件。当我导入它时,它本身就是一个完整的实体。您在回答中使用了不同的节点。我的情况是,我导入的整个图像将是一个节点。有什么方法可以用不同的方式引用单个节点吗?或者,如果我可以将图像节点分解为多个子节点以供参考?是的,我希望它是一个单独的Collada文件。但是,当您将其导入到SceneKit中时,它应该包含多个节点。Collada文件可以表示整个场景(当然,一个场景可能只包含一个节点)。您能否简单介绍一下在示例dae文件中创建多个节点时应该使用哪些文档或材质?@Jobs这取决于您使用的三维建模工具。我首先将dae文件添加到您的XCode项目中,并使用查看。“实体列表”将显示dae中节点的层次结构。如果只有一个节点,没有子节点,则可能需要拆分现有模型。我是一个新手,但是我可以通过点击几下就可以构建与编程构建的场景相同的场景。