# Java3D float setzten, per TextField, und aktualisieren



## Developer_X (19. Feb 2009)

Hi, ich möchte in ein Textfield die größe eines Floats eingeben, und den Float als größe einer Figur verwenden, also bitte wie kann ich das machen?
Irgendwie funktioniert das ganze nicht
Wenn ihr mir bitte bei dem float "headsize" helfen könntet, den rest kann ich dann selber machen, danke schon mal im Voraus Developer_X!


```
public class Rayman_Maker extends JFrame 
{	
	URL url = null;
	AudioClip clip; 
	
	private String DateiTypS;
	private String DateiT;
	
	JMenu help = new JMenu("Hilfe");
	
	static int outFileSeq = 0;
	static String outFileBase = "ScreenShot";
	static NumberFormat nf = NumberFormat.getInstance();
	
	private Color backcolor = Color.cyan;
	private Color forecolor = Color.blue;
////////////////Head/////////////////
	private float hx,hy,hz=0;
	private Transform3D head;
	private TransformGroup Head;
	
	private float headsize=1;

	private float rhx,rhy,rhz;
	private Transform3D rh1;
	private Transform3D rh2;
	private Transform3D rh3;
	private TransformGroup Rh1;
	private TransformGroup Rh2;
	private TransformGroup Rh3;

//////////////////////////////////////////////////////////////////////////////////////
	public Rayman_Maker()
	{
		 Toolkit tk = Toolkit.getDefaultToolkit();
		 final Dimension d = tk.getScreenSize();
         
		 setSize(d.width,d.height);
         setVisible(true);
         setIconImage(new ImageIcon("F:/Rayman_Maker_1.0/Icon.jpg").getImage());	 
         setLayout(null);
         setVisible(true);
         setResizable(false); 
         setTitle("Rayman_Maker_1.0");        
        
         final JMenuBar menubar = new JMenuBar();
         menubar.setBounds(0,0,1200,20);
         menubar.setBackground(backcolor);
         add(menubar);
         final JMenuBar menubar2 = new JMenuBar();
         menubar2.setBounds(1200,0,1000,20);
         menubar2.setBackground(backcolor);
         add(menubar2);
         
        
///////////////////////////////////////////        
         JButton b = new JButton();
         b.setBackground(backcolor);b.setBounds(1000,70,100,20);add(b);b.setForeground(forecolor); b.setLabel("Head");
         JButton b1 = new JButton();
         b1.setBackground(backcolor);b1.setBounds(1000,90,100,20);add(b1);b1.setForeground(forecolor);b1.setLabel("Kopf-Größe");
         final JTextField b11 = new JTextField();
         b11.setBackground(backcolor);b11.setBounds(1100,90,100,20);add(b11);b11.setForeground(forecolor);
         JButton b111 = new JButton();
         b111.setBackground(backcolor);b111.setBounds(1200,90,200,20);add(b111);b111.setForeground(forecolor);b111.setLabel("Kopf-Größe aktualisieren");
         b111.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) 
         { headsize = Integer.parseInt(b11.getText()); }}); 
      //Translation
         JButton trans = new JButton();
         trans.setBackground(backcolor);trans.setBounds(1000,110,150,20);add(trans);trans.setForeground(forecolor);trans.setLabel("Kopf Position (x,y,z)");     
      //
         final JButton transx = new JButton();
         transx.setBackground(backcolor);transx.setBounds(1150,110,45,20);add(transx);transx.setForeground(forecolor);transx.setLabel("X");       

         final JTextField tae = new JTextField();
         tae.setBackground(backcolor);tae.setBounds(1195,110,25,20);add(tae);tae.setForeground(forecolor);
      // 
         final JButton transy = new JButton();
         transy.setBackground(backcolor);transy.setBounds(1215,110,45,20);add(transy);transy.setForeground(forecolor);transy.setLabel("Y");       

         final JTextField tae1 = new JTextField();
         tae1.setBackground(backcolor);tae1.setBounds(1260,110,25,20);add(tae1);tae1.setForeground(forecolor);
      //  
         final JButton transz = new JButton();
         transz.setBackground(backcolor);transz.setBounds(1285,110,45,20);add(transz);transz.setForeground(forecolor);transz.setLabel("Z");       

         final JTextField tae2 = new JTextField();
         tae2.setBackground(backcolor);tae2.setBounds(1330,110,25,20);add(tae2);tae2.setForeground(forecolor);
       
         JButton po = new JButton("Position aktualisieren");
         add(po); po.setBounds(1000,130,200,20); po.setForeground(forecolor); po.setBackground(backcolor);
         po.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) 
         {hx = Integer.parseInt(transx.getText());hy = Integer.parseInt(transy.getText());hz = Integer.parseInt(transz.getText());head = new Transform3D();Head=new TransformGroup();head.setTranslation(new Vector3f(hx,hy,hz));Head.setTransform(head);}}); 

         BranchGroup scene = createSceneGraph();       
         setLayout(new BorderLayout());
         GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
         Canvas3D canvas = new Canvas3D(config);
         add(canvas); 
         canvas.setBounds(0,90,1000,780);
         SimpleUniverse universe = new SimpleUniverse(canvas);                
         universe.addBranchGraph(scene);     
         Point3d p = new Point3d();
         BoundingSphere bounds = new BoundingSphere(p,10);
         OrbitBehavior orbit = new OrbitBehavior(canvas,
	                OrbitBehavior.REVERSE_ALL|OrbitBehavior.STOP_ZOOM);
	        orbit.setSchedulingBounds(bounds);
	        ViewingPlatform viewingPlatform = universe.getViewingPlatform();
	        viewingPlatform.setNominalViewingTransform();
	        viewingPlatform.setViewPlatformBehavior(orbit);       
	}	 
	  void createStarBackground(BranchGroup bg)
	   {
	   java.util.Random rand = new java.util.Random();
	   float            mag;
	   BranchGroup      BGBranch=new BranchGroup();
	   Background       BG=new Background();

	   PointArray starfield = new PointArray(15000, PointArray.COORDINATES|PointArray.COLOR_3);
	   float[] point = new float[3];
	   float[] brightness = new float[3];
	   for (int i = 0; i < 15000; i++)
	      {
	      point[0] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      point[1] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      point[2] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      starfield.setCoordinate(i, point);
	      mag=(rand.nextFloat()+0.5f)/1.5f;
	      brightness[0]=mag;
	      brightness[1]=mag;
	      brightness[2]=mag;
	      starfield.setColor(i, brightness);
	      }
	   Shape3D StarShape=new Shape3D(starfield);
	   StarShape.setAppearance(new Appearance());
	   StarShape.getAppearance().setPointAttributes(new PointAttributes(1f,true));
	   BGBranch.addChild(StarShape);
	   BG.setGeometry(BGBranch);
	   BG.setApplicationBounds(new BoundingSphere(new Point3d(),10.0));
	   BG.setColor(new Color3f(0,0,0));

       bg.addChild(BG);
	   }
	   public BranchGroup createSceneGraph() 
	   {	       
		     BranchGroup Root = new BranchGroup();
	       
		     createStarBackground(Root);
		     //Head
		     head = new Transform3D();
		     head.setTranslation(new Vector3f(hx,hy,hz));
		     Head = new TransformGroup();
		     Root.addChild(Head);Head.setTransform(head); Head.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		     
		     rh1 = new Transform3D(); rh1.rotX(Math.toRadians(rhx));
		     Rh1 = new TransformGroup(); Head.addChild(Rh1);Rh1.setTransform(rh1);
		     
		     rh2 = new Transform3D(); rh2.rotY(Math.toRadians(rhy));
		     Rh2 = new TransformGroup(); Rh1.addChild(Rh2);Rh2.setTransform(rh2);
		     
		     rh3 = new Transform3D(); rh3.rotZ(Math.toRadians(rhz));
		     Rh3 = new TransformGroup();Rh3.addChild(new Rayman_Head(headsize).getChild()); Rh3.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE|TransformGroup.ALLOW_TRANSFORM_READ|TransformGroup.ALLOW_LOCALE_READ|TransformGroup.ALLOW_LOCAL_TO_VWORLD_READ|TransformGroup.ALLOW_COLLISION_BOUNDS_WRITE|TransformGroup.ALLOW_COLLIDABLE_READ|TransformGroup.ALLOW_BOUNDS_WRITE|TransformGroup.ALLOW_BOUNDS_READ|TransformGroup.ALLOW_AUTO_COMPUTE_BOUNDS_WRITE|TransformGroup.ALLOW_AUTO_COMPUTE_BOUNDS_READ|TransformGroup.ALLOW_TRANSFORM_WRITE|TransformGroup.ALLOW_CHILDREN_READ|TransformGroup.ALLOW_CHILDREN_EXTEND);Rh2.addChild(Rh3);Rh3.setTransform(rh3);		     
		     
		     //Light Definitions
		     Point3d p = new Point3d();
		     BoundingSphere bounds = new BoundingSphere(p, 100);
		     Color3f lightColor = new Color3f(.3f,.3f,.3f);
	         AmbientLight ambientLight= new AmbientLight(lightColor);
	         ambientLight.setInfluencingBounds(bounds);
	         Root.addChild(ambientLight);
	         DirectionalLight directionalLight = new DirectionalLight();
	         directionalLight.setColor(lightColor);
	         directionalLight.setInfluencingBounds(bounds);
	         Root.addChild(directionalLight);     
	         
	         return Root;       
	    }       
public static void main(String[]args){new Rayman_Maker();}
}
```


----------



## Vayu (20. Feb 2009)

ähm?

http://www.java-forum.org.server659-han.de-nserver.de/showthread.php?t=79341


----------



## Developer_X (20. Feb 2009)

Was mach ich falsch, es funzt einfach nicht, wieso?


----------



## Spacerat (20. Feb 2009)

Was irgendwie ebenso nicht funzt, ist die Tatsache, dass du uns hier, da und dort mit ellenlangem Code zubombst, auf unsere Vorschläge dann nicht eingehst, was man widerum daran sieht, das sie in erneut gepostetem Code nicht enthalten sind und dann auch noch erwartest, das man dir hilft. Von den zu setzenden Capabilities, die wir im anderen Thread angesprochen hatten, sehe ich immer noch nichts. Bist du überhaupt mit dem Java3D-Api  vertraut, oder gehörst du zu denjenigen, die sich das lesen eher sparen und stattdessen lieber Forenbeiträge publizieren, die meistens länger ausfallen, als die Abschnitte der API die man besser mal vorher hätte lesen sollen?


----------



## Developer_X (20. Feb 2009)

Mir wurde im anderen Forum nur geraten, dass headsize, irgendetwas ein muss, wie du sehen kannst, ist es "1.0", also warum funktioniert es nicht?


----------



## Spacerat (20. Feb 2009)

Developer_X hat gesagt.:


> Mir wurde im anderen Forum nur geraten, dass headsize, irgendetwas ein muss, wie du sehen kannst, ist es "1.0", also warum funktioniert es nicht?


Das sehe ich anders...
http://www.java-forum.org.server659-han.de-nserver.de/showthread.php?t=79349

@Vayu: Ich glaub' dein Link linkt zum falschen Thread...


----------



## Vayu (20. Feb 2009)

mir gings darum ^^



> ich möchte in ein Textfield die größe eines Floats eingeben, und den Float als größe einer Figur verwenden



und dafür isses der richtige link


----------



## Developer_X (20. Feb 2009)

dann bitte ich euch nochmals drum, sagt mir nur, was ich falsch mache, nicht im code und nicht wo im code, einfach nur was,


----------



## hdi (21. Feb 2009)

> Irgendwie funktioniert das ganze nicht


Naja was soll man dazu gross sagen? *Was* funktioniert nicht?
Per find hab ich jetzt nur gesehen, dass headsize am Anfang 1.0 ist,
beim Klick auf irgendetwas angepasst wird, und dann beim Erstellen
eines Rayman_Head genutzt wird.

Also, was ist denn dein Problem? Gibt es eine Fehlermeldung, oder
passiert einfach nur etwas, was du nicht erwartest, bzw. anders
erwartest?

1.0 scheint mir übrigens ein kleiner Wert zu sein wenn ich an "Rayman_Head"
denke. Soll das der Radius sein? Kann ja sein, dass das einfach mal viel zu klein ist.

PS: Auch auf die Gefahr hin, dass ich dich (mal wieder) langweile:
Was du da produzierst ist von vorne bis hinten Bullshit 
Dein Rayman-Projekt ist mehr als nur dem Untergang geweiht.

Mach doch mal ein Tetris, das ist auch ein tolles Spiel. Da lernst du 
erstmal alles, was du vom Groben her für ein Spiel wissen musst.
Sowas spezielles wie Java3D kannst du dann iiiirgendwann machen.
Aber ich weiss schon: Das kann man dir sagen, sooft man will...
Du glaubst es halt einfach nicht. Naja du merkst ja selber dass die
Hilfsbereitschaft der Leute immer mehr sinkt. Du nimmst die Hilfe
einfach nicht an...


----------



## Developer_X (21. Feb 2009)

ICh habe eine Rayman Figur erstelt, und dieses "headsize" ist der scale dafür.
Die Scale von "Rayman_Head" wird aber nicht verändert, das ist das problem, verstehst du?

Also was mache ich falsch? Die Scale wird einfach nicht verändert


----------



## hdi (21. Feb 2009)

1. Schau ob der ActionListener für den Button mit dem absolut
genialen Namen b111 reagiert (bau ein Sys-out rein).
2. headsize ist ein float, du solltest da nicht mit Integer.parseint() arbeiten.


----------



## Developer_X (21. Feb 2009)

Das mit dem Sys out. funktioniert auch , nur der flaot wird nicht geändet, hättest du ne idee, wie ich anderweitig, ohne parse int, den inhalt des Textfields in mein float bekomme?
Oder bzw. dass es aktualisiert wird, in der 3D DimensionalenWelt


----------



## hdi (21. Feb 2009)

Ich weiss ja nicht was für Werte du da genau eingibst, aber parseInt
schneidet Nachkommastellen ab. Aus 1,6 wird dann 1,0. Aus 1,7 wird 1,0. usw.
Wie ich sagte: Nimm nicht Integer.ParseInt sondern Float.parseFloat


----------



## Illuvatar (21. Feb 2009)

Überleg dir vielleicht am besten mal, wie denn Java3D irgendwas davon mitkriegen soll, dass du deine Variable headsize änderst.

Das, was hdi sagt, ist allerdings außerdem noch richtig.


----------



## Spacerat (21. Feb 2009)

Ok... man hat ja sonst nichts zu tun... Mir ist aufgefallen, das das Entscheidende gar nicht gepostet wurde. Wo ist Die Klasse "Rayman_Head"?


----------



## hdi (21. Feb 2009)

Spacerat ich glaube das Problem ist gelöst. Er castet einen float nach int und somit kann er nicht richtig scalen, weil eh immer 1.0 rauskommt.
Der Rest wird wohl "stimmen", ich meine er kopiert seine Programme eh immer komplett aus irgendwelchen Foren oder so


----------



## Illuvatar (21. Feb 2009)

Nein, das mit dem parsen ist das kleinere Problem. Es gibt eine private Variable headsize in der Hauptklasse, und der ActionListener besteht nur aus einer Zeile, und in dieser wird eben die Variable verändert.
Das einzige, wo die Variable verwendet wird, ist eben für den Konstruktor von "Rayman_Head", aber eigentlich egal wie diese Klasse aussieht, da kann nichts funktionieren, weil weder Rayman_Head noch Java3D noch sonst jemand etwas davon mitkriegen kann, dass sich die private Membervariable ändert.


----------



## hdi (21. Feb 2009)

Ich denke eher er hat noch nen zweiten Knopf womit er einen Head erstellt, und dort liest er halt dann den akutell gesetzten Wert ab. Also nicht "on-the-fly".
Da es eine Skalierungs-Variable ist, denke ich halt er hat sie nie >=2.0 gesetzt, sonst hätte er gesehen dass es schon geht, aber durch das parsen das ganze bei 1.x eh immer auf 1.0 rauskommt.

Ob das so ist, kann man natürlich schlecht sagen bei so Namen wie "b111" und "b112" etc.


----------



## Developer_X (21. Feb 2009)

erstens, diese klasse hab ich selbst geschrieben, zweitens rayman_head rück ich nicht raus, weils ein haufen arbeit war Raymans Kopf zu programmieren, nur mal so, wenn ich float parse float nehme, und dann ist textfield 2 eingebe, passiert immer noch nichts, wenn ich auf den BUtton "altualisiereN" klicke


