# Würfel vergrößern und verkleinern per Button



## KimWangLee (14. Mrz 2008)

Hier erst mal der Code


```
import java.awt.GraphicsConfiguration;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Geometry;
import javax.media.j3d.Group;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.vecmath.Vector3d;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.picking.PickZoomBehavior;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class MyUniverse implements ActionListener{
	
	private JFrame f = new JFrame();
	private JPanel p = new JPanel();
	JButton b = new JButton("Erzeugen");
	JButton bu = new JButton("Löschen");
	//JButton but = new JButton("Dialogfeld");
	JButton butt = new JButton("Vergrößern");
	JButton butto = new JButton("Verkleinern");
	JButton button = new JButton("Auslesen");
	JTextField t = new JTextField();
	private Canvas3D canvas;
	private SimpleUniverse universe = null;
	private BranchGroup Root = new BranchGroup();
	

	public MyUniverse(){
		f.setSize(630, 500);
		f.setLocation(100, 100);
		f.setTitle("Geometrische Körper Berechner");
		f.setLayout(null);
		
		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
		canvas = new Canvas3D( config );
		canvas.setBounds(130, 0, 500, 500);
		universe = new SimpleUniverse( canvas );
		universe.getViewingPlatform().setNominalViewingTransform();
		
		b.setBounds(10, 10, 100, 40);
		b.addActionListener(this);
		bu.setBounds(10, 60, 100, 40);
		bu.addActionListener(this);
		//but.setBounds(10, 110, 80, 40);
		//but.addActionListener(this);
		butt.setBounds(10, 160, 100, 40);
		butt.addActionListener(this);
		butto.setBounds(10, 210, 100, 40);
		butto.addActionListener(this);
		button.setBounds(10, 260, 100, 40);
		button.addActionListener(this);
		t.setBounds(10, 310, 100, 30);
		
		p.setLayout(null);
		p.setBounds(0,0,130,500);
		p.add(b);
		p.add(bu);
		//p.add(but);
		p.add(butt);
		p.add(butto);
		p.add(button);
		p.add(t);
		f.add(p);
		f.add(canvas);
		
		f.setVisible(true);
	}
	
	public BranchGroup Würfel(String SeiteA){
		BranchGroup Eltern = new BranchGroup();
		TransformGroup tg = new TransformGroup();
		BoundingSphere behaveBounds = new BoundingSphere();
		
		tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		tg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
		tg.setCapability(BranchGroup.ALLOW_DETACH);
		
		PickZoomBehavior pickZoom = new PickZoomBehavior(Eltern, canvas, behaveBounds);
		
		
		MouseRotate rotor = new MouseRotate();
		rotor.setSchedulingBounds(new BoundingSphere());
		rotor.setTransformGroup(tg);
		
		ColorCube box = new ColorCube(Float.valueOf(SeiteA));
		
		tg.addChild( box );
		Eltern.addChild( tg );
		Eltern.addChild( rotor );
		Eltern.addChild(pickZoom);
		
		return Eltern;
	}
	
	public Transform3D Skalieren(double scale){
		Transform3D t3d = new Transform3D();
		t3d.setScale(new Vector3d(scale,scale, scale));
		return t3d;
		}


	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==b){
			Root = Würfel(t.getText());
			Root.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
			Root.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
			Root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
			Root.setCapability(BranchGroup.ALLOW_DETACH);
	        
			universe.addBranchGraph(Root);
		}
		if(e.getSource()==bu){
			Root.detach();
		}
		if(e.getSource()==butt){
			//Würfel vergrößern
		}
		if(e.getSource()==butto){
			//Würfel verkleinern
		}
		if(e.getSource()==button){
			//Größe von SeiteA ausgeben, auch nach veränderte Größe
			
		}
	}
	public static void main(String[] args) {
		new MyUniverse(); 
	}
}
```

Wie man aus dem Code vielleicht erkennen kann funktioniert das Vergrößern bzw. Verkleinern noch das Auslesen nicht. Ich weiß das man mit Transform3D bzw setScale den Würfel skalieren kann, aber wie soll ich die Transform3D an die TransformGroup bringen? Und wie kann ich auf den Würfel zugreifen, wenn ich mit getScale die Größe auslesen will.

Danke im Vorraus


----------



## Marco13 (15. Mrz 2008)

```
double currentScale 1.0f;
TransformGroup tg = null;
public BranchGroup Würfel(String SeiteA)
{
      BranchGroup Eltern = new BranchGroup();
      tg = new TransformGroup(); 
...

public Transform3D Skalieren(double scale)
{
    currentScale = scale;
    Transform3D t3d = new Transform3D(); 


In actionPerformed
    if(e.getSource()==butt)
    {
        tg.setTransform(Skalieren(currentScale + 0.1));
    }
```
so in etwa...

Variablennamen schreibt man klein, butt, butto und button sind bull, bullsh, bullshit-Namen.


----------



## kimwanglee (17. Mrz 2008)

danke für den Tipp 

das mit dem Auslesen funkt. und der Würfel wird skaliert, aber wenn ich ihn rotiere und dann wieder skalieren will geht der Würfel in Ausgangsposition zurück, das heißt die Vorderseite wird gezeigt

falls jemand weis wie ich das verhindern kann bitte melden


----------



## 0x7F800000 (17. Mrz 2008)

naja, wenn du sowas in dem actionListener stehen hast, wird ja die transformation auf die skalierung alleine zurückgesetzt.

Wenn du es gedreht und skaliert haben willst, musst du die beiden transformationen halt verknüpfen erst erst danach weitertransformieren...


----------



## kimwanglee (28. Mrz 2008)

wie soll das mit der Verknüpfung funktionieren?????habe keinen blassen Schimmer wie das gehen soll.... :?


----------



## Marco13 (29. Mrz 2008)

Eigentlich "nur" die zwei TransformGroups hintereinanderhängen. Dieses MouseRotate müßte ich mir normal ansehen... (ewig nichtsmehr mit J3D gemacht).... aber eigentlich müßt's sowas schon tun:

```
TransformGroup tg = new TransformGroup();
TransformGroup skalierung = new TransformGroup();

public BranchGroup Würfel(String SeiteA){
....
 skalierung.addChild(box)
 tg.addChild( skalierung ); 
}

// Analog zum letzten Codestück:
In actionPerformed
    if(e.getSource()==butt)
    {
        skalierung.setTransform(Skalieren(currentScale + 0.1)); // hier wurde 'tg' durch 'skalierung' ersetzt
    }
```


----------



## kimwanglee (11. Apr 2008)

hab alles gemacht wie ihr das gesagt habt und es funktioniert auch so wie ich es wollte 

bedanke mich noch mal bei allen die mir geholfen haben

mfg kimwanglee


----------



## kimwanglee (11. Apr 2008)

sorry das ich den Beitrag nicht abgehackt hab, aber ich finde den Hacken nicht


----------

