在SceneKit中检测触摸

时间:2016-11-08 01:38:48

标签: ios swift scenekit

我有一个关于在SceneKit中检测触摸的问题。我已经能够找到关于如何检测某个物体被触摸的问题,但我需要更具体的东西。我需要能够判断物体的某个部分何时被触摸。为了更好地解释一下,我有一个人的三维模型,我需要能够告诉他们什么时候说头被触摸或者腿被触摸等。如果需要进一步说明,我很乐意提供它,我和#39;我只是不太确定如何做到这一点。

2 个答案:

答案 0 :(得分:4)

要扩展NicoS的答案:hit testing是这样做的方法。但实际上,您在命中测试结果中有几种可能的选项可用于识别模型部件,因此您可以选择最适合您的内容创建管道的部件。

  1. 如其他答案中所述,如果您可以将模型分解为单独的模型,每个模型都在具有自己节点的场景中托管,您可以使用SCNHitTestResult.node属性找出哪个点击/点击/抓取节点。

  2. 如果您无法完全拆分模型,则可以将其拆分为仍存在于同一资产/节点中的多个部分。 SceneKit调用这些几何元素,一些创作工具将它们称为子网格,低级渲染代码将其称为带有单独索引缓冲区的单独绘制调用,等等。当你有单独的几何元素(在几何体的不同部分绘制一个具有多个材质的几何图形所必需的),您可以使用SCNHitTestResult.geometryIndex属性在命中测试中识别它们。 (此方法用于answer HalMueller linked to。)

  3. 如果您控制网格物体的纹理贴图数据,则可以使用textureCoordinates(withMappingChannel:)获取所点击点的纹理坐标,然后在纹理图像中查找它们,并在其中进行颜色编码感兴趣的是。 (你可以在this article中对这个想法背后的理论进行概述,尽管实现不是特定于SceneKit。)

  4. 如果您的模型适用于skeletal animation,则可以使用SCNHitTestResult.boneNode属性来获取对点击点处的几何变形负最大责任的骨骼。

答案 1 :(得分:3)

命中测试是要走的路。但是你的3D模型需要进行调整。您需要在您喜欢的3D编辑器中提供您想要专有名称的项目。然后你可以在SCNSceneRenderer上使用HitTest函数。

例如:光线从手指的位置投射到触摸点下方的3D模型。 hitTest函数将为您提供一组SCNHitResults。该数组中的第一个对象是用户可见的最前面的对象。然后,您可以检查node.name是否具有您要查找的名称。

您可以在此处找到更多信息: https://developer.apple.com/reference/scenekit/scnscenerenderer/1522929-hittest https://developer.apple.com/reference/scenekit/scnhittestresult