----------



## hdi (21. Feb 2009)

> erstens, diese klasse hab ich selbst geschrieben


Dann merk dir: Man schreibt alles in CamelCase/camelCase, und gibt
Variablen sinnvolle Namen, nicht "b11" usw.



> zweitens rayman_head rück ich nicht raus


das wird die CIA aber ärgern.



> nur mal so, wenn ich float parse float nehme, und dann ist textfield 2 eingebe, passiert immer noch nichts, wenn ich auf den BUtton "altualisiereN" klicke


Nur mal so: Lern deutsch und programmieren.

..sorry aber ich hab echt die Schnauze voll. Das ist sowas von dreist
wie du dich hier gibst. Stellst die dümmsten Fragen ever, hast kein Plan
davon was du tust, akzteptierst keine Hilfe und bist dann auch noch
- absolut ungerechtfertigterweise - arrogant.

EDIT: Nur weil ich nich anders kann: Dein Problem mit dem "Aktualisieren"
liegt wohl daran dass du ständig NEUE Rayman_Head Objekte erstellst.
Du musst aber sowas wie setHeadsize() auf deinem - einzigen! - Head-Objekt
anwenden, wenn du das aktualisieren möchtest.


----------



## Developer_X (21. Feb 2009)

@all
okay sorry
@hdi
Hdi, den code wie du ihn hier siehst, ist der Code, den ich habe, ich hab nur in meinem Features wie, Eine Screenshot Funktion, Dateityp wählung , Musik wählung usw....
Also, mache ich dieses Headsize auch nur für eine Figur, verstehst du?
schau dir den code doch mal genauer an, dann siehst dus


----------



## hdi (21. Feb 2009)

> Also, mache ich dieses Headsize auch nur für eine Figur, verstehst du?


Copy that, aber Fakt ist: Per Float.parseFloat() wird in die Variable "headsize" ganz sicher der exakte Float-Wert in dem Text-Feld eingelesen.

Wenn also irgendwas mit deinem Kopf nicht stimmt o), dann hast du irgendwo
n Problem drinnen. Das löst man sehr schnell mit ein paar System.out.println() Meldungen. 
Prüfe, ob richtig geparsed wird. Prüfe dann welchen Wert headsize hat,
gleich in der Zeile bevor du einen neuen Rayman_Head damit erstellst.

Und wenn diese Werte an beiden Stellen korrekt sind, also den Wert haben
wie du ihn eingetippt hast, dann stimmt entweder im Rayman_Head etwas nicht,
was du ja nicht zeigen willst weil es der absolute Elite-Code ist ...
Oder es stimmt was mit deinem Aktualisieren/Anzeigen nicht.

Du kannst nicht einfach mit tonnenweise Code ankommen und eine unkonkrete
Frage stellen. Du musst schon selber mal ein paar Minuten nachdenken und probieren,
wo etwas nicht stimmt.

Und es sei mir verziehen, dass ich mir nicht 100+ Zeilen Trash-Code durchlese. Gewöhn dir erstmal eine richtige Formatierung und Variablenbennenung an, wie es dir schon so oft empfohlen worden ist.


----------



## Developer_X (22. Feb 2009)

also ich kann ja mal die Grundstruktur von Rayman Head veröffentlichen hier; Falls euch das weiterbringt:

```
public class Rayman_Head extends Object
{
private Group g;
public Rayman_Head(float f)
{
g = new Group();
Transform3D a = new Transform3D(); a.setScale(f);
TransformGroup A = new TransformGroup();A.setTransform(a); g.addChild(A);
}
public Group getChild()
{
return g;
}
}
```
So, an die TransformGRoup A werden dann viele Objekte gehängt,
usw....
Der Rayman_Head also, wer den mal sehen will, unter diesem Link ist er zu sehen, als Bild:
https://java-rayman.dev.java.net/files/documents/9616/125621/Rayman.jpg
Da ist auch sein restlicher Körper zu sehen, 
danke für weitere Antworten schon mal im Voraus Developer_X


----------



## Spacerat (22. Feb 2009)

