# Abspielen von Sounds in Java3D



## Guest (12. Jan 2004)

Hallo!
Ich habe eine Frage zu Java3D. 
Und zwar habe ich vor, dass bei einer Kollision von zwei Objekten ein Sound (wav oder mp3....eigentlich egal) abgespielt wird. Ich habe es momentan soweit, dass bei einer Kollision eine Ausgabe auf der Systemkonsole gemacht wird. Meine Frage ist nun, wie ich einen Sound aufrufen kann, dass er abgespielt wird?
Danke im Voraus!


----------



## Oxygenic (12. Jan 2004)

Im Falle einer kollision soll der Sound vermutlich vom Ort des Geschehens her zu hören sein!? In dem Fall empiehlt es sich, einen PointSound zu verwenden. Dieser wird genau wie alle anderen Nodes in den SceneGraphen eingehängt.

Details dazu: http://java.sun.com/products/java-m...PI/j3dapi/javax/media/j3d/MediaContainer.html und http://java.sun.com/products/java-m..._3_API/j3dapi/javax/media/j3d/PointSound.html sowie http://java.sun.com/products/java-m...J3D_1_3_API/j3dapi/javax/media/j3d/Sound.html


----------



## Drathy (12. Jan 2004)

Vielen Dank für die schnelle Antwort (hab mich nun angemeldet  :lol: )!
Zunächst einmal zur Art vom Sound: Der braucht nicht vom Ort des Geschehens her zu hören sein, hauptsache es komm überhaupt was...  :wink: Ich wollte den Sound nur mal so testweise einbauen, damit man sowas schon mal gemacht hat....
Trotz der Hilfe komme ich aber irgendwie trotzdem nicht so richtig weiter. Es scheitert leider bereits beim Eingeben des Pfades für den Sound (er liegt einfach auch D:\ und heisst "EXPLODE.WAV") in den MediaContainer. Wie genau müsste ich den dann einladen?? Wäre super, wenn mir jemand das jemand posten könnte! Vom Konstuktor her eigentlich kein Problem, aber irgendwas haut da leider nicht hin....  :cry:  
Wie gehe ich dann anschließend weiter vor? Ich schätze mal, den MediaContainer auf Sound verweisen und dann Sound an die root hängen....mal ganz umgangssprachlich beschrieben... oder?
Sorry, wegen der vielen Fragen, aber das ist erst mein erstes Semester in Java3D und der Prof konnte mir heute morgen auch nicht so spontan sagen, wie ich nen Sound einbaue...
Wäre echt top, wenn mir jemand weiterhelfen könnte....


----------



## Oxygenic (12. Jan 2004)

MediaContainer erwartet einen URL, der übergebene String müsste also irgend was mit "file://D:/explode.wav" heißen. Wenn der Sound nur von irgendwo kommen soll, wäre der BackgroundSound-Node ausreichend, aber da Explosionen - speziell wenn sie von einer Kollision herrühren - realistischer wirken, wenn sie ortbar sind, würde ich trotzdem den PointSound empfelhen.


----------



## Drathy (12. Jan 2004)

Ok, nochmals danke schön! Werde das mal ausprobieren, hoffe ich bekomme es hin!


----------



## Illuvatar (2. Mai 2004)

Ich versuche zur Zeit einen PointSound zu benutzen, kriege es aber nicht so ganz hin.
Damit habe ich es versucht:

```
try{
                PointSound s = new PointSound (new MediaContainer (new File ("Sounds\\standardGotpoint.au").toURL()), 2.0f, new Point3f (0, 0, 0));
                s.setSchedulingBoundingLeaf (new BoundingLeaf (new BoundingSphere (new Point3d (0, 0, 0), 30.0d)));
                s.setPriority (10.0f);
                s.setContinuousEnable (false);
                s.setReleaseEnable (true);
                s.setLoop (1);
                BranchGroup brag = new BranchGroup();
                brag.addChild (s);
                s.setEnable (true);
                c.objects[posy - 1][posx - 1].getBG().addChild (brag); //c.objects[posy - 1][posx - 1] ist ein live  BranchGroup
              }catch (Exception e){e.printStackTrace();}
```
Es gibt keine Exception, AudioDevice ist natürlich gesetzt, HintergrundMusik funzt auch, bloß hört man nichts.


----------



## Oxygenic (3. Mai 2004)

@Illuvatar:


			
				Oxygenic hat gesagt.:
			
		

> MediaContainer erwartet einen URL, der übergebene String müsste also irgend was mit "file://D:/explode.wav" heißen.



cu 

Oxy 

http://forum.javacore.de - das Java-Forum! 
http://www.3dchat.org - Welcome To The unreal World!


----------



## Illuvatar (4. Mai 2004)

Tja, aber:


			
				Illuvatar hat gesagt.:
			
		

> ```
> new MediaContainer (new File ("Sounds\\standardGotpoint.au").toURL()), 2.0f, new Point3f (0, 0, 0)
> ```


Das File-Objekt wird mit toURL() in eine URL umgewandelt.
Ich hab auch schon eine selbstgeschriebene Konvertierungsmethode probiert.


----------



## Oxygenic (4. Mai 2004)

Ah, das habe ich glatt übersehen. Trotzdem nicht sehr elegant, da "dir\\file" nicht sonderlich plattformunabhängig ist. Was liefert toURL() denn tatsächlich zurück?

