Autore Topic: Spline - grafica 2D\3D  (Letto 1621 volte)

Offline chaw359

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    windows 7
Spline - grafica 2D\3D
« il: 03 Marzo 2016, 10:15:04 CET »
0
Salve ragazzi,
Vi presento il mio problema:
In pratica sono un laureando (a tre esami dalla laurea) che ha deciso di scrivere la propria tesi sulle funzioni spline e la loro applicazione nella computer grafica. Ora quello che vorrei fare è un giochino o una qualsiasi app che ne faccia uso, in particolar modo vorrei cimentarmi nella grafica tri-dimensionale! Girando su internet ho trovato un bel libro sull'OpenGL ES 2.0 per android che in questi giorni studierò come un forsennato, tuttavia non ho trovato nulla al suo interno che parlasse di curve, o meglio per dirla in maniera più sincera, che parlasse di spline o curve di Bezièr etc etc. Non mi sono arreso e ho navigato ancora il web e ho trovato sì del codice, ma dove non ti viene spiegato per nulla la logica dello stesso, forse direte voi: "studiati prima il libro e poi capirai la logica di quel codice", si è vero avete ragione, però la mia preoccupazione è: e se dopo tutto lo studio non c'è nulla su OpenGL che implementi le spline? E da qui sorge la mia domanda: esiste una libreria per android che semplifichi in qualche maniera la creazione di curve sia 2D che 3D tramite le funzioni spline? Perchè se non esiste... il mio tirocinio potrebbe vertere proprio sulla creazione di tale libreria! Anche perchè sono un dannato amante della semplicità.

P.S: se tutto va bene il libro dovrei riuscire a finirlo in qualche mese (considerando che devo studiare per 3 esami), però se mi dite che esiste una libreria per le curve spline la cosa mi rassicura molto.
P.P.S: Nel caso mi linkiate libgdx, non è che potreste anche indicarmi se risponde alla mia domanda? E come? :D

Grazie infinite :D

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Spline - grafica 2D\3D
« Risposta #1 il: 03 Marzo 2016, 15:26:59 CET »
0
ciao, personalmente non ti so dire su android, ma ho avuto esperienza di spline e curve di bezier su java usando JOGL (un wrapper java per opengl).
Al momento non ricordo molto, ma se non sbaglio c'erano tutta una serie di calcoli matematici/matriciali per calcolare i valori "importanti" di una curva, se non ricordo male ottenevo 4 punti di controllo ed un moltiplicatore k.
Il tutto era facilmente implementabile in java con Jogl sfruttando le chiamate Opengl, che da quanto ho visto tra jogl e android non sono tanto distanti.
Potresti partire guardando come si fa in java e poi portarlo su android.

Io mi ricordo ben poco, son passati ormai 6 anni :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Spline - grafica 2D\3D
« Risposta #2 il: 03 Marzo 2016, 16:24:05 CET »
0
Se il device di riferimento supporta OpenGL ES 3.1, shading language 3.10 e l'estensione EXT_geometry_shader puoi usare un geometry shader.  ;-)
Però serve un device adatto, per esempio già un galaxy S6 è OpenGL ES 3.1, ha lo shading language 3.10 e NON SUPPORTA EXT_geometry_shader

A parte avere un supporto hardware per generare poligoni extra, il discorso di per se è abbastanza semplice.

In OpenGL lavori solo a triangoli o linee, stop.

Si tratterebbe "semplicemente" di valutare la funzione tal dei tali in vari punti e poi collegarli da linee. Siccome stai facendo un "sampling" della funzione, maggiore è il numero di punti migliore è il risultato. Per punti "distanti" tra loro 1 pixel o meno hai l'illusione di ottenere una curva.  ;-)

Offline chaw359

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    windows 7
Re:Spline - grafica 2D\3D
« Risposta #3 il: 04 Marzo 2016, 18:53:59 CET »
0
Grazie innanzitutto per le risposte :D

Citazione
Il tutto era facilmente implementabile in java con Jogl sfruttando le chiamate Opengl, che da quanto ho visto tra jogl e android non sono tanto distanti.
Potresti partire guardando come si fa in java e poi portarlo su android.

Caro Nicola_D molto probabilmente seguirò il tuo consiglio :D


Citazione
Se il device di riferimento supporta OpenGL ES 3.1, shading language 3.10 e l'estensione EXT_geometry_shader puoi usare un geometry shader.  ;-)
Però serve un device adatto, per esempio già un galaxy S6 è OpenGL ES 3.1, ha lo shading language 3.10 e NON SUPPORTA EXT_geometry_shader

A parte avere un supporto hardware per generare poligoni extra, il discorso di per se è abbastanza semplice.

In OpenGL lavori solo a triangoli o linee, stop.

Si tratterebbe "semplicemente" di valutare la funzione tal dei tali in vari punti e poi collegarli da linee. Siccome stai facendo un "sampling" della funzione, maggiore è il numero di punti migliore è il risultato. Per punti "distanti" tra loro 1 pixel o meno hai l'illusione di ottenere una curva. 

Caro Undead, sto vedendo OpenGL ES 2.0 ad essere sincero ho trovato molta documentazione e anche un libro fatto abbastanza bene :D . Poi se è uscito da poco la versione 3.x molto probabilmente sarà compatibile con pochi device... correggimi se sbaglio :D

