检测光线是否与物体相交的函数

问题描述:

我有一个函数,用于检测光线是否与物体相交,但它围绕物体中心的半径工作,我希望它与边界框一起工作,我想给它边界框的Vector3D,以及射线的原点和射线的方向之一的一个矢量,它会计算是否有交点,任何人都可以帮助我?这是什么数学公式?检测光线是否与物体相交的函数

intersectRay(来源:的Vector3D,DIR:的Vector3D):

+1

信息不足。 (1)你在谈论2D还是3D? (2)即使二维情况较简单,边界框是一个矩形(x,y,宽度,高度),而射线由原点(x,y)和方向向量(x,y)表示。如果是3D,那么边界框应该是(x,y,z,宽度,高度,深度),射线分别是原点(x,y,z)和方向(x,y,z)。 – Organis

+0

您应该将该函数填充到边界框类。 2D边界框并不总是轴对齐(例如可以旋转),对于给定的3D盒,3D有3个可能的旋转。如果你的盒子都是轴对齐的,那么你有足够的数据组成一个检查器。有一些这样的检查的C++实现,找到一个,适应和使用。没有确切的公式,但在XY,XZ和YZ中进行3次检查并进行比较。 – Vesper

+0

我正在谈论3d,我想创建一个边界框作为对象的简化,在3DMax中,边界框将有8个矢量,但它们不一定是框的形状,而且我想查找一个简单的公式来发送相机的光线与原点和方向,公式将检查光线是否在边界框内或边界外穿越 – danielkotzer

找到了解决办法。 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); 

    } 
  1. 然后,我使用的凸包算法,以删除不属于外部轮廓多边形其中标记的部分中的点在屏幕上的对象的位置可以在网上找到,确保边界框不包含重复点,如果你有一个平坦的平原没有深度,这可能会导致算法的问题,所以当你创建边界框清理出来。

  2. 然后,我使用此算法来确定,如果鼠标点击的点落在这个多边形或外的其内:

    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; 
    } 
    
  3. 然后我测量到物体的距离,并选择最接近的一个到摄像机的位置,使用此功能:

    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)); 
    } 
    
  4. 我敢肯定有更有效的方式,但这种方式是一个有趣的,它是很好的enou对我而言,我喜欢它,因为它很直观,我不喜欢抽象数学,对我来说很难,如果出现错误,很难找到它。如果有人对我如何使其更有效率有任何建议,我会很高兴听到他们的声音。

开始=“3”>
+0

很好的答案。令人惊讶的是,人们仍然在为他们的游戏使用闪存 – PassetCronUs

+0

Adob​​e Air是一个跨平台的SDK,为什么不使用它?你有什么更好的吗?与空气我创建的应用程序,然后可以发布到任何平台 - PC,MAC,Android,iPhone,你知道别的东西给你吗? – danielkotzer

+0

你的标签上写着“flash”而非Adobe Air。 Flash不会像移动设备那样在移动设备上运行。你在你的问题中标记了flash和actionscript,并且它们都[死亡](https://*.com/questions/24338232/flash-and-actionscript-dead),并且很快就会消失。我认为他们的支持很快就会停止。还有其他选项,比如Xamarin的应用程序和Unity的游戏。再说一次,我并没有告诉你哟使用什么,我只是简单地向你提出,你正在使用的内容将很快停止。 – PassetCronUs