# Thread in Java3D



## Developer_X (29. Mrz 2009)

Hi, ich habe mich mal an meinen ersten Thread in Java3D gewagt, da die Threads meiner Meinung nach eigentlich ziemlich praktisch sind, 
ich will mit meinem Thread die x coordinate eines Transform3D's immer um eins erhöhen, nach einem zehntel einer sekunde,
außerdem habe ich die System.out.println-Methode in den Thread eingebaut, um immer die aktuelle Position der x coordinate zu bekommen, aber sie bewegt sich trotzdem nicht wieso?

```
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

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

public class Trailer_3 extends JFrame
{
    float pos = 1;
	SimpleUniverse u;
	  public Trailer_3()
	  {
		  Toolkit tk = Toolkit.getDefaultToolkit();
		    final Dimension d = tk.getScreenSize();		 	
		    
		    setSize(d);
		    setTitle("R.a.t.r.o.t.c.p.");
		 
		    setUndecorated(true);
		    
		    setVisible(true);
		    setLayout(null);
		    
		     GraphicsConfiguration config1 = SimpleUniverse.getPreferredConfiguration();
		     Canvas3D canvas1 = new Canvas3D(config1);
		  	 canvas1.setBounds(0,0,d.width,d.height);
		  	 u = new SimpleUniverse(canvas1);
		  	 u.addBranchGraph(createSceneGraph1());
		  	 add(canvas1);
	  }
	  
	  public BranchGroup createSceneGraph1()
	     {
	     BranchGroup          BG = new BranchGroup();
	    ///Lights
	     //1
	     AmbientLight         L1 =new AmbientLight(new Color3f(0.8f,0.8f,0.8f));
	     Point3d p1 = new Point3d(0,0,0);	     
	     BoundingSphere       LB1 =new BoundingSphere(p1,100000);
	     L1.setInfluencingBounds(LB1); BG.addChild(L1);
	    
	    ///Real World
	     Transform3D a = new Transform3D();
	     a.setTranslation(new Vector3d(0,0,0));
	     TransformGroup A = new TransformGroup();
	     A.setTransform(a);BG.addChild(A); A.addChild(new Box(20,0,0, null));
	     
//////////
[highlight]
	     //View Initialisation
	     TransformGroup ViewTG = new TransformGroup();
	     ViewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	     final Transform3D ViewT3D = new Transform3D();
	     ViewTG=u.getViewingPlatform().getViewPlatformTransform();
	     ViewTG.getTransform(ViewT3D);
	     final Vector3f vct = new Vector3f(pos,0,0);
	     ViewT3D.setTranslation(vct);
	     ViewTG.setTransform(ViewT3D);
	     
(new Thread(){@Override public void run(){while(!isInterrupted()){       
	   				pos = pos + 1;
	   				System.out.println(vct.getX());
try{sleep(100);}catch(InterruptedException e){interrupt();}}}}).start();
	[/highlight]		
//////////	     
	     BG.compile();
	     return BG;
	     }
	  public static void main(String[]args)
	  {
		  new Trailer_3();
	  }
	public static void warte(long millis){try{Thread.sleep(millis);}catch(InterruptedException e){}}
}
```
@ADMIN:
ich hab diesmal wieder den Code genutzt, um mit highlight die TextStellen rot zu färben


----------



## FatFire (29. Mrz 2009)

Weil einfache Variablen immer als Wert und nicht als Referenz übergeben werden. Daher muss das nach einer Änderung von pos auch neu zugeteilt werden.
[HIGHLIGHT="Java"]pos = pos + 1;
	   				vct.setX(pos);
	   				System.out.println(vct.getX());[/HIGHLIGHT]

Ach, Developer_X: Mal abgesehen davon, dass Du sowas eigentlich nach über 300 Beiträgen in einem Java-Forum wirklich wissen solltest...Du hast auch einen übelst besch...eidenen Programmierstil, da kann einem ja echt die Galle hochkommen:
[HIGHLIGHT="Java"]try{sleep(100);}catch(InterruptedException e){interrupt();}}}}).start();[/HIGHLIGHT]
Du kannst mir nicht ernsthaft weismachen, dass Du mit Deinen Programmierkenntnissen auf einen schnellen Blick hin weißt, was Du in der Zeile zusammengeköttelt hast.
Und gewöhn Dir endlich mal KSKB für Deine Miniproblemchen an.


