相对于平面舍入3D点

时间:2014-04-06 19:49:26

标签: c++ rounding plane

我有一个Plane类,其中包含 n 用于普通, q 用于平面上的一个点。我还有另一个点 p 也位于那架飞机上。如何将 p 四舍五入到该平面上最近的单位。就像将光标捕捉到3D网格,但网格可以旋转平面。

图片解释:enter image description here

红色是当前的一点。绿色是我想要获得的圆点。

1 个答案:

答案 0 :(得分:0)

实现这一目标的最简单方法可能是通过平面来定义旋转和移位的坐标系。这允许您构造矩阵,以将全局坐标中的点转换为平面坐标并返回。完成后,您可以简单地将点转换为平面坐标,以平凡的方式执行舍入/投影,然后转换回世界坐标。

当然,问题没有说明你提出问题的方式:你需要的变换有六个自由度,你的平面方程只产生三个约束。因此,您需要添加更多信息:原点在平面内的位置,以及网格在平面法线周围的旋转。

就个人而言,我首先要以参数形式推导出一个平面描述:

xVec = alpha*direction1 + beta*direction2 + x0

当然,这样的描述包含九个变量(三个向量),但是你可以规范化两个方向向量,并且可以将两个方向向量约束为正交,这将自由量减少到六个。

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