Mich bringt das schon mal weiter...
Obwohl die anderen mit "Float.parseFloat()" in den ActionListenern (in allen!) durchaus recht haben (Ich würd' sogar alles auf double umstricken, weil setScale auch damit arbeitet, ist aber Geschmackssache), ist das nicht das Problem. Das Problem sind doch die Caps. Du setzt sie im Prinzip am falschen Ort zur falschen Zeit.
bei dir siehts so aus:
neues "Rh3", neuen Raymen_Head mit "headsize" hinzufügen, "Rh3"-Caps setzen.
richtig(er) wäre:
neues "Rh3", "Rh3"-Caps setzen, neuen Raymen_Head mit "headsize" hinzufügen.
Der Grund dafür ist (soweit ich mich erinner), das die Caps hierarchisch überprüft werden. Das bedeutet, das jedes Transform3D, welches geändert werden darf, bis hoch zum Szenegraphen (inklusive) diese ebenfalls gesetzt haben muss. Deswegen hatte ich im anderen Beitrag auch davon geredet, das du dir zwangsläufig ein eigenes "VirtualUniverse" erstellen musst, weil man die Caps beim Szenegraphen des "SimpleUniverse" meines Wissens nach kaum oder gar nicht setzen kann. Ich bin dem umständlichem Handling von Java3D wegen bei JOGL gelandet.


----------



## Developer_X (22. Feb 2009)

Meinst du in etwas so?
Spacerat?

```
public Rayman_Maker()
	{
	
///////////////////////////////////////////        
         JButton b = new JButton();
         b.setBackground(backcolor);b.setBounds(1000,70,100,20);add(b);b.setForeground(forecolor); b.setLabel("Head");
         JButton b1 = new JButton();
         b1.setBackground(backcolor);b1.setBounds(1000,90,100,20);add(b1);b1.setForeground(forecolor);b1.setLabel("Kopf-Größe");
         final JTextField b11 = new JTextField();
         b11.setBackground(backcolor);b11.setBounds(1100,90,100,20);add(b11);b11.setForeground(forecolor);
         JButton b111 = new JButton();
         b111.setBackground(backcolor);b111.setBounds(1200,90,200,20);add(b111);b111.setForeground
//Hier!
(forecolor);b111.setLabel("Kopf-Größe aktualisieren");
         b111.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) 
         { headsize = Float.parseFloat(b11.getText()); Rh3 = new TransformGroup(); Rh3.addChild(new Rayman_Head(headsize).getChild();}}); 
         
	}	 
	  	   public BranchGroup createSceneGraph() 
	   {	       
		     BranchGroup Root = new BranchGroup();
	       
		     createStarBackground(Root);
		     //Head
		     head = new Transform3D();
		     head.setTranslation(new Vector3f(hx,hy,hz));
		     Head = new TransformGroup();
		     Root.addChild(Head);Head.setTransform(head); Head.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		     
		     rh1 = new Transform3D(); rh1.rotX(Math.toRadians(rhx));
		     Rh1 = new TransformGroup(); Head.addChild(Rh1);Rh1.setTransform(rh1);
		     
		     rh2 = new Transform3D(); rh2.rotY(Math.toRadians(rhy));
		     Rh2 = new TransformGroup(); Rh1.addChild(Rh2);Rh2.setTransform(rh2);
		     
//Hier!!!
		     rh3 = new Transform3D(); rh3.rotZ(Math.toRadians(rhz));
		     Rh3 = new TransformGroup();
 Rh3.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE|TransformGroup.ALLOW_CHILDREN_READ);
Rh2.addChild(Rh3);
Rh3.setTransform(rh3);		     
		     
		    
	         return Root;       
	    }
```
PS: ich hab den Code gekürzt, damit du nur ie wichtigsten Stellen lesen musst,


----------



## Spacerat (22. Feb 2009)

Fast...
Hierarchisch bedeutet, das wirklich ALLE! "Groups" (Head, Rh1-3, root usw.) die dem "SceneGraph" zugewiesen werden, diese Caps bekommen, bevor sie selbst diesem übergeben werden bzw. ihnen irgendwas hinzugefügt wird. z.B.

```
Rh3 = new Transform3D(); Rh3.setCapabilities(TransformGroup.ALLOW_TRANSFORM_READ
 | TransformGroup.ALLOW_TRANSFORM_WRITE); Rh3.addChild(new Raymen_Head(headsize).getChild());
```
Bei der "Übersicht fällt mir auch noch auf, das der Rayman dem ScenGraph "root" gar nicht hinzugefügt wird. Kann sein, das das in deinem 1. Code noch anders war.


----------



## Developer_X (22. Feb 2009)

Ah ok, du meinst es also so???: Jetzt mal mit allem:

```
public class Rayman_Maker extends JFrame()
{
private BranchGroup root;
private float headsize=1;

public Rayman_Maker()
	{
	 Toolkit tk = Toolkit.getDefaultToolkit();
		 final Dimension d = tk.getScreenSize();
         
		 setSize(d.width,d.height);
         setVisible(true);
         setIconImage(new ImageIcon("F:/Rayman_Maker_1.0/Icon.jpg").getImage());	 
         setLayout(null);
         setVisible(true);
         setResizable(false); 
         setTitle("Rayman_Maker_1.0");        
//... ich habe hier übersprungen
///////////////////////////////////////////        
         JButton b = new JButton();
         b.setBackground(backcolor);b.setBounds(1000,70,100,20);add(b);b.setForeground(forecolor); b.setLabel("Head");
         JButton b1 = new JButton();
         b1.setBackground(backcolor);b1.setBounds(1000,90,100,20);add(b1);b1.setForeground(forecolor);b1.setLabel("Kopf-Größe");
         final JTextField b11 = new JTextField();
         b11.setBackground(backcolor);b11.setBounds(1100,90,100,20);add(b11);b11.setForeground(forecolor);
         JButton b111 = new JButton();
         b111.setBackground(backcolor);b111.setBounds(1200,90,200,20);add(b111);b111.setForeground
//Hier!
///////////////////////////////////////////
         BranchGroup scene;       
         setLayout(new BorderLayout());
         GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
         Canvas3D canvas = new Canvas3D(config);
         add(canvas);   
         canvas.setBounds(0,90,1000,780);
         SimpleUniverse universe = new SimpleUniverse(canvas);                
         universe.addBranchGraph(scene);     
         Point3d p = new Point3d();
         BoundingSphere bounds = new BoundingSphere(p,10);
         OrbitBehavior orbit = new OrbitBehavior(canvas,
	                OrbitBehavior.REVERSE_ALL|OrbitBehavior.STOP_ZOOM);
	        orbit.setSchedulingBounds(bounds);
	        ViewingPlatform viewingPlatform = universe.getViewingPlatform();
	        // Damit wird die ViewingPlatform etwas zurückgesetzt, 
	        // so dass man die Objekte in der Szene sehen kann.
	        viewingPlatform.setNominalViewingTransform();
	        viewingPlatform.setViewPlatformBehavior(orbit);       
///////////////////////////////////////////
(forecolor);b111.setLabel("Kopf-Größe aktualisieren");
         b111.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) 
         { headsize = Float.parseFloat(b11.getText()); scene = createSceneGraph;    }}); 

         
	}	 
	  	  void createStarBackground(BranchGroup bg)
	   {
	   java.util.Random rand = new java.util.Random();
	   float            mag;
	   BranchGroup      BGBranch=new BranchGroup();
	   Background       BG=new Background();

	   PointArray starfield = new PointArray(15000, PointArray.COORDINATES|PointArray.COLOR_3);
	   float[] point = new float[3];
	   float[] brightness = new float[3];
	   for (int i = 0; i < 15000; i++)
	      {
	      point[0] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      point[1] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      point[2] = (rand.nextInt(2) == 0) ? rand.nextFloat() * -1.0f :rand.nextFloat();
	      starfield.setCoordinate(i, point);
	      mag=(rand.nextFloat()+0.5f)/1.5f;
	      brightness[0]=mag;
	      brightness[1]=mag;
	      brightness[2]=mag;
	      starfield.setColor(i, brightness);
	      }
	   Shape3D StarShape=new Shape3D(starfield);
	   StarShape.setAppearance(new Appearance());
	   StarShape.getAppearance().setPointAttributes(new PointAttributes(1f,true));
	   BGBranch.addChild(StarShape);
	   BG.setGeometry(BGBranch);
	   BG.setApplicationBounds(new BoundingSphere(new Point3d(),10.0));
	   BG.setColor(new Color3f(0,0,0.5f));

       bg.addChild(BG);
	   }
	   public BranchGroup createSceneGraph() 
	   {	       
		     BranchGroup Root = new BranchGroup();
	       
		     createStarBackground(Root);
		     //Head
		     head = new Transform3D();
		     head.setTranslation(new Vector3f(hx,hy,hz));
		     Head = new TransformGroup();
		     Root.addChild(Head);Head.setTransform(head);
		     
		     rh1 = new Transform3D(); rh1.rotX(Math.toRadians(rhx));
		     Rh1 = new TransformGroup(); Head.addChild(Rh1);Rh1.setTransform(rh1);
		     
		     rh2 = new Transform3D(); rh2.rotY(Math.toRadians(rhy));
		     Rh2 = new TransformGroup(); Rh1.addChild(Rh2);Rh2.setTransform(rh2);
		     
		     rh3 = new Transform3D(); rh3.rotZ(Math.toRadians(rhz));
		     Rh3 = new TransformGroup(); Rh2.addChild(Rh3);   Rh3.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE); Rh3.addChild(new Rayman_Head(headsize).getChild());
		     
		     //Light Definitions
		     Point3d p = new Point3d();
		     BoundingSphere bounds = new BoundingSphere(p, 100);
		     lightColor = new Color3f(a,b,c);
	         AmbientLight ambientLight= new AmbientLight(lightColor);
	         ambientLight.setInfluencingBounds(bounds);
	         Root.addChild(ambientLight);
	         DirectionalLight directionalLight = new DirectionalLight();
	         directionalLight.setColor(lightColor);
	         directionalLight.setInfluencingBounds(bounds);
	         Root.addChild(directionalLight);     
	         
	         //World Definitions
	         Transform3D floor = new Transform3D();
	         floor.setTranslation(new Vector3f(0,-3,0));
	         TransformGroup Floor = new TransformGroup(); Root.addChild(Floor); Floor.setTransform(floor);
	         Floor.addChild(new Floor(textur).getBG());
	         
	         return Root;       
	    }       public static void main(String[]args)
{new Rayman_Maker();}
}
```


----------



## Spacerat (22. Feb 2009)

Wieder nur fast... Zwar setzt du hier und da jetzt die Caps in der richtigen Reihenfolge, aber die Hierarchie zum SG ist immer noch unterbrochen. Hinzu kommt noch, das Root immer noch nicht Teil des SGs ist. Die "Anwendung" hat doch im Leben nie eine IDE, geschweige denn einen Debugger gesehen.
Ich glaub' du hast keine Ahnung von dem was du da tust... Irgendein 3D-API... schön und gut, aber an deiner Stelle würd' ich mal auf hdi hören und mit was leichtem beginnen. Zur Entwicklung ernstzunehmender 3D-Anwendungen gehört mehr als sich nur mit den den Klassen des 3D-APIs zu befassen. Denn spätestens hier muss man sich Wissen über die Grenzen "normaler" Mathematik hinweg angeeignet und haben um mit Transformations-Matritzen, Vectoren usw. effektiv umgehen zu können. Ferner sollte man sich über 3D-Hardware in so weit darüber Klar sein, was es z.B. in Java3D heisst, wenn ein Objekt "Life and Compiled" ist (Mit anderen Worten für weitere Themenverfolger: Die Daten wurden der GPU übergeben.). Solche Anwendungen bedürfen halt nicht bloss rein programmierteschnische Erfahrungen. Um die notwendigen Erfahrungen zu sammeln hilft meistens auch nachlesen. Bis auf die Tatsache, das du dir nicht die relevanten Kapitel in den Dokumentationen der von dir verwendeten APIs raussuchen musst (klar... das tun wir ja für dich...), tust du doch hier nichts anderes. Demnach ist es wohl auch Sinnvoll, dir zwar versuchen zu helfen, jedoch ohne, das du auch nur eine Zeile Code von uns bekommst. Bei der Anzahl deiner gestarteten Themen drängt sich die Vermutung auf, das du uns hier deine Anwendung programmieren lässt. Wir allerdings haben selber Projekte zu laufen, die auch nicht vernachlässigt werden wollen. Um das ein oder andere besser zu verstehen, sind auch sog. Tutorials hilfreich (gibts hier im Forum glaub' ich zu häuf und das auch in Deutsch). So... und nu' hau rein... Lerne Java, fang bei den Grundlagen an (z.B. hier: www.javabuch.de), oder ist dein Selbstwertgefühl zu gering um vom Image des "Foren-Trolls" weg zu kommen? 





			
				Giovanni Trappatoni hat gesagt.:
			
		

> ...Habe fertig...


----------



## hdi (22. Feb 2009)

> aber an deiner Stelle würd' ich mal auf hdi hören und mit was leichtem beginnen.


Was man auch nicht missverstehen darf: Sowas wie ein hübsches Tetris erstmalig zu programmieren, ist alles andere als "leicht".
Ein 3D-Rayman zu entwickeln, noch dazu alleine, ist halt so eine super hirnrissige Idee von Developer, die er sich jetzt in den Kopf gesetzt hat. 
Es braucht nur mal etwas, das ihn auf den Boden der Tatsachen zurückbringt. Und das wäre eben zB Tetris. 
Oder Pacman. Oder ein Snake (wobei das schon deutlich leichter und auch nicht gerade spannend ist).

Irgendwann muss er das halt lernen. Ich kann auf der einen Seite schon verstehen, wieso er das machen will.
Er ist halt ~13 Jahre oder so, und möchte jetzt sein Lieblingsspiel in 3D entwickeln. Besser, grösser, geiler.
Das ist aber wie wenn du noch nie ein Auto gefahren hast und jmd setzt dich in eine Veyron auf der Nordschleife. 
Nach guten 5 Minuten bist du entweder tot oder fast tot. Und das passiert ihm halt
mit seinem Rayman auch, was dazu führt dass er irgendwann alles hinschmeisst, zig Stunden
Arbeit umsonst waren und er keinen Bock mehr auf Java hat. Das lässt sich vermeiden wenn man vernünftig ist, 
und nicht mit dem krassesten anfängt, was es da draussen so gibt, nämlich Vollpreis-3D-Videospiele.


----------



## Developer_X (22. Feb 2009)

Wisst ihr was ich mal mache, ich versuch mich mal an einem Tetris Spiel "3D" und benutzte dabei meine Figuren die ich erstellt habe, also den Rayman_Head usw...

PS:
Ja ok, ich versteh alles bei Java3D aber für den Experten kram, 
gibt es ganz wenig tutorials, versteht ihr?

Ich weiß wie man ein Simple UNiverse erstellt, Objekte charakterisiert und positioniert, usw...
wie man Objekte schreibt, usw..
aber halt net sachen wie diese Vector3f Verschiebung, kann mir einer vielleich einen Link geben?


----------



## hdi (22. Feb 2009)

> ich versteh alles bei Java3D


das bringt dir aber alles leider nix, wenn du die Basics von Java nicht verstehst.
Und die verstehst du also sowas von gar nicht... Sieht man immer wieder an den Fragen
und an deinem grauenhaften Source-Code.

Mach ein Tetris spiel - normal - nicht in 3D. Das ist doch wieder so ein Trash was
da rauskommt. Lass das mal mit Java3D. Versuch mal ein super einfaches Tetris
Spiel zu programmieren, keine Gimmicks, keine fetten Sounds oder Hintergrundmusik,
keine blöden kreisrunden JFrames, nix mit undecorated...
Du fängst immer von hinten an, mit irgendwelchen speziellen Features usw, lass das mal.
"Einfach" nur sowas:

http://www.chunkypig.com/games/images/tetris.jpg

Versuch es erstmal dass da ein paar Steine runterkommen die du bewegen kannst,
so ganz ohne Menü oder Punkte-Anzeige und sonst was.

Dabei lernst du:

1) GUI/EDT mit Listenern
2) Threads
3) Polymorphsismus (u.a. bei den Spielsteinen)

