PDA

View Full Version : [JAVA3D] Utilizzare 2D in Canvas3D


som
09-12-2008, 15:18
Salve a tutti,
ho la necessità di utilizzare delle forme bidimensionali in un canvas3D.
Per fare ciò ho ridefinito il metodo postRender() della classe Canvas3D


public class CustomCanvas3D extends Canvas3D {
public CustomCanvas3D(GraphicsConfiguration gcIn) {
super(gcIn);
}
@Override
public void postRender()
{
J3DGraphics2D g = getGraphics2D();
g.setColor(Color.orange);
g.fillOval(0, 0, 50, 50);
g.flush(true);
}
}

fin qui tutto ok. L'ovale in esempio mi compare nel canvas.

Ora avrei la necessità di capire quando il mouse viene cliccato su questo oggetto in modo da poterlo spostare nel canvas (e magari anche ridimensionarlo.. ma per ora vorrei solo traslarlo).

Il pick implemento per intercettare il click sull'oggetto 3d mi pare non funzionante per l'oggetto 2D (anche perchè questo non fa parte del BranchGroup associato al PickCanvas), quindi dovrei fare diversamente.

Qualcuno ha idea di come si possa fare a gestire degli oggetti 2D in un canvas3D?
Intanto vi ringrazio per l'attenzione.
Ciao

ps. Avevo provato anche a definire i miei oggetti 2D come trasformazione della ViewingPlatform dell'Universo, ma non mi convinceva perchè a me servirà estrarre dei punti di intersezione tra questi oggetti 2D e quelli 3D.

banryu79
09-12-2008, 17:09
[Premesso che non conosco il framework Java3D]
Quello che vuoi fare temo non sia proprio banale.
Guardando lo spezzone di codice vedo che tu hai eseguito delle operazioni di disegno sul canvas 2d ottenuto dal canvas 3d, punto.
Credo proprio che non ci sia da nessuna parte un oggetto corrispondente al tuo ovale da poter chiedere al canvas 3d e con cui farlo inteagire.

Già per poter individuare un click sul canvas 2d e dire se è interno o meno all'ovale c'è bisogno di un oggetto/modello della figura, credo che al tuo caso potrebbe essere utile utilizzare qualche strumento già pronto nel Framework di Java, in particolare:

