在 SceneKit 中检测触摸

Zac*_*ler 1 ios scenekit swift

我有一个关于在 SceneKit 中检测触摸的问题。我已经能够找到有关如何检测何时触摸某个物体的问题,但我需要更具体的东西。我需要能够判断物体的某个部分何时被触摸。为了更好地解释一下,我有一个人类的 3D 模型,我需要能够分辨何时触摸头部或触摸腿部等。如果需要任何进一步的说明,我很乐意提供,我我只是不太确定如何实现这一点。

ric*_*ter 7

扩展 NicoS 的答案:命中测试就是做到这一点的方法。但实际上,您有多种可能的选项来识别命中测试结果中的模型部分,因此您可以选择最适合您的内容创建管道的选项。

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

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

  3. 如果控制网格的纹理映射数据,则可以用来textureCoordinates(withMappingChannel:)获取单击点的纹理坐标,然后在对感兴趣区域进行颜色编码的纹理图像中查找它们。(您可以在本文中获得此想法背后的理论的总体概述,尽管该实现并非特定于 SceneKit。)

  4. 如果您的模型已针对骨骼动画进行了绑定,则可以使用该SCNHitTestResult.boneNode属性来获取对单击点处的几何变形影响最大的骨骼。