Und das sind alles Grundlagen von Java. Bevor du also so ne spezielle Bibliothek wie
Java3D machst, musst du das hier können. Fang mal an... Ich glaube du unterschätzt
das total...


----------



## Spacerat (22. Feb 2009)

Wir machen Fortschritte (gering aber stetig)...
Dem Text entnehme ich, das du deine Objekte zwar positionieren, jedoch, ausser mit z.B. RotationInterpolator, nicht bewegen kannst. Wie ich darauf komme? Vector3f ist das Zauberwort. Grundlage aller Bewegungen in einer 3D-Welt sind Vektoren und Transformations-Matritzen (z.B. Matrix3f). Solange man diese Materie nicht Begriffen hat, kann man 3D-Welten vergessen (Noch so ein Grund, warum ich mit Java3D durch bin).
Der letzte und im Prinzip der entscheidende Grund, warum ich auf JOGL umgestiegen bin, ist die Tatsache, das man dort nicht ausschliesslich auf JOGL-Tutorials beschränkt ist, sondern auch OpenGL Tutorials aus anderen Programiersprachen (z.B. C++) durcharbeiten kann und den Code recht gut konvertiert bekommt, teilweise sogar 1 : 0,999 übernehmen kann.
So aus dem Nähkästchen plaudere ich natürlich nicht ohne Grund. Ich kann mir 1. nämlich gut vorstellen, das Java3D für den ein oder anderen (z.B. für dich) viel zu schwerfällig ist. Da ich mit absoluter Sicherheit sagen kann, das du kaum 2% von Java3D beherrschst, will ich dir JOGL (ohne Werbung machen zu wollen) näher bringen. Anfangen kann man damit z.B. hier (natürlich nachdem man sich die Library für JOGL besorgt hat). Dann fehlen noch einige Tuts über Transformations-Matritzen (und Zeugs), da muss ich leider erst mal passen. Hab' da nur so'n altmodisches Nachschlagewerk (vllt. besser bekannt als Buch... sowas gibts noch, man glaubt es kaum.). 2. Hast du dann möglicherweise einige Mehr, die dir unter die Arme greifen können. Aber eines muß dann klar sein... Erst mal kleine Brötchen backen. z.B. Solche G'schichten...
@Edit: Da sollten eigentlich noch zwei Grafiken hin, die ich in einem Anderen Thread schon verwende... Was solls... hier ist der Link... http://www.java-forum.org.server659-han.de-nserver.de/showthread.php?t=27725


