在 SceneKit 中检测触摸

Detecting touch in SceneKit

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

命中测试是必经之路。但是您的 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

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

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

  2. 如果您不能完全拆分模型,您可以将其拆分成多个仍然存在于同一个 asset/node 中的部分。 SceneKit 调用这些 几何元素 ,一些创作工具将它们称为 子网格 ,低级渲染代码将其称为具有单独索引缓冲区的单独绘制调用,等等。当你有单独的几何元素时(这是在几何的不同部分绘制一个具有多种材料的几何所必需的),你可以在命中测试中使用 SCNHitTestResult.geometryIndex property. (This approach is used in the .)

    [ 来识别它们。 =36=]
  3. 如果你控制网格的纹理贴图数据,你可以使用textureCoordinates(withMappingChannel:) to get texture coordinates for the clicked point, then look them up in a texture image in which you've color-coded the ares of interest. (You can get a general overview for the theory behind this idea in this article,虽然实现不是特定于 SceneKit。)

  4. 如果您的模型已针对 skeletal animation, you can use the SCNHitTestResult.boneNode 属性 进行装配,以获得在单击点处对几何变形最负责的骨骼。