----------



## Illuvatar (29. Mrz 2009)

> ```
> A.addChild(new Box(20,0,0, null));
> ```



Warum machst du einen Quader, der in 2 Dimensionen keine Ausdehnung hat? 0o


----------



## hdi (29. Mrz 2009)

Developer,

Threads sind eine heftige Sache. Ich sehe es schon kommen, wir werden dir demnächst
dein Programm debuggen müssen weil du Race Conditions reinprügelst.
Du bist nicht bereit für Threading, ob du's glaubst oder nicht.

Wenn du aber die Basics weiterhin skippen willst, und gleich zu Threads übergehen willst,
dann behandele das Thema aber wenigstens vollständig. -> Java-Insel zB

Du musst wissen:
- Warum beendet man Threads nicht mit interrupt() (wie du es tust)
- Was sind Race Conditions
- Was ist Synchronisation
- Was sind Deadlocks
- die Object-Methoden wait()/notify[All]()

Mach dir ein TestProjekt und spiel erstmal mit Threads rum. Ich weiss nicht inwiefern
Java3D eine Art EDT nutzt, das wäre dann in deinem Fall nochmal n spezielles Thema.
Aber vllt verträgt sich das ja, ich kenn mich mit Java3D nicht aus
(weil ich seit 2 Jahren täglich Neues über Java lerne, und weiss, dass ich noch nicht bereit
bin für irgendwelche Frameworks wie Java3D, solange ich noch nicht die Basics zu 1000% drinnen hab!)

edit: Sagen wir mal so, was heisst schon "bereit"? Aber es gibt wichtigeres, wie die SE eben.

Viel Spaß dabei


----------



## Marco13 (29. Mrz 2009)

FatFire's erster Hinweis war schon richtig, allerdings reicht es meines wissens auch nicht, das im Vector3f neu zu setzen. Statt des

pos = pos+1;

wäre wohl mindestens ein

Vector3f vct = new Vector3f(pos,0,0);
ViewT3D.setTranslation(vct);

notwendig, wenn mich nicht alles täuscht sogar ein

Transform3D ViewT3D = new Transform3D();
Vector3f vct = new Vector3f(pos,0,0);
ViewT3D.setTranslation(vct);
ViewTG.setTransform(ViewT3D);


Vielleicht sollte man noch erwähnen, dass sein ZWEITER Hinweis, und der von hdi, auch richtig waren....


----------



## Illuvatar (29. Mrz 2009)

Marco13 hat gesagt.:


> Vielleicht sollte man noch erwähnen, dass sein ZWEITER Hinweis, und der von hdi, auch richtig waren....



Und meiner? *snüff*

...

 :bae:


----------



## Developer_X (29. Mrz 2009)

Illuvatar hat gesagt.:


> Warum machst du einen Quader, der in 2 Dimensionen keine Ausdehnung hat? 0o



das war nur schnell getippt, als beispiel,
PS:
Danke das hat funktioniert, dass ich in den Thread immer noch schreiben muss, dass du weißt schon translantiert wird


----------



## Marco13 (29. Mrz 2009)

Das war je kein Hinweis, sondern eine Frage  (Und eine quasi-rethorische noch dazu - "Wie soll ich denn sonst eine Ebene hinkriegen? ;( "


----------



## FatFire (29. Mrz 2009)

> FatFire's erster Hinweis war schon richtig, allerdings reicht es meines wissens auch nicht, das im Vector3f neu zu setzen.


Hm, joh, kann sein.
Ich mach meinen 3D-Kram normal mit JOGL, daher ist das mit dem Java3D bei mir nicht so dolle. War mir nicht sicher, wenn die Sachen erstmal in dem Baum drin sind (keine Ahnung wie das bei Java3D heißt), ob so kleine Änderungen dann ausreichen um dargestellt zu werden oder ob dann wirklich alles neu gebunden werden muss.
Ich oute mich auch gerne als recht faul, wenn es um die Antwortvorbereitungen bei seinen Threads geht, er gibt sich ja auch keine Mühe.

Gruß FatFire


----------

