1

问题很简单:

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

这样做的目的是计算光子的路径应该如何从与多边形的相互作用中改变。

我现在正在阅读这个主题,但我想知道是否有人可以给我一个先机。提前致谢。

4

5 回答 5

2

听起来您正在寻找射线/多边形相交测试。

我不记得细节,但我想你把它分成两部分。首先,您在多边形平面上找到光线相交的点。这可以从简单的射线/平面相交测试中得到。其次使用多边形平面上的坐标系来测试交点是否在多边形内。这可以从多边形点测试中获得。

于 2010-06-01T15:15:24.627 回答
1

你在做光线追踪。最有效的是将多边形分解为三角形并使用 Moeller 射线三角形检验。或者也许是沃尔德测试。除了顶点信息之外,还有一些变体使用额外存储的数据,如果您对同一个三角形进行多条光线处理,这些数据可能会更快。谷歌提供了这么多结果,我还没有选择一个“最好的”来放在这里。

于 2010-06-01T20:36:10.410 回答
1

总体概述:

1)Segment-Plane Intersection:判断连接点1和2的线段是否与包含多边形的平面相交。如果没有,那么它永远不会与多边形相交,你就完成了。

2)Find Point of Intersection: 确定线段与平面的交点。这将在问题的 3-b 中提供您想要的信息。称此点为Q

3) 确定Q是否在多边形内部: 确定这一点的一种方法是在这里,但精心设计的 Google 搜索可能会导致其他方法。您可以针对您期望的不同类型的多边形(即凸面)或包含多边形的平面轴向对齐(即您的坐标系的轴之一垂直于包含多边形的平面)进行优化。

假设:多边形的所有点都是共面的。

于 2010-06-01T20:20:16.650 回答
0

射线/三角形相交很好理解并且很容易。不过,旋转更难。

也许您可以使用旋转矩阵变换三角形的顶点,然后使用简单的射线/三角形相交?

于 2010-08-13T17:57:24.113 回答
0

光子以矢量 v = p2 - p1 从 p1 开始传播,形成这条线:

p1 + v * a 

要确定光子是否与多边形碰撞,您必须找到 a 的值:

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。

于 2010-06-01T15:58:24.247 回答