+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

Rotazione in Geometria Tridimensionale

  1. #1
    L'avatar di TheRoofInhabitant
    TheRoofInhabitant non è in linea Scolaretto
    Ammetto di avere una profonda ignoranza in geometria, soprattutto quando si hanno tre dimensioni da considerare.
    Nonostante questo, ho deciso di creare una libreria grafica tridimensionale (che ci crediate o no).
    Finora sono riuscito a gestire correttamente la prospettiva nella rappresentazione sullo schermo di solidi definiti dall'utente, cambiando le coordinate del punto di vista rispetto ai solidi, ma c'è una cosa che non ho considerato: la direzione verso cui la vista è diretta, che, in un ambito reale, si può considerare anche come l'inclinazione della testa o telecamera che sia sui tre assi.

    Sempre rimanendo in questo argomento, in futuro dovrò probabilmente fornire funzioni sulla rotazione di solidi, sempre considerando l'inclinazione che hanno sui tre assi. Quindi riassumiamo così la mia domanda: Come posso conoscere le cordinate che i punti assumono in seguito a una rotazione sugli assi x, y e z?

    Sarò veramente grato a chi risponderà.

    PS: Meglio chiarire che gestisco il tutto in C++ con una struttura del genere:
    struct point
    {
        float x;
        float y;
        float z;
    };
    
    ℹ️ Leggi di più su TheRoofInhabitant ...

  2. #2
    Ti rispondo in due parole: lascia perdere.

    Ci sono tre o quattro cose che atterriscono anche il più agguerrito programmatore quadratico medio over 35, quindi con una spolverata di esperienza nel mondo DOS, parecchio pelo sullo stomaco, e molti lustri di programmazione alle spalle: scrivere un sistema operativo (in tutto o in parte), un (cross)compilatore, un software di calcolo, lavorare con i sistemi embedded critici, o avere a che fare con la geometria computazionale proiettiva. Pare strano, ma - tolto forse solo l'hardware più esotico, che nel mainstream non è noto - c'è un esercito di neofiti appena arrivati che si vuol sempre tuffare a capofitto proprio in codeste vette di complessità concettuale e applicativa. Beata gioventù...

    In tutti i casi, prima di iniziare a scrivere le prime righe di codice, occorre averne lette a centinaia di migliaia, non prima di aver fatto i conti con una pila di libri ad altezza d'uomo. Io che non amo il mondo del gaming e possiedo pochissimi testi in materia ne ho comunque tre o quattro dozzine, che sono tanti ma al tempo stesso nulla per chi vuole davvero interessarsi all'argomento.

    Quindi, ribadisco: lascia perdere, se non hai seria intenzione di studiare unicamente quello per i prossimi due o tre anni. Lascia che a scrivere le librerie grafiche siano gli esperti: quella roba non s'improvvisa, men che mai con prestazioni decenti, né ha valore didattico. Anzi, ci hanno lasciato i denti ondate di studenti con una esposizione pluriennale alla geometria a livello di corsi di laurea.
    ℹ️ Leggi di più su M.A.W. 1968 ...

  3. #3
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Per aggiungere qualcosina al riguardo... il problema in sé è piuttosto semplice, ma non ignorare i consigli di MAW.

    L'argomento richiederebbe molto spazio e tempo, per cui cerco di semplificare le cose il più possibile.
    In buona sostanza devi gestire quattro sistemi di coordinate nel tuo mondo 3d.

    Si parla in generale di coordinate oggetto (object), coordinate mondo (world), coordinate camera e coordinate schermo. L'ultima ovviamente è la proiezione vera e propria da un sistema di coordinate 3D (x,y,z) ad uno schermo piatto (x,y).
    La trasformazione da un insieme all'altro prevede di implementare la necessaria funzione (chiaramente appoggiandosi a framework esistenti, com'è la norma, alcune delle funzioni basilari ti vengono fornite, o addirittura nascoste, comodamente dal framework).

    Le coordinate oggetto sono generalmente la posizione dei punti dell'oggetto attorno ad un origine relativa all'oggetto stesso... spesso è il baricentro o il centro dell'oggetto. Le coordinate avranno quindi valori positivi e negativi a seconda della loro posizione rispetto al centro dell'oggetto. Per ruotare un'oggetto sui suoi assi devi operare sulle sue coordinate oggetto.

    Quando poi l'oggetto viene inserito in un mondo 3d, avrà una sua posizione all'interno dello stesso. Se oltre ad un oggetto devi disegnarne altri la cosa diventa importante. L'operazione di trasformazione non è nient'altro che una traslazione. Spostando un oggetto in questo sistema di coordinate, sposti rispetto al centro del mondo. Gli spostamenti nel mondo di gioco avvengono in genere qui.

    Le coordinate camera sono di nuovo uno spostamento dell'origine degli assi sull' "oggetto camera"... qui le cose si complicano un poco, visto che è necessaria anche una rotazione. In toto si effettua una roto-traslazione dell'oggetto (a parte i paroloni, è sufficiente una matrice 3x3 apposita).

    A quel punto la proiezione vera e propria è una cosa abbastanza semplice, considerando però che nel disegno a video devi ordinare gli oggetti sull'asse z della camera se vuoi disegnarli correttamente. Anche qui i framework grafici offrono parecchio ausilio (nella peggiore delle ipotesi hai uno z-buffer a disposizione) e ti evitano un'operazione che ha un costo semplicemente esorbitante.

    Tutte queste informazioni di base le puoi trovare abbastanza facilmente in giro per la rete ed esiste anche qualche testo cartaceo ben fatto sull'argomento (ovviamente in Inglese)... tieni conto comunque che almeno openGL o DirectX è opportuno usarli se vuoi ottenere qualcosa che disegni ad una velocità (FPS - Frames Per Second) decente e sfruttando le schede video moderne.
    In caso contrario lavori solo di CPU e più andare abbastanza sul sicuro che le prestazioni non saranno per niente buone appena le cose si complicano un poco.

    Ciaociao
    Ultima modifica di bottomap; 09-02-2012 09:54 
    ℹ️ Leggi di più su bottomap ...

  4. #4
    L'avatar di TheRoofInhabitant
    TheRoofInhabitant non è in linea Scolaretto
    Ma io ho deciso di continuare con questa cosa perché mi sta dando dei risultati stupefacenti: Ecco qua quello che sono riuscito a fare fin'ora (premete un tasto qualsiasi per iniziare la proiezione una volta aperto il programma, e premete i tasti A, Z, Q, W, O, L per cambiare la posizione della vista, ed E per uscire).
    (So che ogni volta che premo un tasto mi ridisegna tutta la scena, invece delle sole parti interessate, ma è una cosa che risolverò più tardi ).
    Ultima modifica di TheRoofInhabitant; 09-02-2012 17:28 
    ℹ️ Leggi di più su TheRoofInhabitant ...

  5. #5
    Skary non è in linea Scolaretto
    bhe l'argomento per essere complesso è complesso.
    Se vuoi comunque perseverare io posso darti la mi modesta opinione in merito , che deriva da un esperimento che feci tempo fa (un insieme di funzioni in C per manipolare immagini bitmap 2D).

    Al tempo usavamo un piano di coordinate polari per rappresentare coniche ed effettuare rotazioni di angoli a piacere.
    In particolare facevamo una cosa un po strana per le figure complesse (ellissi , parabole , iperboli etc ) ossia calcolavamo un tot di vertici con le coordinate polari e poi li congiungevamo con rette.
    Se i vertici sono molti non ti accorgi dell'apporssimazione ed eviti di dover calcolare un macello di punti con seni e coseni che sono operazioni pesanti.
    Oltretutto quando dovevamo ruotare o traslare adoperavamo sempre una funzione di rototraslazione con i debiti parametri che veniva applicata all'array di vertici (e non a tutti i punti della figura) dopo di che le rette (che sono veloci da disegnare) venivano rifatte.

    Credo che un piano a 3D non differisca troppo da uno a 2D , credo dovrai considerare qualche (1) angolo in più per ogni vertice... ci si dovrebbe riflettere un attimo.

    Ps:
    Per risolvere il problema dei seni e de coseni ( che sono onerosi) adoperavamo una tabella precalcolata , se non ricordo male M.A.W ha scritto a riguardo chiamandola LUT e dovrebbe esserci nel suo blog una spiegazione abbastanza esaustiva.

  6. #6
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Calma... usare tabelle di lookup per seni e coseni non è il problema di fondo. Le FPU, i compilatori e soprattutto le schede grafiche attuali sono altamente ottimizzate per le operazioni connesse con le tre dimensioni e con il calcolo matriciale (non a caso il numero di alu sulle gpu cresce esponenzialmente e l'apertura delle stesse all'esterno ha permesso agli applicativi di sfruttare l'enorme potenza di calcolo a disposizione... nel caso della Nvidia parliamo di CUDA).
    Gestire manualmente gli angoli di rotazione in uno spazio 3d è certamente possibile, ma altamente sconsigilabile.

    In 3D è assolutamente necessario lavorare con matrici e vertici... volendo (ma la trovo una cosa un po'esotica) si può lavorare con i quaternioni (e li però le cose si complicano un tantino).
    Le operazioni di base di rotazione, traslazione e scala di un intero oggetto le ottieni tranquillamente moltiplicando ogni vertice per la suddetta matrice (che appunto può contenere tutte e tre le trasformazioni o solo una parte di esse). La matrice in sé non è complessa da calcolare e come detto c'è abbondanza di materiale in giro. Il passaggio tra i vari sistemi di coordinate con una matrice apposita basta e avanza per qualsiasi tipo di operazione è necessario fare sui vertici dell'oggetto prima della proiezione a schermo.

    Un piano 3d non esiste... esiste uno spazio 3d, identificato da tre piani 2d che si incontrano nell'origine. La differenza non è sottile ed è intimamente legata al fatto che non basta "aggiungere un angolo" ed un paio di seni e coseni... le cose in realtà si complicano più di quanto pensi (ad esempio hai che l'ordine delle trasformazioni che applichi non è più necessariamente commutativo).

    Ripeto e sottolineo che sfruttando la scheda grafica non ci si deve preoccupare altro che di questo, all'applicazione delle texture, all'alpha blending, allo z-buffering, alla rimozione delle facce nascoste, agli stencil buffer, a qualsiasi effetto grafico tu voglia aggiungere ci pensa tranquillamente la scheda sfruttando al 100% tutta la potenza di calcolo che ha (che spesso e volentieri supera abbondantemente quella della cpu+fpu montata a bordo del pc).
    Non a caso oramai per certe cose 2D è più semplice creare un bel quadratone e piazzarlo sempre parallelo alla camera (z fisso) piuttosto che lavorare direttamente in due dimensioni (la tecnica in sé si chiama billboarding).

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  7. #7
    Skary non è in linea Scolaretto
    Come non detto
    Ero convinto bastassero 2 piani cartesiani (e quindi 2 angoli) per determinare la posizione di un punto nello spazio cartesiano.

    Poi certo che ci saranno degli strumenti sicuramente più adeguati e migliori non era quello che intendevo dire.

  8. #8
    Come ha già rimarcato il buon bottomap, esistono relazioni implicite tra coordinate polari, rotazioni e funzioni trigonometriche periodiche. Credo che questa sia la più succinta presentazione disponibile, mentre questi lucidi introducono in modo decisamente molto semplice i concetti fondamentali inerenti i quaternioni.

    Non posso che ribadire che oggi le GPU prendono in carico queste elaborazioni in modo del tutto trasparente e massimamente efficiente, esponendo una potenza di calcolo che (grazie alla sostanziale mancanza di vincoli di retrocompatibilità) supera ormai di decine di volte quella delle più potenti CPU multicore x86.
    ℹ️ Leggi di più su M.A.W. 1968 ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Routine per geometria
    Da SebastianoFloridia nel forum Altri linguaggi e strumenti
    Risposte: 2
    Ultimo Post: 15-01-2019, 00:55
  2. Routine per geometria
    Da SebastianoFloridia nel forum C#
    Risposte: 0
    Ultimo Post: 01-11-2018, 14:43
  3. Rotazione valori
    Da andreapanunzio nel forum Microsoft Excel
    Risposte: 1
    Ultimo Post: 19-11-2017, 19:05
  4. Rotazione Label
    Da LoreM nel forum Visual Basic .Net
    Risposte: 8
    Ultimo Post: 06-11-2011, 10:56
  5. [Geometria] Calcolare coordinata di un punto data una distanza
    Da Shinji nel forum Altri linguaggi e strumenti
    Risposte: 7
    Ultimo Post: 04-05-2008, 18:31