|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2007
Messaggi: 42
|
JAVA 3D
salve, avrei bisogno di un aiuto, vorrei far ruotare un cubo usando le freccie della tastiera. Ho creato 2 behavior uno per left e right e uno per up e down però funziona solamente quello che aggiungo per ultimo!! O left-right o up-down... cioè, left e right modifico rotateY mentre l'altro rotateX... Allego il codice, se riuscite a darmi una mano mi fate un favore enorme!!!
Codice:
package it.unict.dmi.cg.Interaction; import java.awt.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.swing.*; import java.awt.event.*; import java.util.*; //Renderizza un cubo che ruota in risposta agli eventi freccia public class SimpleBehaviorApp_a2 extends JFrame { public SimpleBehaviorApp_a2() { //Recupera le configurazioni grafiche del computer GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration(); //Crea il Canvas3D e lo aggiunge al frame Canvas3D canvas3D=new Canvas3D(config); this.getContentPane().add(canvas3D,BorderLayout.CENTER); //Crea la scena BranchGroup scene=createSceneGraph(); //Crea il SimpleUniverse SimpleUniverse simpleU=new SimpleUniverse(canvas3D); //Questo comando serve per spostare leggermente indietro il sistema di riferimento simpleU.getViewingPlatform().setNominalViewingTransform(); //Compila la scena (subito prima di renderla viva) scene.compile(); //Aggiunge la scena all'universo simpleU.addBranchGraph(scene); } //Crea la scena private BranchGroup createSceneGraph() { //Crea la radice del branch graph BranchGroup objRoot=new BranchGroup(); //Crea un gruppo per le trasformazioni affini TransformGroup objSpin=new TransformGroup(); //Imposta la capacita' di scrivere la trasformazione objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //Aggiunge al gruppo un cubo colorato objSpin.addChild(new ColorCube(0.4)); //Crea un behavior SimpleBehavior_a2 rotatorY=new SimpleBehavior_a2(objSpin); SimpleBehavior_a3 rotatorX=new SimpleBehavior_a3(objSpin); //Imposta un raggio d'azione del behavior BoundingSphere bounds=new BoundingSphere(); rotatorX.setSchedulingBounds(bounds); rotatorY.setSchedulingBounds(bounds); //aggiunge l'interpolatore alla gruppo di trasformazione objSpin.addChild(rotatorX); objSpin.addChild(rotatorY); //Aggiunge alla radice il gruppo objRoot.addChild(objSpin); return objRoot; } public static void main(String[] args) { SimpleBehaviorApp_a2 simple=new SimpleBehaviorApp_a2(); simple.setTitle("Simple Behavior"); simple.setSize(300,300); simple.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); simple.show(); } } //L'implementazione del Behavior personalizzato class SimpleBehavior_a2 extends Behavior { private TransformGroup targetTG; private Transform3D rotation=new Transform3D(); private double angle=0.0; private WakeupOnAWTEvent awt=new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); public SimpleBehavior_a2(TransformGroup targetTG) { this.targetTG=targetTG; } public void initialize() { //Questo Behavior rispondera' ad eventi di tastiera sul key pressed this.wakeupOn(awt); } public void processStimulus(Enumeration criteria) { //Recupera gli stimoli che hanno attivato il behavior AWTEvent[] ev=null; while (criteria.hasMoreElements()) { Object obj=criteria.nextElement(); if (obj instanceof WakeupOnAWTEvent) ev=((WakeupOnAWTEvent)obj).getAWTEvent(); } //Verifica se l'evento AWT e' stato lanciato //if (awt.hasTriggered()) ev=awt.getAWTEvent(); if (ev!=null) for (int i=0;i<ev.length;i++) //scorre tutti gli eventi AWT in cerca di un evento di tastiera if (ev[i] instanceof KeyEvent) { //Recupera l'evento KeyEvent key=(KeyEvent)ev[i]; //Recupera il codice dell'evento int code=key.getKeyCode(); if (code==KeyEvent.VK_LEFT) //Codice freccia a sinistra { //decrementa l'angolo angle-=0.1; //Evita problemi di overflow if (angle<0) angle=2*Math.PI; } else if (code==KeyEvent.VK_RIGHT) //Codice freccia a destra { //Incrementa l'angolo angle+=0.1; //Evita problemi di overflow if (angle>2*Math.PI) angle=0; } //imposta la rotazione dell'angolo rotation.rotY(angle); targetTG.setTransform(rotation); } //Reseta il Behavior per continuare a rispondere ad eventi di tastiera this.wakeupOn(awt); } } //L'implementazione del Behavior personalizzato class SimpleBehavior_a3 extends Behavior { private TransformGroup targetTG; private Transform3D rotation=new Transform3D(); private double angle=0.0; private WakeupOnAWTEvent awt=new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); public SimpleBehavior_a3(TransformGroup targetTG) { this.targetTG=targetTG; } public void initialize() { //Questo Behavior rispondera' ad eventi di tastiera sul key pressed this.wakeupOn(awt); } public void processStimulus(Enumeration criteria) { //Recupera gli stimoli che hanno attivato il behavior AWTEvent[] ev=null; while (criteria.hasMoreElements()) { Object obj=criteria.nextElement(); if (obj instanceof WakeupOnAWTEvent) ev=((WakeupOnAWTEvent)obj).getAWTEvent(); } //Verifica se l'evento AWT e' stato lanciato //if (awt.hasTriggered()) ev=awt.getAWTEvent(); if (ev!=null) for (int i=0;i<ev.length;i++) //scorre tutti gli eventi AWT in cerca di un evento di tastiera if (ev[i] instanceof KeyEvent) { //Recupera l'evento KeyEvent key=(KeyEvent)ev[i]; //Recupera il codice dell'evento int code=key.getKeyCode(); if (code==KeyEvent.VK_DOWN) //Codice freccia a sinistra { //decrementa l'angolo angle-=0.1; //Evita problemi di overflow if (angle<0) angle=2*Math.PI; } else if (code==KeyEvent.VK_UP) //Codice freccia a destra { //Incrementa l'angolo angle+=0.1; //Evita problemi di overflow if (angle>2*Math.PI) angle=0; } //imposta la rotazione dell'angolo rotation.rotX(angle); targetTG.setTransform(rotation); } //Reseta il Behavior per continuare a rispondere ad eventi di tastiera this.wakeupOn(awt); } } |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Thread chiuso
| V |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:52.