相对于平面四舍五入一个三维点

3
我有一个 Plane 类,其中持有参数 n 表示法向量,q 表示平面上的某个点;我还有另一个点 p ,它也在该平面上。如何将 p 四舍五入至该平面上最近的单位?类似于将光标捕捉到 3D 网格上,但网格可以是旋转的平面。
下图解释:enter image description here 红色为当前点,绿色为我正在尝试获得的四舍五入点。

1
我猜你可以对整个平面法线取反,这样你就可以得到所需的二维表示,你可以使用简单的算术将点X和Y捕捉到最近的点,然后再次应用平面法线。 - Havenard
是的,但是如何应用/否定平面法线呢?这些对我来说只是词汇,而且今天谷歌并不友好。 - user3473422
1个回答

0

实现这个的最简单方法可能是通过采用平面来定义旋转和移动的坐标系。这样可以构造用于将全局坐标中的点转换为平面坐标和反向转换的矩阵。一旦完成了这一步骤,您只需将点转换为平面坐标,在平凡的方式下进行舍入/投影,并转换回世界坐标。

当然,问题在于您提出的方式未明确说明需要的变换具有六个自由度,而您的平面方程仅提供了三个约束条件。因此,您需要添加更多信息:平面内原点的位置以及网格围绕平面法线的旋转。

个人而言,我会从参数形式推导平面描述开始:

xVec = alpha*direction1 + beta*direction2 + x0

当然,这样的描述包含九个变量(三个向量),但是您可以将两个方向向量归一化,并将两个方向向量约束为正交,从而将自由度减少到六个。

两个归一化的方向向量和归一化的法向量一起构成了旋转坐标系的基向量,因此您可以通过将这三个向量放在一起来简单地构造旋转矩阵。要获得逆旋转,只需转置结果矩阵。在旋转的适当侧面添加平移/逆平移,就完成了。


我该怎么做呢?理论不是我的强项。 - user3473422
这取决于您如何精确地操作这些对象。您是否使用了某个库?您没有指定任何我们可以用来帮助您的信息。 - Havenard
我正在使用GSL处理矩阵和向量,但我不知道如何设置旋转矩阵。 - user3473422

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接