2017-08-06 101 views
0

我有一個函數,用於檢測光線是否與物體相交,但它圍繞物體中心的半徑工作,我希望它與邊界框一起工作,我想給它邊界框的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

找到了解決辦法。 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)); 
    } 
    
  • 我敢肯定有更有效的方式,但這種方式是一個有趣的,它是很好的enou對我而言,我喜歡它,因爲它很直觀,我不喜歡抽象數學,對我來說很難,如果出現錯誤,很難找到它。如果有人對我如何使其更有效率有任何建議,我會很高興聽到他們的聲音。

    +0

    很好的答案。令人驚訝的是,人們仍然在爲他們的遊戲使用閃存 – PassetCronUs

    +0

    Adob​​e Air是一個跨平臺的SDK,爲什麼不使用它?你有什麼更好的嗎?與空氣我創建的應用程序,然後可以發佈到任何平臺 - PC,MAC,Android,iPhone,你知道別的東西給你嗎? – danielkotzer

    +0

    你的標籤上寫着「flash」而非Adobe Air。 Flash不會像移動設備那樣在移動設備上運行。你在你的問題中標記了flash和actionscript,並且它們都[死亡](https://stackoverflow.com/questions/24338232/flash-and-actionscript-dead),並且很快就會消失。我認爲他們的支持很快就會停止。還有其他選項,比如Xamarin的應用程序和Unity的遊戲。再說一次,我並沒有告訴你喲使用什麼,我只是簡單地向你提出,你正在使用的內容將很快停止。 – PassetCronUs