我有一个函数可以检测光线是否与一个物体相交,但是它的作用是围绕物体中心的半径,我想让它与一个边界框一起工作,我想给它2个边界的Vector3D框,光线原点的一个向量和光线的方向之一,它将计算是否有一个交叉点,任何人都可以帮助我吗?这个数学公式是什么?
intersectRay(origin:Vector3D,dir:Vector3D):
答案 0 :(得分:1)
找到解决方案。 我使用了一个8点的边界框,每个边角都有一个。 2.我使用此函数在2D平面上为每个点提供x和y的位置,这样我将3D问题转换为2D问题,x和y实际上是相对于摄像机位置的点的水平角度。相对于摄像机位置点的垂直角度:
public function AngleBetween2vectors(v1:Vector3D,v2:Vector3D):Point
{
var angleX:Number = Math.atan2(v1.x-v2.x,v1.z-v2.z);
angleX = angleX*180/Math.PI;
var angleY:Number = Math.atan2(v1.y-v2.y,v1.z-v2.z);
angleY = angleY*180/Math.PI;
return new Point(angleX,angleY);
}
然后我使用凸包算法删除不属于外部轮廓多边形的点,该点标记了屏幕上对象的位置,可以在网上找到,确保边界框没有不包含重复点,如果你有一个没有深度的平坦平面,这可能会导致算法出现问题,所以当你创建边界框时要清除它们。
然后我使用此算法来确定鼠标点击的点是在此多边形内还是在其外部:
private function pnpoly( A:Array,p:Point ):Boolean
{
var i:int;
var j:int;
var c:Boolean = false;
for( i = 0, j = A.length-1; i < A.length; j = i++ ) {
if( ( ( A[i].y > p.y ) != ( A[j].y > p.y ) ) &&
( p.x < ( A[j].x - A[i].x ) * ( p.y - A[i].y ) / ( A[j].y - A[i].y ) + A[i].x ) )
{
c = !c;
}
}
return c;
}
然后我使用此功能测量到物体的距离并选择最接近物体的位置:
public function DistanceBetween2Vectors(v1:Vector3D,v2:Vector3D):Number
{
var a:Number = Math.sqrt(Math.pow((v1.x-v2.x),2)+Math.pow((v1.y-v2.y),2));
var b:Number = Math.sqrt(Math.pow((v1.z-v2.z),2)+Math.pow((v1.y-v2.y),2));
return Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
}
我确信有更有效的方法,但这种方式很有意思,对我来说已经足够了,我喜欢它因为它很直观,我不喜欢抽象数学,这很难对我来说,如果有错误,很难找到它。如果有人对如何提高效率有任何建议,我会很高兴听到它们。