我试图找出两个三角形是否面对面。我有形成三角形的点和它们所处的顺序(所以我可以使用十字产品和左手拇指规则来测量方向)。
我应该通过面对来澄清我的意思。三角形不需要直接相互看,只是面对每个平面共有的平面是平行的,每个三角形的法线方向都朝向另一个平面。
因为我允许每个三角形有几度的余地,所以有点棘手,所以这些平面可能不一定是平行的。
我的问题是,如何检查三角形是否朝向彼此? (即使只检查法线是否在另一个三角形的平面两侧90度范围内,我的问题是角度计算只是给出了这些计算的内角。)
我不确定我对这个问题的描述有多好。如果我可以提供任何其他信息或我可以澄清的内容,请询问。
感谢。
答案 0 :(得分:3)
假设您的三角形是A:A1A2A3和B:B1B2B3
1)计算N1,A1A2和A1A3的标准化叉积
2)通过A测试B'被'看',即N1·A1B1> 0
3)计算N2,B1B2和B1B3的归一化叉积。
如果你想测试'严格面对',那么测试N1•N2 == -1(其中•是点积)。
对于不太严格的面对,你可以测试N1•N2 - ( - 1)<一些小的价值。
正如@BenAaronson指出的那样,您可能希望通过测试(A1A2,A1A3)与(B1B2,B1B3)共面来测试rects是否在同一平面内。
如果O是原点,则测试N1•OA1 = - N2•OB1
(rq,这里N2 = - N1所以你可以测试N1•OA1 = N1•OB1)。
答案 1 :(得分:1)
结束此解决方案,从一个三角形投射光线并检查它是否与另一个三角形的平面发生碰撞。效果很好!
private static bool RayIntersectsPlane(Vector normal, Vector rayVector, Point planePoint, Point rayOrigin)
{
double denom = normal.Dot(rayVector);
if (denom < 1E-6))
{
Vector rayPlaneVector = planePoint - rayOrigin;
double intersectionCheck = rayPlaneVector.Dot(normal) / denom;
return intersectionCheck >= 0;
}
return false;
}
方法改编自here!