2011-07-04 11 views
1

キューブ/境界ボックスの内側または外側にあるかどうかをテストする必要のあるオブジェクトを追跡しています。それらが外側にある場合、私はレイ・プレーンの交差を行い、キューブの1つの平面上の点を計算します。光線はボックスの中心から始まり、オブジェクトの方を指します。飛行機は、立方体を構成する6つのうちの1つです。レイプレーン交差の前に境界ボックスの関連平面を選択する

私が避けたいのは、6面のすべての面で常にレイ面交差をテストしていることです。だから、私は賢いと思って、まず平面の法線と光線の間のドット積を計算します。次に、最も小さい角度(1に最も近い)を選択します。

これは半分しか動作しません。私の機能が間違った平面を選択する平面の1つにオブジェクトが位置合わせされる場所があります。たいていの場合、それは動作します、そして、それはなぜですか?私は私のアプローチに根本的に何か間違っていなければならないと思います。

ここに私の定義されたプレーンがあり、それぞれにラベルがあります。座標系の0,0,0は立方体の1つのコーナーです。

planes = { 
    xnear = { normal = {1, 0, 0}, d = 0 }, 
    xfar = { normal = {-1, 0, 0}, d = cubeSize.x }, 
    ynear = { normal = {0, 1, 0}, d = 0 }, 
    yfar = { normal = {0, -1, 0}, d = cubeSize.y }, 
    znear = { normal = {0, 0, 1}, d = 0 }, 
    zfar = { normal = {0, 0, -1}, d = cubeSize.z }, 
} 

それから私は、次の関数を使用します。

-- Determine what plane to use for collision testing. The angle is calculated 
-- between the plane normal and the direction of the ray 
function whatPlane(pos) 
local direction = vec3.sub(cubeCenter, pos) 
local result 
local max = -1 
for label, plane in pairs(planes) do 
    local dotproduct = vec3.dot(plane.normal, direction) 
    if dotproduct > max then 
     max = dotproduct 
     result = label 
    end 
end 
return result 
end 

私は私がここに欠けている何か?

私はちょうどすべての飛行機で衝突テストをしてから、キューブの中心に最も近いポイントを選ぶことができますが、それは無駄に思えます。

答えて

1

立方体が実際に立方体であれば、つまりすべての次元が同じであれば(正多面体の中心にある場合のみ)、引数はうまくいくはずです。しかし、あなたは各軸の次元が違うように見えます。

ほとんどの場合、どんな方向に向いていても、1つの長さがかなり小さい(非常に薄いボックスと考える)場合、それらの大きな面にはほとんど、そして、

これは、ボックスの正確な長さで方向を調整すると、これを補正できます。私。 directionの代わりにdirection/(cubeSize.x,cubeSize.y,cubeSize.z)を使用します。ここで、除算は座標で行われます。

もう1つの発言:比較が正常に行われ、正規化されていない方向でも正常に動作することに注意してください。ドットプロダクトを非正規化したままにしておくと、

+0

これはかなり意味があります。それは今働きます!乾杯 –

関連する問題