Reihenfolge von Transforamtionen

Status
Nicht offen für weitere Antworten.
H

h0b0

Gast
Ich komme aus der OpenGL-Welt und hoffte, mit folgendem Code, der den Scenegraph zusammensetzt, eine Erde zu erhalten, die eine Sonne umkreist. Jedoch kreist die Erde nicht, sondern rotiert um ihre eigene Achse. Was habe ich falsch gemacht? Nach meiner OpenGL-Logik würde ich erwarten, dass erst die Rotation und dann die Translation ausgeführt wird, was ganz offensichtlich nicht der Fall ist.

Code:
	public BranchGroup createSceneGraph(){
		BranchGroup objRoot = new BranchGroup();
		TransformGroup tilt = new TransformGroup();
		Transform3D tiltView = new Transform3D();
		Transform3D rotE1 = new Transform3D();
		Transform3D rotE2 = new Transform3D();
		Transform3D transEarth = new Transform3D();
		ColorCube sun = new ColorCube(0.4);
		ColorCube earth = new ColorCube(dia/4);
		TransformGroup rotEarth1 = new TransformGroup();		
		TransformGroup rotEarth2 = new TransformGroup();
		TransformGroup trans = new TransformGroup();
		
	
		tiltView.rotX(tiltAngle);
		tilt.setTransform(tiltView);
		transEarth.set(new Vector3d(0, 1, 0));
		trans.setTransform(transEarth);
		rotEarth1.setTransform(rotE1);
		rotEarth1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		rotEarth2.setTransform(rotE2);
		rotEarth2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		RotationInterpolator interpolator = new RotationInterpolator(new Alpha(-1, 4000), rotEarth1);
		interpolator.setSchedulingBounds(new BoundingSphere());
		
//Liegt der Hund hier begraben?
		objRoot.addChild(tilt);
		tilt.addChild(sun);
		tilt.addChild(rotEarth1);
		rotEarth1.addChild(interpolator);
		rotEarth1.addChild(trans);
		trans.addChild(earth);
		
		return objRoot;
	}
 
G

Guest

Gast
Das sollte gehen:
Code:
package j3dTutorial;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
//import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Sonnensystem extends Applet {
	
	private double dia = 0.2;
	private double tiltAngle = Math.PI/4;

	public Sonnensystem(){
		setLayout(new BorderLayout());
		Canvas3D canvas3D = new Canvas3D(null);	//1.
		add("Center", canvas3D);
		
		BranchGroup scene = createSceneGraph();	//3.
		scene.compile();	//4.
		
		SimpleUniverse simpleU = new SimpleUniverse(canvas3D);	//2.
		simpleU.getViewingPlatform().setNominalViewingTransform();
		simpleU.addBranchGraph(scene);	//5.
	}
	
	public BranchGroup createSceneGraph(){
		BranchGroup objRoot = new BranchGroup();
		TransformGroup tilt = new TransformGroup();
		Transform3D tiltView = new Transform3D();
		Transform3D rotE1 = new Transform3D();
		Transform3D rotE2 = new Transform3D();
		Transform3D transEarth = new Transform3D();
		ColorCube sun = new ColorCube(0.4);
		ColorCube earth = new ColorCube(dia/4);
		TransformGroup rotEarth1 = new TransformGroup();		
		TransformGroup rotEarth2 = new TransformGroup();
		TransformGroup trans = new TransformGroup();
		
	
		tiltView.rotX(tiltAngle);
		tilt.setTransform(tiltView);
		transEarth.set(new Vector3d(0, 1, 0));
		trans.setTransform(transEarth);
		rotEarth1.setTransform(rotE1);
		rotEarth1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		rotEarth2.setTransform(rotE2);
		rotEarth2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		RotationInterpolator interpolator = new RotationInterpolator(new Alpha(-1, 4000), rotEarth1);
		interpolator.setSchedulingBounds(new BoundingSphere());
		
		objRoot.addChild(tilt);
		tilt.addChild(sun);
		tilt.addChild(rotEarth1);
		rotEarth1.addChild(interpolator);
		rotEarth1.addChild(trans);
		trans.addChild(earth);
		
		return objRoot;
	}

	public static void main(String args[]){
		Frame frame = new MainFrame(new Sonnensystem(), 256, 256);
	}
}
 

Marco13

Top Contributor
Hm... wie auch (indirekt) bei OpenGL ist der Code "rückwärts" zu lesen (du weißt sicher, was ich meine)

objRoot.addChild(tilt);
tilt.addChild(sun);
tilt.addChild(rotEarth1); 2.: Um die y-Achse drehen
rotEarth1.addChild(interpolator);
rotEarth1.addChild(trans); 1.: In y-Richtung verschieben
trans.addChild(earth);

Hier ist allerdings egal, ob man erst verschiebt und dann dreht, oder umgekehrt. Wenn es in beiden Fällen um die y-Achse geht, ist das egal. (*grübel* - ja, müßte egal sein).

Wenn du z.B.
transEarth.set(new Vector3d(1, 0, 0));
machst, dann wird in x-Richtung verschoben, und dann siehst du, dass die Reihenfolge (für das, was du erreichen willst) schonmal richtig ist....
 

h0b0

Mitglied
Verdammt! Weißt du, was mein Problem war? Ich hab das Koordinatensystem gedanklich verdreht und glaubte, die Erde würde sich hinter (statt über) der Sonne befinden. Konnte man perspektivisch auch nicht sehen.
Das wird mir jedenfalls nicht mehr passieren... Danke.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben