Seite 1 von 1

Sound3D - Issue

Verfasst: 04.02.2013 22:50
von bobobo
ich bin ja mal froh dass das 3d- Zeugs nun mittlerweile (510B6 win32) auch mal wieder auf schlappen
Grafikkarten (intel) unterstützt wird.

Aaaber

irgendwas ist da verdreht beim 3D-Sound

im ff Code schiebt man mit a den node (würfel nebst sound) nach links mit d nach rechts
Der Sound geht aber in die falsche Richtung.
oben und unten (w /S) ist wohl ok
Vorne und hinten (Up/down) wohl auch, immerhin wird es leiser

Ist das nur hier so (komische direct-3d treiberei auf dem ollen Laptopf) oder ist das allgemein so und eher 'ne Art Bug

(hier ist es egal ob "normal" oder "opengl")

Code: Alles auswählen

InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()

OpenWindow(0,0,0,1000,1000,"k",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,1000,1000,1,0,0)
Add3DArchive("D:/PureBasic/510/Examples/3D/Data", #PB_3DArchive_FileSystem)            ;change to appr. dir
Add3DArchive("D:\PureBasic\510\Examples\3D\Data/Packs/skybox.zip", #PB_3DArchive_Zip) ;change to appr. dir
Add3DArchive("D:\PureBasic\510\Examples\3D\Data/Textures", #PB_3DArchive_FileSystem) ;change to appr. dir

SkyBox("stevecube.jpg")

cam=CreateCamera(#PB_Any, 0, 0, 1000, 1000)
cube=CreateCube(#PB_Any,10)
tex_cloud=LoadTexture(#PB_Any, "clouds.jpg")
material=CreateMaterial(#PB_Any,TextureID(tex_cloud))
Debug material

cubee=CreateEntity(#PB_Any,MeshID(cube),MaterialID(material))
If IsMesh(cubee)
  MoveEntity(cubee,0,0,0)
EndIf


sir= LoadSound3D(#PB_Any,"schwurbel.wav",#PB_Sound3D_Loop) ;change to a mono-sound-file

SoundVolume3D(sir, 100)
SoundRange3D(sir, 1, 100)
PlaySound3D(sir, #PB_Sound3D_Loop)
SoundListenerLocate(CameraX(cam),CameraY(cam),CameraZ(cam))
node=CreateNode(#PB_Any, 0, 0, -75)
AttachNodeObject(node, SoundID3D(sir))
AttachNodeObject(node, EntityID(cubee))

Repeat
  ExamineKeyboard()
  ExamineMouse()
  If KeyboardPushed(#PB_Key_Escape)
    quit+1
  EndIf
  RotateNode(node,0.3,0.4,0.5,#PB_Relative)  ;aber nur weil 3*3+4*4=5*5 ist
  If KeyboardPushed(#PB_Key_D)
    MoveNode(node,0.5,0,0)
  EndIf
  If KeyboardPushed(#PB_Key_A)
    MoveNode(node,-0.5,0,0)
  EndIf
  If KeyboardPushed(#PB_Key_W)
    MoveNode(node,0,0.5,0)
  EndIf
  If KeyboardPushed(#PB_Key_S)
    MoveNode(node,0,-0.5,0)
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    MoveNode(node,0,0,5)
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    MoveNode(node,0,0,-5)
  EndIf
  StartDrawing(WindowOutput(0))
  DrawText(0,0,Str(NodeX(node))+" "+Str(NodeY(node))+" "+Str(NodeZ(node)))
  StopDrawing()
  
  RenderWorld()
  
  FlipBuffers()
  
Until quit

End

Re: Sound3D - Issue

Verfasst: 04.02.2013 22:56
von STARGÅTE
Ich glaube das ist ein Bug, denn es gibt keine Richtungsangabe bei SoundListenerLocate().
Und da der Zuhöher nicht die Camera ist, sonden nur über diese Position definiert wird, kann auch nicht bestimmt werden, in welche "Richtung" der Zuhöher guckt, deswegen ist unklar, ob der Sound von Rechts oder Links kommt, je nachdem wohin der Zuhöher guckt.

Diesen Wunsch habe ich auch schon gepostet: Sound3D - MultiChannel, Frequency and Direction for Listener

Leider noch keine Antwort.

Deswegen hab ich mit der Sound-Lib meine eigene Sound3D geschrieben, wo Volumen und Balance über die Camera gesteuert werden.

Re: Sound3D - Issue

Verfasst: 05.02.2013 01:08
von PMV
Ohne jetzt direkt auf das Problem ein zu gehen ...
hab ich auch inzwischen die Sound3D-Lib in meinem
Projekt eingebunden und das Ergebnis .... die Anzahl
der Sound-Quellen ist (stark) begrenzt, das man
zudem alle Sounds von der Platte laden muss zur
Laufzeit ist auch nicht gerade toll ... die Begrenzung
mit dem Mono-Sound ist dagegen zumindest
nachvollziehbar ... wirklich nutzbar ist das aber so
auch für mich nicht. Ich weis aber noch nicht ob ich das
irgend wann mal erwähne bzw. mal Zeit hab mit
Beispielcode das vorzeigen kann... so weit ich das gesehen
hab ist die genutzte Engine aber auch wirklich stark
eingeschränkt bzw. noch nicht final. Ob die aber
weiter Entwickelt wird sah mir auf den ersten Blick nicht
danach aus. Leider hab ich aber wieder vergessen
welche das war, sorry. Sollte allerdings jeder durch die
Log selber raus finden können. :D

MFG PMV

Re: Sound3D - Issue

Verfasst: 05.02.2013 14:02
von bobobo
ok
also eher bug oder unvollständig.
da hoffe ich mal auf kommende Updates.

hab den o.a. wunsch mal gepusht

Re: Sound3D - Issue

Verfasst: 05.02.2013 14:16
von NicTheQuick
FMOD bietet 3D-Sound an und kann meine Kurzrecherche zu folge auch mit OpenGL verbunden werden und auf die Geometrie des Raumes angewandt werden.
FMOD Tutorial 14 - Working with 3D Sound Properties

Re: Sound3D - Issue

Verfasst: 05.02.2013 14:33
von PMV
FMOD kann so einiges ... ist dafür aber leider auch nicht
ganz billig. :lol: Ich hab aktuell die bass.dll im Auge, ist
zumindest bei meinem Budget zumindest bezahlbar. :D
(ich rede von Kommerziellen gebrauch :wink: )

Aber wer weis, vielleicht gibs für OGRE ja noch nen Update
für die Sound3D-Lib ... die hoffnung stirbt zu letzt.

MFG PMV

Re: Sound3D - Issue

Verfasst: 15.12.2018 01:59
von nodiss
:?

Code: Alles auswählen

Procedure Update_Sound_Pos(Sound_Pos.i, Cam.i, Sound.i, MaxVol.i, DistanceFactor.f) ; Sound_Pos = a Node or an Entity
  
  Protected.f Distance_Vol, Distance, Sound_Direction_LR, Sound_Direction_FR
  
  Static Sound_Direction_Node
  
  If IsNode(Sound_Direction_Node)
    
    If IsNode(Sound_Pos)
      Distance = Sqr(Pow(CameraX(Cam) - NodeX(Sound_Pos),2) + Pow(CameraY(Cam) - NodeY(Sound_Pos),2) + Pow(CameraZ(Cam) - NodeZ(Sound_Pos),2))
    ElseIf IsEntity(Sound_Pos)
      Distance = Sqr(Pow(CameraX(Cam) - EntityX(Sound_Pos),2) + Pow(CameraY(Cam) - EntityY(Sound_Pos),2) + Pow(CameraZ(Cam) - EntityZ(Sound_Pos),2))
    EndIf
    
    Distance_Vol = MaxVol - Distance * DistanceFactor
    If Distance_Vol < 0
      Distance_Vol = 0
      SoundVolume(Sound, Distance_Vol)
    Else
      MoveNode(Sound_Direction_Node, CameraX(Cam), CameraY(Cam), CameraZ(Cam), #PB_Absolute)
      
      If IsNode(Sound_Pos)
        NodeLookAt(Sound_Direction_Node, NodeX(Sound_Pos) ,CameraY(Cam), NodeZ(Sound_Pos))
      ElseIf IsEntity(Sound_Pos)
        NodeLookAt(Sound_Direction_Node, EntityX(Sound_Pos) ,CameraY(Cam), EntityZ(Sound_Pos))
      EndIf
      
      Sound_Direction_LR = Sin(Radian(EntityYaw(#PlayerEntity) - NodeYaw(Sound_Direction_Node))) * 80
      ;Sound_Direction_FR = Sin(Radian(EntityYaw(#PlayerEntity) - NodeYaw(Sound_Direction_Node) + 90))
      SoundPan(Sound, Sound_Direction_LR)
      SoundVolume(Sound, Distance_Vol)
    EndIf
  Else
    Sound_Direction_Node = CreateNode(#PB_Any)
    Update_Sound_Pos(Sound_Pos, Cam, Sound, MaxVol, DistanceFactor)
  EndIf
  
EndProcedure