Determining whether triangles are facing each other
我试图找出两个三角形是否相互面对。我有形成三角形的点和它们所在的顺序(所以我可以使用叉积和左手拇指规则来衡量方向)。
我应该澄清我所说的面对是什么意思。三角形不需要直视对方,只要它们共享的平面平行并且每个三角形的法线方向朝向另一个平面的意义上面对即可。
这有点棘手,因为我允许每个三角形有几度的余地,所以平面不一定是平行的。
我的问题是,如何检查三角形是否相互朝向? (即使只是检查法线是否在另一个三角形平面的任一侧的 90 度内,我遇到的问题是angular计算只是给出这些计算的内角)。
我不确定我对问题的描述有多好。如果有任何其他我可以提供的信息或我可以澄清的事情,请询问。
谢谢。
- 你能提供一张图片,其中有两个相互面对的三角形吗?
- “每个三角形的法线方向朝向另一个平面”你的意思是每个三角形的法线方向都垂直于另一个平面吗?
假设你的三角形是 A : A1A2A3 和 B : B1B2B3
1) 计算 N1,即 A1A2 和 A1A3 的归一化叉积。
2) 测试 B 是否被 A”查看”,即 N1 ? A1B1 > 0。
3) 计算 N2,即 B1B2 和 B1B3 的归一化叉积。
如果您想测试”严格面对”,请测试 N1?N2 == -1(其中 ? 是点积)。
对于不太严格的面,您可以测试 N1?N2 – (-1) < 一些小的值。
正如@BenAaronson 指出的那样,您可能想通过测试 (A1A2,A1A3) 与 (B1B2,B1B3) 共面来测试矩形是否在同一平面上。
如果 O 是原点,则测试 N1?OA1 = – N2?OB1
( rq 这里 N2 = – N1 所以你可以测试 N1?OA1 = N1?OB1 )。
- 大概你还需要检查他们不在同一个平面上?
- 嗯,如果他们都面向同一个方向,这似乎可行(所以面向另一个,但另一个背对着)。但是他们都背对着的情况呢(所以如果你让他们的法线彼此面对并反转它们),它似乎返回相同的结果。
- 啊,谢谢更新。我实际上最终使用了一种不同的方法(只是从三角形的中心投射一条光线并查看它是否击中另一个平面)但是你的方法看起来很棒,所以我会在未来将它标记为对任何人都是正确的。感谢您花时间回答和更新,非常感谢!
- 从一个三角形的中心投射光线需要计算叉积,所以我猜你的解决方案非常相似。 Rq 你也可以发布它,甚至接受它,没问题。干杯!
- 会做!不过,我会给你正确的答案。
最终采用了这个解决方案,从一个三角形投射光线并检查它是否与另一个三角形的平面发生碰撞。效果很好!
1
2 3 4 5 6 7 8 9 10 11 12 13 |
private static bool RayIntersectsPlane(Vector normal, Vector rayVector, Point planePoint, Point rayOrigin)
{ double denom = normal.Dot(rayVector); if (denom < 1E–6)) return false; |
方法改编自这里!
来源:https://www.codenong.com/24529677/