问题很简单:
1)我们有一个从点1(x,y,z)到点2(x,y,z)的光子,它们都可以位于3D空间的任何位置。
2)我们有一个多边形,它在x轴和/或y轴上随机旋转,也位于3D空间的任何位置。
3)我们想要找到:a)光子是否会与多边形碰撞而b)如果光子会在哪里(x,y,z)?
问题图片:http://dl.dropbox.com/u/3150177/Programming/3D/Math/Photon%20Path/Photon%20Path.png
这样做的目的是计算光子的路径应该如何从与多边形的相互作用中改变。
我现在正在阅读这个主题,但我想知道是否有人能给我一个良好的开端。提前谢谢。
答案 0 :(得分:2)
听起来您正在寻找光线/多边形相交测试。
我不记得细节,但我想你把它分成两部分。首先,您在多边形平面上找到光线相交的点。这可以通过简单的射线/平面相交测试得到。其次,在多边形平面上使用坐标系来测试交点是否位于多边形内。这可以通过多边形点测试得到。
答案 1 :(得分:1)
概述:
1)段平面交点:确定连接点1和2的线段是否与包含多边形的平面相交。如果没有,那么它永远不会与多边形相交,你就完成了。
2)找到交点:确定线段和平面相交的点。这将在您的问题中提供您想要的3-b信息。将此点称为 Q
3)确定 Q 是否在多边形的内部:确定这一点的一种方法是here,但精心设计的Google搜索可能会导致其他。您可以针对您期望的不同类型的多边形(即凸面)进行优化,或者如果包含多边形的平面轴向对齐(即,您的坐标系的一个轴垂直于包含多边形的平面)。
假设:所有多边形的点都是共面的。
答案 2 :(得分:1)
你正在做光线追踪。最有效的是将多边形分成三角形并使用Moeller射线三角测试。或者也许是Wald测试。还有一些变体使用额外存储的数据而不仅仅是顶点信息,如果你在同一个三角形上做多条射线,它们会更快。谷歌提供了很多结果,我没有选择一个“最好”的结果。
答案 3 :(得分:0)
光子从矢量v = p2 - p1开始,从p1开始,创建了这一行:
p1 + v * a
要确定光子是否与多边形碰撞,您必须找到for的值:
p1 + v * a = polygon
例如:
p1 is (15, 4, 5)
p2 is (10, 1, 3)
and polygon is a 10x10 square: (-5...5, -5...5, 0)
v = p2 - p1 = (-5, -3, -2)
p1 + v * a = pol使:
p1.x + v.x * a = pol.x
p1.y + v.y * a = pol.y
p1.z + v.z * a = pol.z
a = (pol.z - p1.z) / v.z = (0 - 15) / -2 = 7.5
pol.x = p1.x + v.x * a = 15 + -5 * 7.5 = -22.5
pol.y = p1.y + v.y * a = 10 + -3 * 7.5 = -12.5
-22.5不介于-5和5之间,-12.5介于-5和5之间,因此光子不会与多边形碰撞。
我已经做了一段时间,所以我可能犯了一些错误。我用pol.z = 0来计算a。您可能必须旋转多边形以与一个轴对齐,只要您围绕多边形的中心旋转p1。
答案 4 :(得分:0)
光线/三角形交叉点很容易理解,非常容易。但是,轮换更难。
也许您可以使用rotation matrix变换三角形的顶点,然后使用简单的光线/三角形交叉点?