# Java3D - Farben vermischen sich



## Java3D_Noob (26. Okt 2012)

Hallo Community ,

Da ich ein ziemlicher Java3D Neuling bin hab ich - wie soll es auch anders sein - ein paar Probleme.
Erstmal mein Quelltext:


```
import javax.media.j3d.*;

import com.sun.j3d.utils.geometry.*;
import javax.vecmath.*;

import com.sun.j3d.utils.universe.SimpleUniverse;


public class Main {
	public static void main(String[] args) {
		SimpleUniverse univ = new SimpleUniverse ( );
		univ.getViewingPlatform( ) .setNominalViewingTransform( );
		
		BranchGroup szene = new BranchGroup ( );
	
	{
		Box boden = new Box(1, 0.1f, 1, ColoringAtributes() );
		
		TransformGroup bodenVerschieber = new TransformGroup();
		Transform3D verschieben = new Transform3D();
		verschieben.setTranslation(new Vector3f(0f,-0.5f,0f));
		bodenVerschieber.setTransform(verschieben);
		bodenVerschieber.addChild(boden);
		
		szene.addChild(bodenVerschieber);
		
		Color3f farbeBoden = new Color3f (0.392f, 0.392f, 0.392f);
		BoundingSphere bounds = new BoundingSphere(new Point3d (0,0,0),10000000);
		Vector3f richtungBoden = new Vector3f(5,-6,-10);
		DirectionalLight lichtBoden = new DirectionalLight (farbeBoden, richtungBoden );
		lichtBoden.setInfluencingBounds (bounds);
		szene.addChild(lichtBoden);
		
		
	}
	
	{
		Sphere sonne = new Sphere(0.15f,1,40);
		
		TransformGroup sonnenVerschieber = new TransformGroup();
		Transform3D verschieben = new Transform3D();
		verschieben.setTranslation(new Vector3f(-0.75f, 0.45f, 0f));
		sonnenVerschieber.setTransform(verschieben);
		sonnenVerschieber.addChild(sonne);
		
		szene.addChild(sonnenVerschieber);
		
		Color3f farbeSonne = new Color3f (1,1,0);
		BoundingSphere bounds = new BoundingSphere(new Point3d (0,0,0), 1000000);
		Vector3f richtungSonne = new Vector3f(5,-6,-10);
		DirectionalLight lichtSonne = new DirectionalLight (farbeSonne, richtungSonne);
		lichtSonne.setInfluencingBounds (bounds);
		szene.addChild(lichtSonne);
		
	}
		
		szene.compile();
		
		univ.addBranchGraph(szene);

	}

	private static Appearance ColoringAtributes() {
		return null;
	}


	

	

}
```

Ich wollte sozusagen eine "Landschaft" programieren, sprich Sonne, Boden, Baum, Haus. Das sollte erstmal reichen. 

So den Boden hab ich normal hinbekommen. Wie ich dann an die Sonne gegangen bin hab ich natürlich als Farbe ein schönes Gelb (1,1,0) ausgesucht. Wie ich dann fertig war, haben sich aber das grau aus meinem Boden mit dem Gelb der Sonne vermischt. 

Jetzt meine Frage: Wieso vermischen sich die Beiden Farben miteinander und wie kann ich das ändern?
                          Ich hab schon extra die beiden Objekte mit { } abgegrenzt aber es klappt trotzdem
                          nicht. 


Vielen Dank im voraus und liebe Grüße


----------



## D4rkscr43m (26. Okt 2012)

Die Farben "vermischen" sich vermutlich einfach, weil es die Java3D Engine so vorsieht. Deswegen ist für Licht in der Regel kein "knallgelb" sondern ein schwaches Gelb (ich weiß nicht genau, aber evtl erreicht man das z.B. über 
	
	
	
	





```
new Color3f (0.1,0.1,0)
```
) gewünscht.


----------



## Java3D_Noob (26. Okt 2012)

Erstmal Danke für die Antwort!  
Aber ich kann dir irgendwie nicht folgen xD 
Ich will, dass die Box ( also der Boden ) am Ende grau ist und die Sphere ( also die Sonne ) am Ende gelb ist.
Der Boden hat jetzt ja aber auch gelb als Farbe


----------



## Marco13 (26. Okt 2012)

Du hast zwei Lichter erstellt (warum ist mir auch nicht ganz klar). Aber das Licht der Sonne ist gelb. In gelbem Licht sehen weiße/graue Dinge eben gelb aus, das ist in der Natur wie in Java3D. Das Licht der Sonne ist aber nicht Gelb, sondern eher das, was wir als "Weiß" wahrnehmen. Das Sonnenlicht sollte also eher als
DirectionalLight lichtSonne = new DirectionalLight (new Color3f(1,1,1), richtungSonne);
erstellt werden.

