【发布时间】:2011-05-25 18:39:45
【问题描述】:
我有一个由n 点(v1、v2、v3、...、vn)定义的 3D 面,在 3D 坐标中,我有一个等式的射线:
P=P0+t(P1-P0).
0<=t<=1.
现在,如何找到这条射线和人脸之间的交点(或缺点)?
另外,如果有一个现有的 C# 实现,那就太好了?
编辑:3D 面可以是凹的或凸的。所有的点都是共面的。
【问题讨论】:
我有一个由n 点(v1、v2、v3、...、vn)定义的 3D 面,在 3D 坐标中,我有一个等式的射线:
P=P0+t(P1-P0).
0<=t<=1.
现在,如何找到这条射线和人脸之间的交点(或缺点)?
另外,如果有一个现有的 C# 实现,那就太好了?
编辑:3D 面可以是凹的或凸的。所有的点都是共面的。
【问题讨论】:
我想你的 3D 多边形是平面的(否则它不是真正的多边形,也没有很好的定义)。因此,您可以找到该平面的二维正交基。这意味着您可以使用任何 2D 三角剖分算法(您可以在网上找到许多 c# 实现)并使用您的正交基准返回 3D。 通过这种方式,您将获得 3D 三角形,并且能够通过运行多个光线-三角形相交测试轻松地进行光线-多边形相交测试。
另一种方法是执行射线平面相交计算。取交点 P,用上面正交基的 2D 坐标表示。此外,与前面的解决方案一样,使用相同的基础在 2D 中表示您的多边形。然后运行任何“多边形中的点”2D 算法,您将得到结果。
更新:这是数学 您可以在平面 p1、p2 上取任意两个点(例如多边形的两个点)并取向量 u = p2 - p1。归一化它,它是第一个基向量。然后取平面的法线 N 并计算 v = cross_product(u , N) 并对 v 进行归一化。这是第二个基向量。请注意,两个向量都有单位长度,并且它们彼此正交。因此它们形成一个标准正交基。
现在将 p1 定义为平面的原点。然后将多边形上任意点 q 平移到 2D(q 可以是多边形的顶点之一,也可以是多边形平面上的任何其他点):
x = dot_product(q - p1, u)
y = dot_product(q - p1, v)
这里的 x,y 是点的 2D 坐标。
因此,在将所有内容转换为 2D 并执行 2D 算法后,您可以将任何 2D 点 (x, y) 转换回 3D,如下所示:
q = p1 + x * u + y * v
这里 * 是标量向量积(x,y 是标量,u,v 是向量)。
亚历克斯。
【讨论】:
如果您的点不是共面的(即不都位于一个平面上),那么您需要将曲面细分为一组平面,然后为每个平面进行线-多边形相交。更好的是,定义一个三角形列表,然后搜索线-三角形相交结果。
但是,您不会说您的点是定义多面对象(即由三角形组成)还是定义曲面的一组控制点。前者由上述处理。如果是曲面,我认为这是一个不可计算的问题,即确定一条线与由一组点定义的曲面的交点的问题没有简单的解决方案。您可以做的最好的事情是使用查找交点的迭代过程,但即使这样也可能导致不稳定的搜索(即永远不会完成的搜索)。
我认为转换为一组三角形是最好的答案。
【讨论】:
您正在使用光线-多边形相交算法,这里有一个指向图形宝石条目的链接:http://www-graphics.stanford.edu/courses/cs348b-98/gg/intersect.html
【讨论】: