キューブ/境界ボックスの内側または外側にあるかどうかをテストする必要のあるオブジェクトを追跡しています。それらが外側にある場合、私はレイ・プレーンの交差を行い、キューブの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
私は私がここに欠けている何か?
私はちょうどすべての飛行機で衝突テストをしてから、キューブの中心に最も近いポイントを選ぶことができますが、それは無駄に思えます。
これはかなり意味があります。それは今働きます!乾杯 –