Damit die Sonne (also die Kugel selbst) trotzdem Gelb aussieht, muss sie gelb sein. Dazu muss man ihr mit
sonne = new Sphere(radius, appearance);
eine Appearance geben.

Allgemeiner Tipp: Auf 3DJava gibt's hunderte (!) von direkt compilierbaren Beispielen zu Java3D, zu allen Möglichen Themen. Aber pssst, ist ein Geheimtipp, damit versuche ich seit Jahren, hier im Forum den Eindruck zu erwecken, ich hätte Ahnung von Java3D


----------



## Java3D_Noob (26. Okt 2012)

Ach soo!!!! Ich bin ja dumm  
VIELEN DANK!

Habs jetzt hingekriegt, hab jetzt aber ein anderes Problem,
erstmal der Quelltext:
[Java]
Box haus = new Box(0.3f,0.2f,0.2f, farbeHaus());

			TransformGroup hausVerschieber = new TransformGroup();
			Transform3D verschieben = new Transform3D();
			verschieben.setTranslation(new Vector3f(0.3f,-0.3f,0f));
			hausVerschieber.setTransform(verschieben);
			hausVerschieber.addChild(haus);

			TransformGroup hausDreher = new TransformGroup();
			Transform3D drehen = new Transform3D();
			drehen.rotX(0.1f);
			drehen.rotY(0);
			drehen.rotZ(0);
			hausDreher.addChild(hausVerschieber);

			szene.addChild(hausDreher);
[/Java]

Ich wollte die Box "haus" verschieben, was alleine geklappt hat. Aber dann wollte ich es noch drehen, aber das geht irgendwie nicht. Wenn ich verschieben raus tu und drehen alleine, dann geht das drehen.

Nun meine Frage: Wie kann ich beide TransformGroups zum laufen bringen? Alleine gehen sie ja (hausDreher hat dann halt [Java]hausDreher.addChild(haus)[/Java] 

Liebe Grüße


----------



## Marco13 (27. Okt 2012)

Was heißt "nicht gehen"?  (Beachte ggf. dass rotX/rotY/rotZ in dieser Form die Drehungen nicht "nacheinander ausführen", sondern jeweils die entsprechende Rotation _setzen_ - hier also zuletzt "um 0 Grad um die Z-Achse", da sieht man natürlich nichts. Um die zu kombinieren muss man mehrere Transform3Ds (oder besser Matrix4f's) miteinander multiplizieren.


----------



## Java3D_Noob (27. Okt 2012)

*Edit:*
Ich habs hingekriegt!!! jeah!! Mithilfe vondiesem Link!! 
Trotzdem nochmal 1000 Dank ohne dein miteinander multiplizieren wäre ich da NIE draufgekommen!!!
VIELEN VIELEN DANK! 





Marco13 hat gesagt.:


> Was heißt "nicht gehen"?



Nicht gehen heißt, dass die aktionen von "hausDreher" einfach nicht ausgeführt werden. Das Objekt "haus" wird von "hausVerschieber" ganz brav verschoben, aber es wird von "hausDreher" einfach nicht gedreht  

Transform3D's miteinander multiplizieren? Sorry ich kenn mich echt nicht so aus, wie müsste ich das insgesamt schreiben, dass *beide* Aktionen (das haus verschieben *und* drehen) ausgeführt werden? Jetzt wird das Drehen ja sozusagen einfach ignoriert


----------



## Marco13 (27. Okt 2012)

Ja, ggf. solltest du dir mal sowas wie Java 3D API - Scene Graph Overview ansehen (oder ähnliche Dokumente, das ist keine direkte Empfehlung sondern nur das erste Suchergebnis  )

Wenn man eine bestimmte Abfolge von Transformationen IMMER (und "fest") vorgeben will, kann/sollte man die beschreiben, indem man Matrix4f-Objekte miteinander multipliziert. 


```
Matrix4f rotation = new Matrix4f();
rotation.setIdentity();
rotation.rotX(angle);

Matrix4f translation = new Matrix4f();
translation.setIdentity();
translation.setTranslation(vector);

Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
matrix.mul(translation);                                 ... und dann verschoben
matrix.mul(rotation);    // Das objekt wird erst gedreht

Transform3D transform = new Transform3D(matrix);
```

Es macht i.a. keinen Sinn, für mehrere, fest vorgegebene Transformationen einen rieseigen Szenegraph aus vielen TransformGrpups aufzubauen. ABER: Wenn man die Transformationen noch nachträglich ändern will (also wenn man z.B. die Rotation unabhängig von der Translation ändern will) muss/sollte man dafür schon einzelne Knoten erstellen.


----------

