Sto creando un clone di Minecraft come il mio primo progetto OpenGL e sono bloccato nella parte di selezione della casella. Quale sarebbe il metodo migliore per effettuare una selezione affidabile di scatole?Miglior metodo di selezione della casella per un clone Minecraft
Ho eseguito alcuni algoritmi AABB, ma nessuno di loro spiega abbastanza bene quello che fanno esattamente (specialmente quelli super-ottimizzati) e non voglio usare cose che non capisco.
Dal momento che il mondo è composto da cubetti ho usato octrees di rimuovere qualche tensione sui calcoli del cast ray, in fondo l'unica cosa che serve è questa funzione:
float cube_intersect(Vector ray, Vector origin, Vector min, Vector max)
{
//???
}
Il raggio e l'origine sono facilmente reperibili con
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 e max sono gli angoli opposti di un cubo.
Non sono nemmeno sicuro che questo sia il modo giusto per farlo, considerando il numero di cubi che dovrei controllare, anche con gli ocrees.
Ho anche provato gluProject
, funziona, ma è molto inaffidabile e non mi dà la faccia selezionata del cubo.
EDIT
Quindi questo è quello che ho fatto: calcolare una posizione nello spazio con raggio:
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;
}
In realtà è sorprendentemente veloce e si ferma dopo il primo trovato cubo .
Come si può vedere il raggio deve andare trogolo più octrees prima che trovi un cubo (in realtà una posizione nello spazio) - c'è un mirino al centro dello schermo. Più basso è il passo di incremento, più precisa è la selezione, ma anche più lenta.
Copia incollato ciò che hai detto a Google e trovato che: http://www.metanetsoftware.com/technique/tutorialB.html Grazie, molto meglio della mia soluzione. – Solenoid
D'accordo .. Ho lavorato su un clone per xbox e ho trovato l'elaborazione dei vertici intensivi .. passati ai cubi in marcia per il mio prossimo gioco e funziona molto più velocemente (come un'APP di cromo in javascript!) [Mine mars] (http: // youtu.be/_oML6USPs20) –