我目前正在制作一个raycaster,但我有一个问题。 一切都已建立,现在我只需要一些数学帮助来回答以下问题,我找不到任何简单的解释,我们还没有在学校学到这样的高级矢量东西。
1] 我有一条线路,比方说,(0,0,0)到(50,50,50) 现在我怎样才能知道它是否与球体相交,例如(m =(10,10,5),r = 5)? 是的,我在整个互联网上搜索,但是任何东西都在向量中解释,但由于它们与从A到B的行不同,我从未发现任何有用的东西。
2] 我上面有相同的一行,但这次我要检查它是否与立方体相交,m =(25,30,50),它的边长为5单位。 和以前一样,请尽可能简单地解释,我正在使用Java。
答案 0 :(得分:1)
1)球体:我们的想法是找到球体中心到线条的距离。如果它大于半径 - >外面,反之亦然 - 内部(如果相等 - 表面上的>)
经过2点A,B的线的等式是
x = A.x + (B.x - A.x)*t
y = A.y + (B.y - A.y)*t
z = A.z + (B.z - A.z)*t
从点M到AB线中的点的距离为:
d(t) = Math.sqrt((x - M.x) * (x - M.x) + (y - M.y) * (y - M.y) + (z - M.z) * (z - M.z))
从点M到线AB的距离是最短的d(t)
如果我们设置
g(t) = (x - M.x) * (x - M.x) + (y - M.y) * (y - M.y) + (z - M.z) * (z - M.z)
我们将
d(t) = Math.sqrt(g(t))
要查找min(d(t))
,我们会尝试查找min(g(t))
(因为函数派生更简单)。要查找min(g(t))
,请求解等式derivative(g(t)) = 0
你会找到
t = ((B.x - A.x)*(M.x - A.x) + (B.y - A.y)*(M.y - A.y) +
(B.z - A.z)*(M.z - A.z))/((B.x - A.x)*(B.x - A.x) + (B.y - A.y)*(B.y - A.y) + (B.z - A.z)*(B.z - A.z))
然后你可以找到d(或d * d)
2)立方体:想法是找到直线(AB)与立方体两侧的交点,看看是否至少有一面在正方形内有交叉点
你不能说立方体是否有与坐标轴平行的边,但让我们使用那个案例(最简单:) :)
AB线的等式与1)中的相同
x = A.x + (B.x - A.x)*t
y = A.y + (B.y - A.y)*t
z = A.z + (B.z - A.z)*t
所有8个边的方程是:(在你的例子中,d = 5)
X = M.x - d
X = M.x + d
Y = M.y - d
Y = M.y + d
Z = M.z - d
Z = M.z + d
您应该找到AB与立方体两侧的交点 例如,AB为X = M.x -d
求解方程组:
x = A.x + (B.x - A.x)*t
y = A.y + (B.y - A.y)*t
z = A.z + (B.z - A.z)*t
x = M.x - d
你会发现:
x = M.x -d
t = (M.x -d - A.x)/(B.x - A.x) .. then find y, z
点(x,y,z)位于立方体X = M.x -d的一侧,如果
M.y - d <= y <= M.y + d (and similar for z)
并为其他方面做同样的事情。
注意:如果要检查线段[AB]是否与球体/立方体相交(到达),则需要再检查一个条件:交点位于线段[AB] < / p>
min(A.x, B.x) <= x <= max(A.x, B.x)
min(A.y, B.y) <= y <= max(A.y, B.y)
..
希望它可以帮到你!