----------



## hdi (22. Feb 2009)

Aaaah Spacerat 

Er kann kaum eine Grundlage von Java oder Programmieren generell, 
und ich versuch hier seit Wochen (nicht nur ich btw) dass er sich von seinem Schmarrn da 
losreisst und von vorne beginnt, wie es jeder normale Mensch tut.

Und jetz kommst du mit irgendeinem 3D-Framework. Wat soll'n dat, häh? 

Ich glaube einfach, damit tut man ihm keinen Gefallen.


----------



## Spacerat (22. Feb 2009)

... dann fang' wa eben bei null an... oder wurde das auch schon probiert? Ausserdem würde so ein winziges 3D-Projekt die meisten Grundlagen mit abdecken (z.B. was ganz wichtig ist... Speicher sparen... "new" vermeiden, ein übersichtlicher Programmierstil). Ist für mich einfach unvorstellbar, das jemand Spass am Proggen hat aber nichts dazu lernen will.
@Edit: Obendrein... Der Weg ist das Ziel. Und wenn Developer_X vor hat ein 3D-Game zu proggen, wirds ihm mit Sicherheit keinen Spass machen, sich langwierig mit nicht projektbezogenen Grundlagen zu beschäftigen. Deshalb sollte man ruhig den Ball spielen der gradewegs ins Tor geht.