- l'interfaccia java.awt.Shape (http://java.sun.com/javase/6/docs/api/)
- alcune classi in java.awt.geom (http://java.sun.com/javase/6/docs/api/) (tra cui PathIterator)

Lo scopo sarebbe quello di evitare di disegnare direttamente con i comandi la figura; invece la si "costruisce" come un percorso (un PathIterator, che poi è un'implementazione di una Shape, vedi sopra) in modo da poter poi fare i confronti con le coordinate del mouse ed essere agevolati anche per quanto rigurda traslazioni varie (e rotazioni nel piano 2d, se dovesse servire).

Per quanto riguarda invece l'intersezione della figura 2d con quelle 3d francamente non saprei.

Per curiosità, cosa stai cercando di ottenere? Cioè quale sarebbe lo scopo di trovare le intersezioni delle figure 2d con le 3d?

som
09-12-2008, 22:09
Intanto ti ringrazio per la risposta.

In effetti credo tu abbia ragione, proverò a disegnare in questo modo (per la parte 3d utilizzo già delle Shape3D)

L'intersezione tra gli oggetti 2D e il solido 3D che c'è sotto mi serve perchè rappresenteranno delle coordinate da mandare ad un macchina a controllo numerico. In pratica sto cercando di capire se posso riuscire a creare un cad/cam con java 3d ( il limite non è detto che sia java3d ... anzi potrei benissimo essere io :p ).
Se hai suggerimenti in merito sono qui!

Comunque ti aggiorno sugli sviluppi! :)

nico159
09-12-2008, 23:00
Non so se ti può essere utile
http://labs.trolltech.com/blogs/2008/12/02/widgets-enter-the-third-dimension-wolfenqt/ :D
Ci sono i sorgenti, magari potresti usare la stessa tecnica con Java (comunque le QT funzionano anche con Java)

som
10-12-2008, 07:13
Grazie nico159, ci dò subito un'occhiata. :D

som
10-12-2008, 11:29
Ho risolto la questione del disegno2D selezionabile e traslabile aggiungendo all'Universo un nuovo BranchGroup che contiene il mio 2D ottenuto con Shape3D con quota z fissata.
Ora però devo fare in modo che questo si porti sulla superficie per poi ricavare le mie coordinate. Mi piacerebbe ottenere un effetto magnetico tra la superficie del solido e il mio 2D ... ma chissà :p

banryu79
10-12-2008, 11:44
Ho risolto la questione del disegno2D selezionabile e traslabile aggiungendo all'Universo un nuovo BranchGroup che contiene il mio 2D ottenuto con Shape3D con quota z fissata.
Ora però devo fare in modo che questo si porti sulla superficie per poi ricavare le mie coordinate. Mi piacerebbe ottenere un effetto magnetico tra la superficie del solido e il mio 2D ... ma chissà :p
Immagino che la superficie del solido 3D rappresenti il "pezzo" da lavorare...
Invece il solido 3D a quota Z fissa (nel senso che ha spessore costante?) cosa rappresenta? La lavorazione che deve effettuare la testa della macchina CN? (Sto ipotizzando che la macchina in questione sia una sorta di pantografo).

Forse sbaglio, ma se la superficie 3D del "pezzo" rappresenta la superficie di lavoro, non puoi in qualche modo ricavarti la sua quota Z e usarla come quota Z di base per la Shape3D della "lavorazione" nel nuovo BranchGroup?

Cioè non ho capito in che senso vuoi ottenere l'effetto magnetico: immagino si tratti di quando catturi e processi gli eventi del mouse per la traslazione (sei già riuscito a riconoscere un click del mouse sulla Shape?)...
In quel caso basta che tieni "bloccata" una coordinata e lasci che la traslazione agisca sulle altre due... credo :D
[Ricordo che non consco Java3D, e quindi non so nulla, manco cos'è un BranchGroup e che funzione ha nell'architettura di questo framework]

som
10-12-2008, 12:41
Immagino che la superficie del solido 3D rappresenti il "pezzo" da lavorare...
Invece il solido 3D a quota Z fissa (nel senso che ha spessore costante?) cosa rappresenta? La lavorazione che deve effettuare la testa della macchina CN? (Sto ipotizzando che la macchina in questione sia una sorta di pantografo).


Esattamente! :D


Forse sbaglio, ma se la superficie 3D del "pezzo" rappresenta la superficie di lavoro, non puoi in qualche modo ricavarti la sua quota Z e usarla come quota Z di base per la Shape3D della "lavorazione" nel nuovo BranchGroup?


Si ma non è esattamente così immediato. A seconda della superficie che voglio lavorare, "'l'altezza" a cui piazzare la mia lavorazione può essere una distanza dall'asse X se il piano è orizzontale, dall'asse Y se il piano è verticale o da calcolare in caso di piano obliquo...tutto dipende dal piano.


Cioè non ho capito in che senso vuoi ottenere l'effetto magnetico: immagino si tratti di quando catturi e processi gli eventi del mouse per la traslazione (sei già riuscito a riconoscere un click del mouse sulla Shape?)...
In quel caso basta che tieni "bloccata" una coordinata e lasci che la traslazione agisca sulle altre due... credo :D
[Ricordo che non consco Java3D, e quindi non so nulla, manco cos'è un BranchGroup e che funzione ha nell'architettura di questo framework]

Sì sono riuscito a selezionare la shape con il click. L'Effetto magnetico che avevo in mente ( ma ci devo ancora ragionare su ) era per fare in modo che il disegno della lavorazione andasse direttamente ad aderire sulla superficie da lavorare. Con la traslazione mi sposto in x e y , la terza coordinata z rimane da gestire o con i calcoli che ti dicevo prima o in questo modo ( o in entrambi :p )

[ il BranchGroup è un nodo fondamentale dell'albero che compone il Java3D ]

Cmq ti ringrazio molto non solo per la partecipazione alla discussione, ma anche per aver capito "al volo". :D

banryu79
10-12-2008, 12:51
Cmq ti ringrazio molto non solo per la partecipazione alla discussione, ma anche per aver capito "al volo". :D

Credo che sia perchè lavoriamo più o meno nello stesso "ramo"... io ho a che fare con un CAD/CAM di forme parametrizzate.
Per (mia) fortuna le forme poi servono solo per esplodere le loro facce (quelle che per te sono le superfici) nel piano 2D e i tagli sono sempre nel piano 2D, e non ho neppure un motore verticale per la testa di taglio (posizioni fisse, pistoni) quindi è tutto molto più semplice.

Al momento non mi viene in mente nulla per il tuo problema, ma mi pare di aver capito che le "superfici" su cui lavori non è detto che corrispondano sempre ai piani ortogonali rispetto il sistema cartesiano di riferimento.

In tal caso forse ti servirebbe (se già non ce l'hai) un'astrazione/entità che ti rappresenti un piano generico, potrebbe servire ad esempio per rimappare un certo spostamento fatto su un piano ortogonale (quello XY del mouse sul canvas2D, tanto per essere più concreti) sul piano che rappresenta la tua attuale "superfice" di lavoro.

Spero di non aver detto minchiate :D

som
10-12-2008, 13:06
Sì, la superficie può avere qualsiasi inclinazione e ciò complica un po' le cose.

Non credo tu abbia detto minchiate, ma non escludo che abbia potuto dirne anche io :p

banryu79
10-12-2008, 15:17
Intendevo dire che dovresti astrarre una classe/interfaccia (quel che è) che rappresenti un generico Piano: i piani ortogonali sono solo un caso particolare tra tutti quelli possibili.

Se poi riesci a definire un'operazione che traduca le coordinate di un punto del piano (ortogonale) nelle rispettive coordinate del corrispettivo punto sul piano (inclinato) sei a cavallo: se non sbaglio ciò ha a che fare con gli spazi vettoriali.

Conoscendo la teoria (le giuste formule) dovresti essere in grado di implementare un sistema come ho descritto sopra, quindi pensa un po', potresti mappare le coordinate su qualsiasi piano (cioè inclinato contemporaneamente su tutti gli assi, ammesso che ciò ti serva).

Purtroppo sono scarsillo in quanto a conoscenze matematico/algebriche, forse qualche altro utente ti può dare le giuste informazioni.

som
17-12-2008, 13:34
Questo calcolo per ora non dovrebbe servirmi, ho deciso di rendere i piani paralleli al mio schermo prima di aggiungerci delle lavorazioni ( che tra l'altro sono diventate dei solidi 3D anche loro... :D )

Ho un mucchio di problemi .. chissà se ne esco vivo :cry:

banryu79
17-12-2008, 14:05
Questo calcolo per ora non dovrebbe servirmi, ho deciso di rendere i piani paralleli al mio schermo prima di aggiungerci delle lavorazioni ( che tra l'altro sono diventate dei solidi 3D anche loro... :D )

Ho un mucchio di problemi .. chissà se ne esco vivo :cry:

Bhe, quello che stai facendo non è proprio semplicissimo (parlo immaginando anche il resto che ci sta dietro, non solo il problema oggetto di questo thread), specie se sei da solo e devi contare solo su te stesso per implementare il software: ti auguro di avere almeno un altro collega con cui confrontarti :)

Ottima idea pressuporre il parallelismo dei piani rispetto allo schermo per introdurre le lavorazioni nei piani inclinati (provo a immaginare: il trucco sta nel fatto che sai quanto è il valore di inclinazione del piano rispetto quello ortogonale di riferimento: ma se le lavorazioni le inserisci parallele a quello inclinato ciò forse significa che la testa che deve fare la lavorazione è inclinabile/ruotabile?)

som
17-12-2008, 15:28
Bhe, quello che stai facendo non è proprio semplicissimo (parlo immaginando anche il resto che ci sta dietro, non solo il problema oggetto di questo thread), specie se sei da solo e devi contare solo su te stesso per implementare il software: ti auguro di avere almeno un altro collega con cui confrontarti :)


Grazie banryu! Al progetto ci lavoro da solo ma ho un ottimo collega con cui confrontarmi! :)


Ottima idea pressuporre il parallelismo dei piani rispetto allo schermo per introdurre le lavorazioni nei piani inclinati (provo a immaginare: il trucco sta nel fatto che sai quanto è il valore di inclinazione del piano rispetto quello ortogonale di riferimento: ma se le lavorazioni le inserisci parallele a quello inclinato ciò forse significa che la testa che deve fare la lavorazione è inclinabile/ruotabile?)

Certo che non ti sfugge nulla :D .. Grande!!

banryu79
17-12-2008, 15:39
Certo che non ti sfugge nulla :D .. Grande!!

Se è come pensavo allora la macchina e le lavorazioni sono belle complesse, azz.
Chissà che figata :D

Che fate? Fresate metalli? O magari fate modelli per stampi?

som
17-12-2008, 15:45
Se è come pensavo allora la macchina e le lavorazioni sono belle complesse, azz.
Chissà che figata :D

Che fate? Fresate metalli? O magari fate modelli per stampi?

Macchine utensili di vari tipi tra cui anche frese per metalli! :D