# Probleme bei Rotation



## HaukederAnfänger (26. Jul 2007)

Der Würfel dreht sich ned 


```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.Timer;

public class CubeRot extends Applet
{
private SimpleUniverse u=null;

public CubeRot()
{
}

public BranchGroup createSceneGraph()
{
	BranchGroup RootBG = new BranchGroup();
	//Brachgroup wird angelegt
	
	
	
	int ActAngle = 1;
	if (ActAngle>=360) ActAngle-=360;
	
	
	TransformGroup CubeTG = new TransformGroup();
	Transform3D CubeT3D = new Transform3D();
	//Würfel + Transformation
	Transform3D Rotate = new Transform3D();
	
	CubeT3D.setRotation(new AxisAngle4f(1f,0f,1f,(float)Math.toRadians(45)));
	//Rotation bestimmt, WInkel wird in Rad umgerechnet
	Rotate.rotY(Math.toRadians(ActAngle));
	
	CubeT3D.setScale(0.1);
	//Skaliert die Transform3D, Methode nur in TG - nicht BG!
	
	CubeT3D.mul(Rotate);
	CubeTG.setTransform(CubeT3D);
	//Cube wird Rot von Cube3D zugeordnet
	
	CubeTG.addChild(new ColorCube(0.4));
	//Würfel wird als Objekt gewählt
	RootBG.addChild(CubeTG);
	//Würfel wird BG zugeordnet
	RootBG.compile();
	
	
	return RootBG;
	}


public void init()
{
setLayout(new BorderLayout());
GraphicsConfiguration config= SimpleUniverse.getPreferredConfiguration();

Canvas3D c=new Canvas3D(config);
add("Center",c);
u=new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(createSceneGraph());

}

public void destroy()
{
u.cleanup();
}

public static void main(String[] args)
{
new MainFrame(new CubeRot(), 400, 600);
}
}
```


----------



## HaukederAnfänger (26. Jul 2007)

Classe wurde in CubeRot2 umbenannt..hier nur vergessen ..


----------



## der JoJo (26. Jul 2007)

äh, du initialisierts die variable actAngel bei jedem Aufruf neu...
das hat zur folge das die immer 1 ist.

du must die Variable auslagern da mit das geht und dann nur einmal am anfang setzten.

dann bei jedem Schleifenaufruf die Variable erhöhen


----------



## HaukederAnfänger (26. Jul 2007)

Wie schreibe ich das dann genau um?  

Setze ich dann in main AA auf 1,

verstehe auch leider nicht genaus was die anweisung "if (AA>=360) AA-=360;" mein...also, wenn AA größer = 360 ist, dann soll dekrementiert werden bis 360?


----------



## der JoJo (26. Jul 2007)

also:


```
public class CubeRot extends Applet
{
...
private SimpleUniverse u=null;

//hier muss die hin!
int actAngel=1;

public CubeRot()
{
}
...
```

und dann musst du in der 

```
public BranchGroup createSceneGraph()
{
...
   BranchGroup RootBG = new BranchGroup();
   //Brachgroup wird angelegt
   
   //das hier einfügen
   actAngel++
...
}
```

die anweisung

```
if (ActAngle>=360) ActAngle-=360;
```
sorgt nur dafür, das er wert von actAngel nie größer als 360 wird.

#edit:
streng dich mal ein bischen selber an, da hättest du auch drauf kommen können, vor allem wenn du dich schohn mit so dingen wie 3D programmierung beschäftigst


----------



## HaukederAnfänger (26. Jul 2007)

ich streng mich schon an, aber ich bin leicht verunsichert, wenn im skript dies so beschrieben ist und dennoch nicht funktioniert


----------



## HaukederAnfänger (26. Jul 2007)

also...es dreht sich immer noch nichts...deine anweisungen übernommen 

Vllt ne dumme Frage...woher weiß CubeRot(), dass es immer weiter inkrementieren soll? Fehlt da keine while oder for?

Sorry für meine vllt dummen Fragen, aber ich hab nur noch Quelltext-Wirrwarr im Kopf


```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.Timer;

public class CubeRot extends Applet
{
private SimpleUniverse u=null;
int ActAngle = 1;

public CubeRot()
{
}

public BranchGroup createSceneGraph()
{
   BranchGroup RootBG = new BranchGroup();
   //Brachgroup wird angelegt
   
   
   ActAngle++;
   
   TransformGroup CubeTG = new TransformGroup();
   Transform3D CubeT3D = new Transform3D();
   //Würfel + Transformation
   Transform3D Rotate = new Transform3D();
   
   CubeT3D.setRotation(new AxisAngle4f(1f,0f,1f,(float)Math.toRadians(45)));
   //Rotation bestimmt, WInkel wird in Rad umgerechnet
   Rotate.rotY(Math.toRadians(ActAngle));
   
   CubeT3D.setScale(0.1);
   //Skaliert die Transform3D, Methode nur in TG - nicht BG!
   
   CubeT3D.mul(Rotate);
   CubeTG.setTransform(CubeT3D);
   //Cube wird Rot von Cube3D zugeordnet
   
   CubeTG.addChild(new ColorCube(0.4));
   //Würfel wird als Objekt gewählt
   RootBG.addChild(CubeTG);
   //Würfel wird BG zugeordnet
   RootBG.compile();
   
   
   return RootBG;
   }


public void init()
{
setLayout(new BorderLayout());
GraphicsConfiguration config= SimpleUniverse.getPreferredConfiguration();

Canvas3D c=new Canvas3D(config);
add("Center",c);
u=new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(createSceneGraph());

}

public void destroy()
{
u.cleanup();
}

public static void main(String[] args)
{
new MainFrame(new CubeRot(), 400, 600);
}
}
```


----------



## der JoJo (26. Jul 2007)

hm, hab keine Ahnung von Java3D ich arbeite sonnst nur mit OpenGL.
die Methode createSceneGraph, wird die in jedem Frame aufgerufen oder nur einmal am anfang.

weil wenn die nur einmal am anfang läuft, dann wahr meine Hilfe natürlich sinnlos.

du musst mal schauen ob es eine Funktion giebt, die bei jedem zeichenvorgang aufgerufen wird, und dort dann die Variable erhöhen


----------



## merlin2 (26. Jul 2007)

Gewöhnlich verwendet man dafür Behaviors/Interpolatoren (theoretisch wären auch Threads möglich, aber das ist bei Java3D unüblich).
_createSceneGraph()_ wird nur einmal (und manuell) aufgerufen, da sie ein BranchGroup-Objekt zurückgibt.


----------



## Seppel (29. Jul 2007)

Ich versuche so etwas auch aber in 2D 
vieleicht kann sich nichts drehen weil die Punkte von deinem Würfel falsch berechnet werden. oder hast du ein Bild?
versteh den Quelltext nicht. Slater B  wird dir bestimmt helfen. 
Mir hat er bis jetzt immer geholfen. Meist gab er aber auch mehrwürdige antworten.


----------

