在 SceneKit 中,如何让相机查看节点几何体的特定面?

In SceneKit, how do you make camera look at a specific face of a node's geometry?

在 SceneKit 中,您可以为 SceneView 的 Point Of View 添加 lookAtConstraint 约束,使 Camera 看向某个节点。

是否有一种标准方法可以对几何体的特定面执行相同的操作?

这样一来,如果我触摸立方体的特定面,相机就会移动,使相机节点的 Z 轴与触摸面的法线对齐?这样立方体在新视角下看起来就像一个平面。

没有。

除了重新瞄准之外,还需要移动相机。

想象一下我在我家门前。我可以很好地看到前面,但几乎看不到我左边的那一侧。在我的场景中,我点击了房子的一侧。 LookAt 约束只会改变相机的角度。它不会与那几乎看不见的一面的法线对齐。

为了与法线对齐,我必须绕着房子走来走去,直到我可以盯着房子看,并与我点击的那一侧垂直。在什么半径?什么路径?你必须自己弄清楚。

根据您尝试的效果,您可能想要旋转模型而不是移动相机。在本地(或作为不可见父节点的子节点)旋转点击的节点,使其负 Z 轴指向点击的面,并在 节点 上保持 lookAtConstraint,而不是相机。不过,这种方法会改变对象的外观:您会看到它在旋转,并且阴影会相应地发生变化。

So that, if I touch a specific face of a cube, camera would move so that the Z axis of the camera node gets in line with the normal of the touched face?

假设您正在使用命中测试来确定哪个对象被触摸,SCNHitTestResult 将同时提供 localCoordinateslocalNormal,从中可以很容易地得出相机变换。

一种简单的方法是将相机作为盒子的子节点,计算看起来像 localCoordinates + distance * localNormal 的位置,最后使用 GLKMatrix4MakeLookAt and SCNMatrix4FromGLKMatrix4.

进行变换

请注意,您还可以使用 worldCoordinatesworldNormal 以及 SCNNode.convertTransform(_:from:).

等转换实用程序

根据 mnuages 答案进行变异,使用命中测试或光线追踪来查找用户在网格上点击的位置,然后在该位置添加一个节点,并将相机限制在该节点上。