----------



## hdi (23. Feb 2009)

```
Deshalb sollte man ruhig den Ball spielen der gradewegs ins Tor geht.
```

Naja das ist richtig, ich sag ja auch nich dass er den Ball weglegen und Klavier spielen soll.
Aber man fängt halt nicht mit fresh gezwirbelten Seitenziehern an, sondern erstmal mit nem Anstoss.

Blödes Gerede jetz, aber ich beobachte seine Postings schon länger, und ich kuck mir auch den Code
immer an, auch wenn es gar nix mit der Frage zu tun hat (Was eh meistens der Fall ist )

Und da kann ich schon die Fernanaylse stellen, dass das alles Dreck ist. Schau doch mal, 
mit was für Dingen er sich so beschäftigt: Kreisrunde JFrames. Er hat eine Dropdown-Box für die Hintergrund-Musik eines Menüs. Er hat zT Fragen gestellt, da merkt 
man er weiss noch nicht mal was eine Methode ist. Er kennt die API gar nicht, ich meine jetzt SE.

Und was ich nich verstehen will: Wieso nicht erstmal ein 2D-Rayman, vor einem 3D-Rayman? Und warum nicht ein Tetris vor einem 2D-Rayman? Ich wette mit dir er wird
enormste Probleme haben, ein Tetris zu programmieren. Ohne Sound ohne Effekte einfach nur so n superbilliges Tetris. Da kommen hier 25 Threads weil er nix checkt.
Damit meine ich, dass er irgendwelche komischen Methoden aus Framworks kennt oder Muster-Code von Leuten für irgendwelche strangen Settings hat. 
Aber er hat keinen Schimmer von den Prinzipien usw.
Und das merkt er nicht: Er bastelt sich dumme skalierbare Rayman_Heads, was soll das?
Was soll das am Ende für ein Spiel sein? Rayman_Heads skalieren? Wie dumm... Das wird niemals ein auch nur halbfertiges Spiel.

Und ich stell die Prognose: Wenn er so weitermacht wirft er irgendwann total frustriert alles weg,
weil sein Ziel viel zu bitter ist, und er es nicht schaffen kann. Das ist wie zu sagen "Ich fang jetzt an Schach zu spielen und will übermorgen im World Tournament gewinnen".
Und dann hat er eben monatelang irgendwelche Code-Fetzen programmiert und es bringt ihm Null komma nix. Und dann war's das mit Java. Das wär doch schade.
Wenn man sich "gesunde" Ziele steckt passt das doch. Es is einfach nur behämmert wie er versucht, Java zu erlernen. 

Und ich weiss nich wer inzwischen der blödere is: Er oder ich. Aber kA ich denk mir
er is glaub ich nich so alt, und ziemlich naiv. Ich will ja nur verhindern dass er auf die Schnauze fällt...
Weil Erfolgsmomente sind ja auch wichtig. Mit einem Echtzeit 3D-Spiel das Programmieren zu beginnen, das ist n Kopfschuss Oo


edit: Solche Worte wie "Dreck" oder "dumm" waren jetzt gar nich so grob gemeint, wie man sie vllt liest 

edit2: Ist auch nich so nett dauernd in der dritten Person über einen Anwesenden zu reden. Also Developer du kannst jedes "er" durch ein "du" ersetzen.
(Aber bitte dann auch gedanklich die Verben anpassen )


----------

