我正在研究基于AR的应用程序。我正在使用https://docs-assets.developer.apple.com/published/c5ad3d23f4/handling3dinteractionandaconanduicontrolsinaugmentedreality.zip作为例如。我正在尝试在3D对象的每个子节点上实现一个覆盖层,并具有相同的文本描述。
为此,我试图获得每个子节点的位置。例如,如果我们在Apple的样本中取椅子对象,则当我查看Xcode场景编辑器时,所有子节点都处于相同的位置。在这种情况下,如何获得子节点的中心位置?例如,如果我必须得到大约。椅子的腿的位置,该怎么做?
节点的位置始终相对于另一个节点,至少是场景的rootnode。为了获得相对于rootnode(即世界空间中的位置)相对于rootnode的位置,您可以使用转换为:rootNode。为了获得子话相对于父母的位置,您可以将位置转换为父节点的空间。
https://developer.apple.com/documentation/scenekit/scnnode/1407990-convertposition
获得世界空间坐标后,您可以使用ProjectPoint将3D位置转换为2D屏幕坐标:https://developer.apple.com/documentation/scenekit/scnscenerenderer/1524089-projectpoint
如果椅子腿的枢轴不在腿的中心,则位置也不会位于其中心。在这种情况下,要获取中心,请使用节点边界框的最小值和最大值的平均值(请参阅scnboundingvolume),或简单地使用覆盖层的2D位置中的偏置。