PDA

View Full Version : JAVA 3D


Marbury
15-01-2008, 20:46
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!!!

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);
}
}

cionci
16-01-2008, 10:40
Thread chiuso
|
V