给定3d空间中的两个点,我如何找到与它们相交的平面?

时间:2018-06-20 06:32:31

标签: 3d intersection point arkit plane

鉴于用户先前选择的两点,我想在arkit中将平面节点添加到我的虚拟世界中。

1 个答案:

答案 0 :(得分:0)

两个点不足以定义一个唯一的平面。两个任意点共享的空间是一条直线-无限多个平面可以共享该直线(将它们作为旋转轴)。

如果要基于任意用户选择的点定义平面,则可以探索其他一些选项:

  • 让用户选择三个点而不是两个,因为三个点定义了一个唯一的平面。取由这些点形成的三角形的两条腿的叉积,您将获得平面的法线向量,该向量会告诉您其方向。

  • 选择两个点,然后假定在所有可能的连接这些点的平面中,用户想要一个特定的平面-例如,一个其法向矢量最接近垂直方向的平面。 (更多交叉产品可能会在这里有所帮助。)

  • 假定用户想要一个水平的平面(平行于x-z平面)。对于水平面,只需要一个用户放置点。


根据说明,您正在寻找垂直平面:

  1. 减去两个点以得到它们之间的线段:let segment = pointA - pointB或类似
  2. 取该矢量与垂直轴的叉积,以获取它们均位于的垂直平面的法线矢量:let normal = cross(segment, float3(0,1,0))
  3. 法向矢量定义了平面的方向,但是您可能需要四元数或变换矩阵,以便可以将其用于SceneKit。有一个四元数初始值设定项,可以为您提供从一个基本矢量到另一个基本矢量的旋转,因此垂直平面的方向可以基于从垂直到计算的法线的旋转:类似node.simdOrientation = simd_quatf(from: float3(0,1,0), to: normal)