我有定义的三维人脸n点(v1,v2,v3,... vn),在三维坐标,和我有公式的曙光:
P=P0+t(P1-P0).
哪里0<=t<=1.
现在,如何找到此光线与人脸之间的交点(或缺点)?
此外,如果现有C#实现,那将会很棒吗?
编辑:3D面可以是凹面或凸面.所有要点都是共面的.
我想你的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)
Run Code Online (Sandbox Code Playgroud)
这里x,y是点的2D坐标.
因此,在将所有内容转换为2D并执行2D算法后,您可以将任何2D点(x,y)转换回3D,如下所示:
q = p1 + x * u + y * v
Run Code Online (Sandbox Code Playgroud)
这里*是标量矢量积(x,y是标量,u,v是矢量).
亚历克斯.