2017-08-06 4 views
0

私は、レイがオブジェクトを交差しているかどうかを検出する機能を持っていますが、オブジェクトの中心を中心とした半径で動作し、私は境界ボックスの2 Vector3Dと、光線の原点と光線の方向の1つのベクトルを与えたいと思います。それが交差点があるかどうかを計算します。これの数式は何ですか?レイがオブジェクトと交差しているかどうかを検出する関数

intersectRay(起源:のVector3D、DIR:のVector3D):

+1

情報が不十分です。 (1)2Dまたは3Dについて話していますか? (2)より単純な2Dの場合であっても、境界線は矩形(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); 

    } 
  • そしてIは、マーク外部輪郭ポリゴンの一部ではない点を削除する凸包アルゴリズムを使用します画面上のオブジェクトの場所はネット上で見つけることができます。深度のない平らな平野がある場合のように、境界ボックスに重複した点が含まれていないことを確認してください。境界ボックスはそれらをきれいにする。

  • そしてIは、マウスクリックの点がこのポリゴン内またはその外にあるかどうかを決定するためにこのアルゴリズムを使用する:

    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; 
    } 
    
  • そしてIは物体までの距離を測定し、最も近いものを選びますこの機能を使用して、カメラの位置、:

    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です私にとってはghですが、直感的で好きです。私は抽象的な数学で作業するのは好きではありません。私にとっては非常に難しく、間違いがあれば、それを見つけるのは非常に難しいです。どのようにすればより効率的にすることができるかについての提案があれば、私はそれらを聞いてうれしいです。

    +0

    良い答え。人々はまだ彼らのゲームのためにフラッシュを使用していることに驚いた – PassetCronUs

    +0

    Adob​​e Airは、クロスプラットフォームのSDKです、なぜそれを使用しない?あなたは何か良いことはありますか? Airを使ってアプリケーションを作成し、PC、MAC、Android、iPhoneのどのプラットフォームにでも公開することができます。 – danielkotzer

    +0

    あなたのタグはAdobe Airではなく「フラッシュ」と表示されます。 Flashは、ネイティブのモバイルデバイスでは動作しません。あなたはあなたの質問にフラッシュとアクションスクリプトをタグ付けしていて、どちらも死んでいます(https://stackoverflow.com/questions/24338232/flash-and-actionscript-dead)。すぐに消えてしまいます。彼らの支援はすぐに中止されると思います。アプリのXamarinやゲームのUnityのような他のオプションがあります。繰り返しますが、私はあなたに何を使用しているかを伝えていません、私は単に頭を上げて、あなたが使っているものがすぐに中止されるようにしています。 – PassetCronUs

    関連する問題