# Problem mit Rotation (Sprite3D)



## jagdfalke (8. Jun 2006)

Hi,
ich versuche mir gerade einen Sprite3D zusammenzubauen, aber die Rotation funktioniert nicht. 
Hier der Code:

```
package tour3D;

import javax.vecmath.*;
import javax.media.j3d.*;

public class Sprite3D {

	private Shape3D shape;
	private TransformGroup moveTG, rotateTG;
	
	public Sprite3D(Shape3D shape) {
		this.shape = shape;
		moveTG = new TransformGroup();
		rotateTG = new TransformGroup();
		moveTG.addChild(rotateTG);
		rotateTG.addChild(shape);
	}
	
	public TransformGroup getTransformGroup() {
		return moveTG;
	}
	
	public void move(Vector3f move) {
		Transform3D newT3D = new Transform3D();
		newT3D.setTranslation(move);
		
		Transform3D t3D = new Transform3D();
		moveTG.getTransform(t3D);
		t3D.mul(newT3D);
		
		moveTG.setTransform(t3D);
	}
	
	public void rotate(int axis, int change) {
		Transform3D t3d = new Transform3D();
		rotateTG.getTransform(t3d);
		
		Transform3D rotT3D = new Transform3D();
		switch(axis) {
			case 0: rotT3D.rotX(Math.toRadians(change));
			case 1: rotT3D.rotY(Math.toRadians(change));
			case 2: rotT3D.rotZ(Math.toRadians(change));
		}
		
		t3d.mul(rotT3D);
		rotateTG.setTransform(t3d);
	}
	
}
```

Bin für jede Hilfe dankbar!

mfg
jagdfalke


----------



## Illuvatar (8. Jun 2006)

a) Für 0 - 2 solltest du besser Konstanten definieren 
b) Schonmal probiert, das rot[X/Y/Z] direkt auf die rotateTG aufzurufen?


----------



## jagdfalke (9. Jun 2006)

a) ja das ist wohl besser
b) meinst du so?

```
public void rotate(int axis, int change) {
		Transform3D t3d = new Transform3D();
		rotateTG.getTransform(t3d);
		if(axis == 0) { t3d.setRotation(new AxisAngle4f(1f,0f,0f, (float)Math.toRadians(change))); }
		if(axis == 1) { t3d.setRotation(new AxisAngle4f(0f,1f,0f, (float)Math.toRadians(change))); }
		if(axis == 2) { t3d.setRotation(new AxisAngle4f(0f,0f,1f, (float)Math.toRadians(change))); }
		rotateTG.setTransform(t3d);
	}
```

Aber so ist irgendwie blöd, weil ich dann nur entweder um x um y oder um z rotieren kann und nicht z.B. 20° um x und 45° um y oder so.

mfg
jagdfalke


----------



## Illuvatar (9. Jun 2006)

???:L ich meinte eher so:


```
Transform3D t3d = new Transform3D(); 
      rotateTG.getTransform(t3d); 
      switch(axis) { 
         case 0: t3d.rotX(Math.toRadians(change)); 
         case 1: t3d.rotY(Math.toRadians(change)); 
         case 2: t3d.rotZ(Math.toRadians(change)); 
      }
      rotateTG.setTransform(t3d);
```


----------



## jagdfalke (11. Jun 2006)

Hmm, jetzt klappt komischerweise. Ich weiß nicht genau was jetzt anders sein soll, aber ok.

```
package tour3D;

import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;

public class Sprite3D {

	public static final int AXIS_X = 0;
	public static final int AXIS_Y = 1;
	public static final int AXIS_Z = 2;
	
	private TransformGroup objectTG;    			
	private Transform3D t3d, toMove, toRot;    	    
	private Switch visSwitch;   

	public Sprite3D(String model) {
	    visSwitch = new Switch();
	    visSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
	    visSwitch.addChild( loadModel(model) );        
	    visSwitch.setWhichChild( Switch.CHILD_ALL );   
	    
	    objectTG = new TransformGroup();
	    objectTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
	    objectTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	    objectTG.addChild( visSwitch );
	    
	    t3d = new Transform3D();
	    toMove = new Transform3D();
	    toRot = new Transform3D();
	}
	
	public TransformGroup getTG() {
		return objectTG;
	}
	
	public void setActive(boolean active) {
		if(active) {
			visSwitch.setWhichChild(Switch.CHILD_ALL);
		} else {
			visSwitch.setWhichChild(Switch.CHILD_NONE);
		}
	}
	
	public void doMove(Vector3d theMove) {
	    objectTG.getTransform( t3d );
	    toMove.setTranslation(theMove);   
	    t3d.mul(toMove);
	    objectTG.setTransform(t3d);
	  } 
	
	public void doRotate(int axis, double radians) {
	    objectTG.getTransform( t3d );
	    if(axis == AXIS_X) {
	    	toRot.rotX(radians);
	    } else if(axis == AXIS_Y) {
	    	toRot.rotY(radians);
	    } else if(axis == AXIS_Z) {
	    	toRot.rotZ(radians);
	    }
	    t3d.mul(toRot);
	    objectTG.setTransform(t3d);
	}
	
	private Node loadModel(String path) {
		ObjectFile objLoader = new ObjectFile(ObjectFile.RESIZE);
		Scene scene = null;
		try {
			scene = objLoader.load(path);
		} catch(Exception e) {
			System.err.print(e);
			return null;
		}
		BranchGroup bg = scene.getSceneGroup();
		return bg;
	}
	
}
```

Danke, die nächste Frage kommt sofort aber nicht in diesem Thread 

mfg
jagdfalke


----------

