随心所欲控制VR全景各场景声音

我们之前曾经谈过如何在保持全局背景音乐的同时,还能在切换场景时,让每个场景的声音(解说词)都不一样。也就是如果有十个场景,那每个场景都有自己的解说词,当从场景A到场景B时,场景A的声音就会停止,然后播放场景B的声音,我们提供了以下的解决方案:
  1. <krpano onstart="playsound(bg, backgroundmusic.mp3,0); loadscene(scene1,null,MERGE);">


  2. <plugin name="soundinterface" url="soundinterface.swf" alturl="soundinterface.js" preload="true" />


  3. <scene name="scene1">

  4. <events name="scene1events" onxmlcomplete="tween(sound[bg].volume, 0.5);playsound(scene1sound, scene1music.mp3,1,tween(sound[bg].volume, 1));" onremovepano="stopsound(scene1sound);" />

  5. ...

  6. scene>


  7. <scene name="scene2">

  8. <events name="scene2events" onxmlcomplete="tween(sound[bg].volume, 0.5);playsound(scene2sound, scene2music.mp3,1,tween(sound[bg].volume, 1));" onremovepano="stopsound(scene2sound);" />

  9. ...

  10. scene>


  11. krpano>


现在,我们来讲讲如何随心所欲的来控制场景的音乐,我们来假设这么一种情况。有三个展厅,每个展厅我们有三个场景,但我们只有三个解说词对应着这三个展厅,也就是当同一展厅的场景互相切换时,我们需要解说词是持续的,而不是因场景的变换而停止或重新开始。例如展厅1的场景a、b、c之间的相互切换,或者展厅2的场景d、e、f的相互切换时,其解说词是流动的,只有当不同展厅的场景切换时,才会中止之前展厅的解说词,而开始新的展厅的解说词,例如从展厅1的场景b到展厅2的场景f。


我们来假定四个场景,其中第一个场景和第三个场景属于一个“展厅”,第二个和第四个场景属于另外一个“展厅”,至于全局音乐为了方便,我们暂时不添加。



  1. <krpano>


  2. <plugin name="soundinterface" url="soundinterface.swf" alturl="soundinterface.js" preload="true" />


  3. <skin_settings ...

  4. ...

  5. musicgroup="0" />


  6. <scene name="scene1" group="1">

  7. <events name="scene1events"

  8. onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,

  9. playsound(scene1sound, scene1music.mp3,1);

  10. copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"

  11. onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene1sound));" />

  12. ...

  13. scene>


  14. <scene name="scene2" group="2">


  15. <events name="scene2events"

  16. onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,

  17. playsound(scene2sound, scene2music.mp3,1);

  18. copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"

  19. onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene2sound));" />

  20. ...

  21. scene>


  22. <scene name="scene3" group="1">


  23. <events name="scene3events"

  24. onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,

  25. playsound(scene1sound, scene1music.mp3,1);

  26. copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"

  27. onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene1sound));" />


  28. ...

  29. scene>


  30. <scene name="scene4" group="2">


  31. <events name="scene4events"

  32. onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,

  33. playsound(scene2sound, scene2music.mp3,1);

  34. copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"

  35. onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene2sound));" />


  36. ...

  37. scene>



  38. krpano>


我们先来看一个自定义属性 musicgroup,这是一个记录上一个场景的展厅id的属性,也就是看看上一个场景的展厅是属于哪一个组,如果和当前scene的group是同一个组的话,我们就不会停止音乐,也不会重新播放音乐。



  1. <skin_settings ...

  2. ...

  3. musicgroup="0" />


可以看到每个scene的标签内都自定义个一个属性group,后面的数字就是为了区别它们所属的组,相同数值的scene将被视为同一个“展厅”的场景。


因此我们先要判断ifnot,看看当前场景的group是否与上一个场景的展厅id相同,如果不相同的话,就播放音乐。同理不相同的话,还要移除上一个场景的音乐。还要记得用一个copy将当前group的数值复制到musicgroup中。这样每次判断的时候总是上一次场景的id。

2022-05-13
559阅读 · 0人点赞 · 0条评论

0人觉得很赞