# Brauche Tipps: 3D-Equalizer



## Guest (31. Jan 2006)

Gute Tag Forum !

Ich baue gerade ein 3D-Equalizer in Java3D. Es sollen immer 10 "Balken" nebeneinander die aktuellen Frequenzen wiedergeben. Nach einem vorgegebenen Interval (z.B.: 200ms) entstehen davor eine neue Reihe Balken (10 Stck.). Am Ende - 10 Reihen - werden die alten Balken gelöscht. So wandert diese Scene auf der z-Achse durch den Raum.

Problem: Die Kamera muss diese Objekte im Auge behalten, wie kriege ich die Kamera dazu, FLÜSSIG einem sich alle 200ms ändernden Punkt zu folgen ?

Problem2: Ich benutze für morphende Objekte, Licht, Kamera so gennante BoundingSphere-Objekte zur festlegung des Gesltungsbereichs. Müssen diese Objekte auch mitwandern ???

Das scheint mir alles ein wenig umständlich, sollte ich vielleicht die Balken-Objekte lieber selber (nach hinten) bewegen, so dass es wirkt als würde die Kamera sich bewegen ?

Kann man eine solche simulierte Kamerabewegung vielleicht auch auf eine TG oder BG anwenden ?


Vielen Dank im Vorraus für die Ideen
Gruß Jan


----------



## Campino (1. Feb 2006)

BoundingSpheres müssen sich mitbewegen, macht Java das nicht automatisch?

Ansonsten ist es eventuell sinnvoll, die Balken statt der Kamera zu bewegen, so das die Kamera fest bleibt...


----------



## DeepBlue (1. Feb 2006)

Benutz einfach BoundingLeafs, das sind Bounds, die sich automatisch mit einem bestimmten Objekt mitbewegen  Ansonsten würde ich die Kamerposition zur Mitte verringen / vergrößern, so wie der Zoom bei den ganzen Java Behaviors relaisiert wird. Andere möglichkeit ist natürlich die ganze Szene zu verschieben.


----------



## Guest (1. Feb 2006)

Danke erstmal, habe jetzt BoundingLeafs genommen.
Nur muss ich beim BoundingLeaf-Konstruktor auch wieder Bounds angeben.

```
bounds = new BoundingLeaf(new BoundingSphere(new Point3d(0,0,0), 10));
```
Damit sich mein BoundingLeaf-Objekt mitbewegt, führe ich bei jeder neu-hinzugefügten Reihe folgenden Code aus:
	
	
	
	





```
bounds.setBounds(new BoundingSphere(new Point3d(0,0,zOffset), 10));
```
Mit sich änderndem zOffset sollte sich das BoundingLeaf-Objekt doch mitbewegen, wenn zOffset bei 10 ankommt, verschwindet allerdings meine Balken aus dem Camerasichtfeld.
Berechtigungen sind auch gesetzt (müssen nicht alle sein, aber man weiss ja nie: 
	
	
	
	





```
bounds.setCapability(BoundingLeaf.ALLOW_BOUNDS_READ);
bounds.setCapability(BoundingLeaf.ALLOW_BOUNDS_WRITE);
bounds.setCapability(BoundingLeaf.ALLOW_REGION_READ);
bounds.setCapability(BoundingLeaf.ALLOW_REGION_WRITE);
bounds.setCapability(BoundingLeaf.ALLOW_AUTO_COMPUTE_BOUNDS_READ);
bounds.setCapability(BoundingLeaf.ALLOW_AUTO_COMPUTE_BOUNDS_WRITE);
bounds.setBoundsAutoCompute(true);
```


----------



## DeepBlue (2. Feb 2006)

Warum setzt du die Bounds jedesmal neu ? Die BoundingLeafs sind doch gerade dafür da, dass sie einem bestimmte Objekt automatisch folgen ! Dazu musst du nur das BoundingLeaf Objekt erstellen, es als Child dem Objekt, dem es folgen soll, hinzufügen und die Bounds setzen, für das Objekt, dass auf die Bounds reagieren soll.


----------



## Illuvatar (2. Feb 2006)

Genau 

Aber um auch noch meinen Senf dazuzugeben  ich denke, es wäre trotzdem viel einfacher, nicht die Kamera, sondern die Objekte selbst zu bewegen.


----------



## Guest (2. Feb 2006)

Hallo, 
ich habe jetzt meiner Haupt-TransformGroup das BoundingLeaf hinzugefügt. 
Ebenfalls beinhaltet diese TG alle darzustellenden Objekte (Unter-BranchGroups).

```
root_group = new TransformGroup();
root_group.addChild(bounds);
```
Ich glaube ich verstehe es noch nicht:

Die Objekte wandern jetzt, bzw es werden an der vorderen Seite immer neue erstellt,
und hinten abgebaut (alle 500ms). Alle diese befinden sich in meiner root_group, ebenfalls das 
BoundingLeaf-objekt bounds.

Die TG wird mit einem Behavior bewegt, alle 40ms. Wie bekomme ich das jetzt syncronisiert,
also das die Kamera immer auf die neu erzeugten Objekte "sieht", sich also die TG gegen die
Laufrichtung der Objekte bewegt, so dass es so aussieht als stehe alles still.

Was muss ich jetzt machen, damit die Szene in der Kameraperspektive bleibt und
die standart Camera-Zoom, -Rotation, -Translation dann immer noch funktionieren ???

Oder bin ich auf dem Holzweg ?

Danke


----------



## DeepBlue (3. Feb 2006)

Anonymous hat gesagt.:
			
		

> Was muss ich jetzt machen, damit die Szene in der Kameraperspektive bleibt und
> die standart Camera-Zoom, -Rotation, -Translation dann immer noch funktionieren ???
> 
> Danke



Also eigentlich sollte es reichen der ViewPlatform das gleiche Behavior zuzuweisen. Allerdings bezweifle ich, dass es eine einfache Möglichkeit gibt, wie trotzdem nocht Standard Zoom, Rotation und Translation funktionieren.


----------



## MPW (3. Feb 2006)

Also wenn ihr mich fragt, ist Java3D dazu zu langsam....hoert sich naemlich nach was action reichem an, und 200 ms hackelt ziemlich stark, ich wette, wenn du fertig bist, willst du es schneller haben und das wird dann ein Problem, wuerde es vllt. direkt in einer anderen Engine machen, die schneller ist...


----------



## DeepBlue (6. Feb 2006)

Warum sollte Java3D dafür zu langsam sein ? Wenn er jetzt einen Ego Shooter programmieren würde, dann würde ich dir zustimmen, aber so ein Equalizer, ist doch eigentlich ein nahezu perfektes Anwendungsgebiet für Java3D, da nur eine geringe Polygonanzahl vorhanden ist und ein "relativ simpler" Vorgang umgesetzt werden soll.


----------



## MPW (7. Feb 2006)

hm, aber die Performence ist das Problem, ich meine ich will keinen davon abhalten sowas zu probieren, bin aber der Meinung, wenn ich das mal so hochrechne, dass das schon einiges an Rechenleistung(fuer Java3D verhaeltnisse) braucht und will halt ein bisschen Entaeschungen vorbeugen;-)


----------