Wird brag denn jemals live?


----------



## Illuvatar (4. Mai 2004)

Ja, brag wird live.

Ich benutze mittlerweise auch nicht mehr File#toUrl sondern eine selbstgeschriebene Methode.
Path-Separator ist dann auch nicht mehr so wichtig, da meine Methode \\ benutzt.
Das File wird dann in file:\\\D:/java\selbst\PacMan\Sounds\standardGotpoint.au umgewandelt.

Kennst du ein Beispiel, das einen PointSound verwendet (hab mit Google keins gefunden)?

Edit: Ich benutze jetzt auch einen HeadspaceMixer, funktioniert trotzdem nicht.
Edit2: Ich habs jetzt auch mit der OpenGL-Version probiert, aber außer einer *massiven* Performanceverschlechterung im ganzen Programm hat sich nix getan. (Benutz jetzt wieder DirectX)


----------



## Oxygenic (5. Mai 2004)

Illuvatar hat gesagt.:
			
		

> file:\\\D:/java\selbst\PacMan\Sounds\standardGotpoint.au
> 
> Kennst du ein Beispiel, das einen PointSound verwendet (hab mit Google keins gefunden)?



Die Backslashes nach file: sind da auch nicht so ganz richtig. Ein Beispiel hätte ich, aber ich weiß nicht, ob dir das so viel nutzt:


```
void createPointsound(XBranchGroup MyBranch)
      {
      Shape3D DirObject=new PointObj();

      DirObject.getAppearance().setMaterial(new Material(new Color3f(0f,0f,1.0f),new Color3f(0f,0f,1.0f),new Color3f(0f,0f,1.0f),new Color3f(0f,0f,1.0f),1f));
      if (PSnd!=null) PSnd.setEnable(false);
      MyBranch.addChild(newSymbolSwitch(DirObject));
      if (!GlobalSettings.GlobData.noAudioStreamMode)
         {
         float[] dist,gain;

         InputStream is=MainWin.Win.UniPanel.DLCacheMan.getFileStream(MainWin.Win.MainThreadMsgPipe,Cmd,DownloadCacheManager.SOUNDSTREAM|DownloadCacheManager.BLOCKING,false,true);
         StreamMC=new MediaContainer(is);

         PSnd=new PointSound(StreamMC,1.0f,new Point3f());
         PSnd.setCapability(PointSound.ALLOW_ENABLE_WRITE);
         if ((Flags & 0x00FF)==0x00) // linear attenuation
            {
            dist=new float[2];            gain=new float[2];
            dist[0]=0;                    gain[0]=1.0f;
            dist[1]=this.cobject_p2+0.1f; gain[1]=0f;
            }
         else if ((Flags & 0x00FF)==0x01) // (nearly) logarithmic attenuation
            {
            dist=new float[3];             gain=new float[3];
            dist[0]=0;                     gain[0]=1.0f;
            dist[1]=this.cobject_p2*0.75f;  gain[1]=0.5f;
            dist[2]=this.cobject_p2+0.1f;  gain[2]=0f;
            }
         else // sharp attenuation
            {
            dist=new float[3];             gain=new float[3];
            dist[0]=0;                     gain[0]=1.0f;
            dist[1]=this.cobject_p2*0.8f;  gain[1]=0.8f;
            dist[2]=this.cobject_p2+0.1f;  gain[2]=0f;
            }
         PSnd.setDistanceGain(dist,gain);
         PSnd.setInitialGain((float)(cobject_p4/100.0));
         PSnd.setSchedulingBounds(new BoundingSphere(new Point3d(),this.cobject_p2+0.1f));
         PSnd.setLoop((int)cobject_p1-1);
         PSnd.setEnable(true);
         MyBranch.addChild(PSnd); // insert the sound object
         }
      }
```

Ansonsten findest du unter http://java3d.virtualworlds.de/books.php eine deutssprachige doku, die Sounds auch noc hmal detailliert beschreibt.

cu 

Oxy 

http://forum.javacore.de - das Java-Forum! 
http://www.3dchat.org - Welcome To The unreal World!


----------



## Oxygenic (5. Mai 2004)

Nachtrag: Das "Syntaxhighlighting" ist ja lustig, eigentlich ist das nur grün mit ein wenig blau...


----------



## Illuvatar (8. Mai 2004)

Da das bei mir nicht so wichtig war, benutz ich jetzt ein java.applet.AudioClip.
Ich wollte PointSound halt mal ausprobieren.
Ich hab aber auch schon im java.sun.com-Forum gelesen, dass die Klasse recht verbuggt sein soll.


----------



## Guest (11. Mai 2004)

Hallo.

Ich habe ein ähnliches Problem allerdings konnt ich aus den Antworten keine relevante für mich herausfiltern.
Leider bin ebenfalls ziemlicher Neuling, sowohl was Java als auch Java3D un hoffe dringend auf eure Unterstützung.



> URL eineURL;
> try { eineURL = new URL("file:Lied.wav"); }
> catch (Exception e)
> {return null;}
> ...



Mir wird kein Fehler angezeigt aber eine Audio-Ausgabe erfolgt auch nicht. Die angegebenen Objekte sind alle vorher definiert worden. Wäre super wenn mir jemand weiterhelfen kann...

Danke im Voraus.


----------

