SCNLookAtConstraint正在做什么数学?我想尝试用向量重新创建它。
答案 0 :(得分:1)
一旦你有两个方向向量,我认为可以用交叉积和点积来完成。
默认情况下,节点指向其局部坐标系的负z轴方向。
我们感兴趣的另一个方向是从查看另一个节点的节点,在看起来是本地坐标系的节点中。你可以通过使用convertPosition:fromNode:
或转换位置来获得它
convertPosition:toNode:
。
如果尚未完成,请将两个方向向量标准化。
利用局部坐标系中的两个方向,两者之间的叉积给出了一个矢量,该矢量与可以在两个方向之间形成的平面正交。该向量是该平面的法线曲面。围绕该法线的任何旋转都将是保留在平面中的另一个向量。
由于这两个方向是标准化的,因此两者的点积应该给出cos(ϴ)
,其中Θ是两者之间的角度。
将第一个矢量(指向负z轴方向的矢量)旋转到该平面法线周围的角度应使其指向与第二个矢量相同的方向(指向第二个矢量的矢量)其他节点)。
这应该是两个向量的方式(或者至少有一种方法)。
要为节点执行此操作,您可以将该角度的旋转设置为正在查看的节点。这会旋转节点,使其局部负z轴(它看起来的方向)指向另一个节点。
我在3D Graphics with Scene Kit的一个章节中有一个非常相似的例子,其中一个节点被旋转直接指出一个球体的表面。您可以查看sample code,看看它是如何解决的。