SOFTWARE > Linguaggi di programmazione e scripting
[C] Morphos Opengl
TheKaneB:
--- Citazione da: "Z80Fan" ---Aspetta, forse c'è una soluzione più semplice, in base al tipo di lavoro che deve fare:
ad esempio, sto scrivendo una specie di clone di Minecraft, e dato che il mondo è formato da cubi regolari, partendo dalla posizione del giocatore e dalla direzione in cui guarda, posso (con qualche algoritmo di rasterizzazione) trovare facilmente tutti i cubi presenti sulla linea dello sguardo.
Bisognerebbe conoscere più in dettaglio lo scopo del programma, per trovare eventuali semplificazioni.
--- Termina citazione ---
EDIT: avevo scritto una boiata perchè non avevo capito subito il tuo esempio... comunque, ecco la mia risposta corretta:
Nel tuo caso il picking è fatto all'interno del World Space, e il gioco segue una geometria semplice basata su una matrice bidimensionale. Nel tuo caso quindi si rimane a livello di Model.
Qui si parla invece di prendere una scena 3D assolutamente generica e trovare quell'oggetto che sta sotto il pixel desiderato. In questo caso bisogna risalire al model partendo dalla view. Sono problemi del tutto differenti. ;)
raistlin77it:
--- Citazione da: "Z80Fan" ---Bisognerebbe conoscere più in dettaglio lo scopo del programma, per trovare eventuali semplificazioni.
--- Termina citazione ---
il gioco in questione è un clone di picross 3d
col mio "newbe method" comunque ho già creato un editor di puzzle ed una beta del giochillo. :D :D
Mi piacerebbe riuscire a farlo funzionare su mos, visto che lo rilascerei free proprio lì.
http://http://imageshack.us/photo/my-images/189/voxelpuzzle.png/
/newbe mode on
ora vedo se con qualche "workaround" tipo aggiungere un uno ai componenti r,g,b,>0 si risolve senza perdeere ulteriori capelli :P :P
/newbe mode off
TheKaneB:
al limite usa il metodo della distanza quadrata nello spazio RGB, come ho spiegato prima...
butto giù un pezzo di codice senza testarlo, giusto per farti capire il metodo...
--- Codice: ---class RgbVector //
{
public:
RgbVector(int r, int g, int b);
int lenght2() const; // lunghezza quadrata
RgbVector operator-(const RgbVector& a, const RgbVector& b); // operatore per la differenza
int mR, mG, mB; // i 3 canali, pubblici per semplicita'
}
RgbVector::RgbVector(int r, int g, int b)
{
mR = r;
mG = g;
mB = b;
}
int RgbVector::length2() const
{
return mR*mR + mG*mG + mB*mB;
}
RgbVector RgbVector::operator-(const RgbVector& a, const RgbVector& b)
{
return RgbVector(a.mR - b.mR, a.mG - b.mG, a.mB - b.mB);
}
--- Termina codice ---
Applicandolo al tuo codice diventerebbe così più o meno:
--- Codice: ---// Esempio, usando le variabili prese dal tuo codice
RgbVector coloreRiferimento(nIndex%256,(nIndex>>8) % 256, (nIndex>>16) % 256);
RgbVector colorePixel(col%256, (col>>8) % 256, (col>>16) % 256)
RgbVector differenza = coloreRiferimento - colorePixel;
int tolleranza = 12; // sarebbe (2*2)+(2*2)+(2*2) quindi max 2 livelli di differenza per canale
if (differenza.length2() <= tolleranza)
{
// Ok, il colore e' simile abbastanza
}
else
{
// Non ci siamo, il colore e' completamente diverso
}
--- Termina codice ---
Un paio di note importanti:
1. Ho usato il C++ nel mio esempio e dovresti farlo anche tu, se non vuoi perdere il doppio del tempo e fare il triplo della fatica
2. NON DEVI ASSOLUTAMENTE accroccare il codice mettendo +1 manualmente. Se, per caso, nella prossima versione di MOS dovessero aggiustare il problema a livello di OpenGL, il tuo programma non funzionerebbe più. Invece implementa questo metodo che è cross platform e tiene in considerazione un certo livello di tolleranza nel confronto tra i colori (tolleranza espressa come distanza massima nello spazio colore RGB).
Ciao!
divina:
thread molto interessante :)
Z80Fan:
--- Citazione da: "TheKaneB" ---EDIT: avevo scritto una boiata perchè non avevo capito subito il tuo esempio... comunque, ecco la mia risposta corretta:
--- Termina citazione ---
Tranquillo, anche io scrivendo questa risposta stavo per sparare una cazzata assoluta :lol:
--- Citazione ---Nel tuo caso il picking è fatto all'interno del World Space, e il gioco segue una geometria semplice basata su una matrice bidimensionale. Nel tuo caso quindi si rimane a livello di Model.
Qui si parla invece di prendere una scena 3D assolutamente generica e trovare quell'oggetto che sta sotto il pixel desiderato. In questo caso bisogna risalire al model partendo dalla view. Sono problemi del tutto differenti. ;)
--- Termina citazione ---
Si, ora che ho riflettuto bene la differenza è sostanziale...
Non mi viene in mente altro, mi sa che le uniche soluzioni sono quelle. :(
Navigazione
[0] Indice dei post
Vai alla versione completa