Detto questo, quindi state confermando la mia tesi sul fatto che effettivamente non esistono librerie che ti permettono di disegnare una curva senza fare troppe righe di codice? Ad esempio una libreria che abbia una certa classe X che abbia il metodo drawSplineCurve(args...)
Perchè se è cosi magari me la scrivo io e magari mi viene anche una bella tesi :P

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Spline - grafica 2D\3D
« Risposta #4 il: 05 Marzo 2016, 00:29:07 CET »
0
Non so quanto conosci le OpenGL, si tratta di una libreria di basso livello che si interfaccia direttamente con hardware grafico. Non ha nessuna funzione ad alto livello, questa cosa è voluta, le OpenGL non sono una libreria generica e completa per il disegno grafico.

Le OpenGL presenti nei cellulari,  chiamate OpenGL-ES, sono una versione  molto semplificata delle OpenGL presenti nelle schede video dei desktop.

Per disegnare delle curve con le OpenGL è possibile ma devi scrivere del codice. Da quello che leggo c'è una confusione tra le spline e le b-spline, sono curve definite in modo molto diverso.

Per spline di solito si intende la Hermite spline cubica:

https://en.m.wikipedia.org/wiki/Cubic_Hermite_spline

La b-spline hanno una definizione più complessa e di conseguenza hanno bisogno di più linee di codice di una curva spline normale:

https://en.m.wikipedia.org/wiki/B-spline

La loro implementazione più semplice si basa semplicemente sulla loro definizione, implementazioni ottimizzate dipendono da delle elaborazioni matematiche per eseguire più velocemente i calcoli.

Qui trovi un esempio per le OpenGL per il desktop, non si può compilare per le OpenGL-ES, mancano delle librerie di supporto per l'interfaccia utente presenti nelle GLUT, può servire come base per capire il codice da scrivere:

http://www.cs.uml.edu/~kdaniels/courses/GEOM_580_S11/Curve2D.cpp


Inviato dal mio Nexus 5 utilizzando Tapatalk
« Ultima modifica: 05 Marzo 2016, 14:58:36 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Spline - grafica 2D\3D
« Risposta #5 il: 05 Marzo 2016, 14:21:07 CET »
0
Caro Undead, sto vedendo OpenGL ES 2.0 ad essere sincero ho trovato molta documentazione e anche un libro fatto abbastanza bene :D . Poi se è uscito da poco la versione 3.x molto probabilmente sarà compatibile con pochi device... correggimi se sbaglio :D
Il sistema che ho descritto funziona anche per OpenGL ES 2.0, fondamentalmente è proprio il codice che ha postato iceweasel.

Se vedi il "core" dell'algoritmo è abbastanza banale. Disegni delle linee facendo un numero di passi T e poi vedi a che punto sei (tra 0 e 1) dividendo il contatore per T. All'aumentare di T aumenta la risoluzione della curva.

Come dice iceweasel alla fine devi scrivere del codice, l'algoritmo in se è banale più lungo invece fare il setup e tutto il resto.

Conta che se usi OpenGL ES 2.0 devi scriverti almeno un vertex shader e un fragment/pixel shader, mentre con OpenGL ES 1.1 sei su una pipeline di rendering fissa.

La butto lì: ma se devi disegnare una curva in 2D non fai prima a creare una surfaceview e poi disegnare col canvas?

Offline chaw359

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    windows 7
Re:Spline - grafica 2D\3D
« Risposta #6 il: 05 Marzo 2016, 17:33:05 CET »
0
Si, a me non spaventa l'algoritmo, volevo sapere se in giro esistesse già una libreria che fosse semplice da utilizzare per disegnare curve spline o curve di bezièr e compagnia bella. Fino ad ora ho trovato solo questa per la grafica 2D:

https://github.com/handstudio/HzGrapher (posto il link perchè magari potrebbe tornare utile)

Comunque si, forse sarà molto più semplice, però per ora il mio obiettivo è creare qualcosa in grafica 3D che disegni 'ste curve spline o di bezièr. Magari ci faccio un gioco sopra, oppure ci scrivo una libreria per rendere molto più facile e intuitivo il loro utilizzo oppure qualcosa mi invento :D Sono ben accetti consigli e idee :P

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Spline - grafica 2D\3D
« Risposta #7 il: 06 Marzo 2016, 09:40:51 CET »
0
Visto che vuoi seguire la strada del 3D, quindi OpenGL ES, ci sono dei passi da seguire.
Devi dichiarare una GLSurfaceView, devi inizializzare correttamente il renderer il config e altre cose un po' pallose.
A quel punto se prosegui con OpenGL ES 1.0/1.1 devi impostare la telecamera attraverso le matrici model-view-projection e poi puoi finalmente disegnare.
Se invece passi da OpenGL ES 2.0+ devi scriverti un tuo vertex shader e gestire tu le 3 matrici model-view-projection (AKA la telecamera). Devi pure scriverti un fragment shader.

Io ti consiglio di leggere qua: Android Lesson One: Getting Started | Learn OpenGL ES

E' un tutorial che parte da zero e disegna un triangolo in OpenGL ES 2.0 usando ovviamente gli shaders. Spiega anche le matrici, inizializza la GLSurfaceView e tutto il resto.

Non è il massimo ma almeno hai una direzione dalla quale partire.

 :-)