我有一个 Plane 类,其中持有参数 n 表示法向量,q 表示平面上的某个点;我还有另一个点 p ,它也在该平面上。如何将 p 四舍五入至该平面上最近的单位?类似于将光标捕捉到 3D 网格上,但网格可以是旋转的平面。
下图解释:
红色为当前点,绿色为我正在尝试获得的四舍五入点。
下图解释:
![enter image description here](https://istack.dev59.com/nnk56.webp)
实现这个的最简单方法可能是通过采用平面来定义旋转和移动的坐标系。这样可以构造用于将全局坐标中的点转换为平面坐标和反向转换的矩阵。一旦完成了这一步骤,您只需将点转换为平面坐标,在平凡的方式下进行舍入/投影,并转换回世界坐标。
当然,问题在于您提出的方式未明确说明需要的变换具有六个自由度,而您的平面方程仅提供了三个约束条件。因此,您需要添加更多信息:平面内原点的位置以及网格围绕平面法线的旋转。
个人而言,我会从参数形式推导平面描述开始:
xVec = alpha*direction1 + beta*direction2 + x0
当然,这样的描述包含九个变量(三个向量),但是您可以将两个方向向量归一化,并将两个方向向量约束为正交,从而将自由度减少到六个。
两个归一化的方向向量和归一化的法向量一起构成了旋转坐标系的基向量,因此您可以通过将这三个向量放在一起来简单地构造旋转矩阵。要获得逆旋转,只需转置结果矩阵。在旋转的适当侧面添加平移/逆平移,就完成了。