私は最初のOpenGLプロジェクトとしてMinecraftのクローンを作成していて、ボックスの選択部分で立ち往生しています。信頼できるボックスを選択するための最良の方法は何でしょうか?
私はいくつかのAABBアルゴリズムを試してきましたが、それらのどれもが正確に何をするのか(特に超微調整されたもの)を十分に説明しておらず、理解できないものは使いたくありません。
世界は立方体で構成されているので、八分木を使用してレイキャスト計算の負担を取り除きました。基本的に必要なのはこの関数だけです。
float cube_intersect(Vector ray, Vector origin, Vector min, Vector max)
{
//???
}
光線と原点はで簡単に取得できます
Vector ray, origin, point_far;
double mx, my, mz;
gluUnProject(viewport[2]/2, viewport[3]/2, 1.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
point_far = Vector(mx, my, mz);
gluUnProject(viewport[2]/2, viewport[3]/2, 0.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
origin = Vector(mx, my, mz);
ray = point_far-origin;
minとmaxは、立方体の反対側の角です。
八分木であっても、チェックしなければならないキューブの数を考えると、これがこれを行う正しい方法であるかどうかさえわかりません。
私も試しましgluProject
たが、動作しますが、信頼性が非常に低く、選択した立方体の面が表示されません。
編集
だからこれは私がやったことです:光線で空間内の位置を計算します:
float t = 0;
for(int i=0; i<10; i++)
{
Vector p = ray*t+origin;
while(visible octree)
{
if(p inside octree)
{
// then call recursive function until a cube is found
break;
}
octree = octree->next;
}
if(found a cube)
{
break;
}
t += .5;
}
実際には驚くほど高速で、最初に見つかったキューブの後で停止します。
ご覧のとおり、光線は立方体(実際には空間内の位置)を見つける前に複数の八分木を通過する必要があります。画面の中央に十字線があります。増分ステップが低いほど、選択はより正確になりますが、速度も遅くなります。