Tworzę klon Minecraft jako mój pierwszy projekt OpenGL i utknąłem w części wyboru pudełka. Jaka byłaby najlepsza metoda dokonania rzetelnego wyboru pudełka?Najlepsza metoda wyboru pudełka dla klona Minecrafta
Przeszedłem przez niektóre algorytmy AABB, ale żadne z nich nie wyjaśnia wystarczająco dobrze, co dokładnie robią (szczególnie te super podrasowane) i nie chcę używać rzeczy, których nie rozumiem.
Ponieważ świat składa się z kostek użyłem octrees usunąć pewne obciążenie obliczeniami ray odlewanych, w zasadzie jedyną rzeczą, potrzebne jest to funkcja:
float cube_intersect(Vector ray, Vector origin, Vector min, Vector max)
{
//???
}
Promień i pochodzenie są łatwo uzyskać z
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 i max to przeciwległe wierzchołki sześcianu.
Nie jestem nawet pewien, czy to jest właściwy sposób, biorąc pod uwagę liczbę kostek, które musiałbym sprawdzić, nawet z ośmioma.
Próbowałem również gluProject
, działa, ale jest bardzo niewiarygodne i nie daje mi wybraną twarz sześcianu.
EDIT
Więc to co zrobiłem: obliczyć położenie w przestrzeni z promieniem:
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;
}
To rzeczywiście zaskakująco szybko i zatrzymuje się po raz pierwszy znaleziono kostka .
Jak widać promień musi przejść koryta wielu octrees zanim znajdzie Cube (faktycznie położeniu w przestrzeni) - istnieje krzyżyk na środku ekranu. Im niższy stopień kroku, tym dokładniejszy jest wybór, ale także wolniejszy.
Kopiowanie wklejono to, co powiedziałeś do Google, i okazało się, że: http://www.metanetsoftware.com/technique/tutorialB.html Dzięki, o wiele lepiej niż moje rozwiązanie. – Solenoid
Zgadzam się .. Pracowałem na klonie dla Xboksa i odkryłem, że przetwarzanie wierzchołków jest intensywne. Przełączono na maszerujące kostki dla mojej następnej gry i działa znacznie szybciej (jako aplikacja chrome w javascript!) [Mine mars] (http: // youtu.be/_oML6USPs20) –