我有一个由n
点(v1
,v2
,v3
,...,vn
)定义的3D面,在3D坐标中,我有一个等式:
P=P0+t(P1-P0)
。
其中0<=t<=1
。
现在,如何找到此光线与脸部之间的交点(或缺点)?
另外,如果现有的C#实现就好了吗?
编辑:3D面可以是凹或凸。所有要点都是共面的。
答案 0 :(得分:7)
我认为你的3D多边形是平面的(否则它实际上不是多边形,而且它没有很好地定义)。因此,您可以找到此平面的2D标准正交基础。这意味着您可以使用任何2D三角测量算法(您可以在Web上找到许多c#实现)并使用标准正交基础返回到3D。 通过这种方式,您将获得3D三角形,并且可以通过运行多个光线 - 三角形相交测试轻松地进行光线 - 多边形相交测试。
另一种方法是执行射线平面相交计算。取交点P,使用具有上述标准正交基础的2D坐标表示它。此外,与前面的解决方案一样,使用相同的基础在2D中表示多边形。然后运行任何“多边形点”2D算法,你将得到你的结果。
更新:这是数学 您可以在平面p1,p2上取任意两个点(例如,多边形的两个点)并取矢量u = p2 - p1。将其标准化,它是第一个基础向量。然后你取平面的法线N并计算v = cross_product(u,N)并标准化v。这是第二个基矢量。注意,两个矢量都具有单位长度并且它们彼此正交。因此它们形成了一个标准正交的基础。
现在将p1定义为平面的原点。然后将多边形上任意点q的二维平移(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是矢量)。
亚历。
答案 1 :(得分:1)
如果您的点不是共面的(即并非所有点都位于单个平面上),则需要将曲面细分为一组平面,然后对每个平面进行线多边形交叉。更好的是,定义一个三角形列表,然后搜索线 - 三角形交叉结果。
但是,您没有说明您的点是定义了多面物体(即由三角形组成)还是为曲面定义了一组控制点。前者由上述处理。如果它是一个曲面,我认为这是一个不可测量的问题,也就是说,确定由一组点定义的直线和曲面的交点的问题没有简单的解决方案。你能做的最好的事情就是使用一个寻找交叉点的迭代过程,但即使这样也可能导致搜索不稳定(即从未完成的搜索)。
我认为转换为一组三角形是最好的答案。
答案 2 :(得分:0)
您正在使用光线多边形交叉算法,这里是指向它的图形Gems条目的链接:http://www-graphics.stanford.edu/courses/cs348b-98/gg/intersect.html