Hey,
you mean setting the min distance for the used sound to 1? Because the AudioManager doent have a function set_3d_min_diestance()
I applied it to the sound i’m using but it had no effect.
Here’s my full code if it is helpful:
#include "pandaFramework.h"
#include "pandaSystem.h"
#include "genericAsyncTask.h"
#include "asyncTaskManager.h"
#include "cIntervalManager.h"
#include "cLerpNodePathInterval.h"
#include "cMetaInterval.h"
#include "audiomanager.h"
#include "audiosound.h"
// Global stuff
PandaFramework framework;
PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();
PT(ClockObject) globalClock = ClockObject::get_global_clock();
NodePath camera;
PT(AudioManager) AM = AudioManager::create_AudioManager();
PT(AudioSound) bgsound;
NodePath pandaActor;
// Task to move the camera
AsyncTask::DoneStatus SpinCameraTask(GenericAsyncTask* task, void* data) {
double time = globalClock->get_real_time();
double angledegrees = time * 6.0;
double angleradians = angledegrees * (3.14 / 180.0);
camera.set_pos(20*sin(angleradians),-20.0*cos(angleradians),3);
camera.set_hpr(angledegrees, 0, 0);
//camera.look_at(pandaActor);
return AsyncTask::DS_cont;
}
AsyncTask::DoneStatus ContSoundTask(GenericAsyncTask* task, void* data){
//My second attempt
LPoint3f pandapos = pandaActor.get_pos();
bgsound->set_3d_attributes(pandapos.get_x(),pandapos.get_y(),pandapos.get_z(),0,0,0);
LPoint3f camerapos = camera.get_pos();
AM->audio_3d_set_listener_attributes(camerapos.get_x(),camerapos.get_y(),camerapos.get_z(),
0,0,0,
pandapos.get_x(), pandapos.get_y(), pandapos.get_z(),
0,0,1);
/* // My first attempt
LVecBase3f view = camera.get_hpr();
AM->audio_3d_set_listener_attributes(camera.get_x(),camera.get_y(), camera.get_z(),
0,0,0,
view.get_x(), view.get_y(), view.get_z(),
0,0,1);
// tah's attempt
LMatrix4f mat = camera.get_mat();
LVecBase3f lv = mat.get_row3(1);
LVecBase3f uv = mat.get_row3(2);
LVecBase3f pos = mat.get_row3(3);
AM->audio_3d_set_listener_attributes(pos.get_x(),pos.get_y(),pos.get_z(),
0,0,0,
lv.get_x(),lv.get_y(),lv.get_z(),
uv.get_x(),uv.get_y(),uv.get_z());
*/
AM->update();
return AsyncTask::DS_cont;
}
int main(int argc, char *argv[]) {
// Open a new window framework and set the title
framework.open_framework(argc, argv);
framework.set_window_title("My Panda3D Window");
// Open the window
WindowFramework *window = framework.open_window();
camera = window->get_camera_group(); // Get the camera and store it
//Sound
bgsound = AM->get_sound("KirbyMono.mp3");
bgsound->set_3d_min_distance(1);
// AM->set_3d_min_distance(1.); doesnt exist
bgsound->set_loop(true);
bgsound->play();
// Load the environment model
NodePath environ = window->load_model(framework.get_models(),
"models/environment");
environ.reparent_to(window->get_render());
environ.set_scale(0.25 , 0.25, 0.25);
environ.set_pos(-8, 42, 0);
// Load our panda
pandaActor = window->load_model(framework.get_models(),
"panda-model");
pandaActor.set_scale(0.005);
pandaActor.reparent_to(window->get_render());
// Load the walk animation
window->load_model(pandaActor, "panda-walk4");
window->loop_animations(0);
// Create the lerp intervals needed to walk back and forth
PT(CLerpNodePathInterval) pandaPosInterval1, pandaPosInterval2,
pandaHprInterval1, pandaHprInterval2;
pandaPosInterval1 = new CLerpNodePathInterval("pandaPosInterval1",
13.0, CLerpInterval::BT_no_blend,
true, false, pandaActor, NodePath());
pandaPosInterval1->set_start_pos(LPoint3f(0, 10, 0));
pandaPosInterval1->set_end_pos(LPoint3f(0, -10, 0));
pandaPosInterval2 = new CLerpNodePathInterval("pandaPosInterval2",
13.0, CLerpInterval::BT_no_blend,
true, false, pandaActor, NodePath());
pandaPosInterval2->set_start_pos(LPoint3f(0, -10, 0));
pandaPosInterval2->set_end_pos(LPoint3f(0, 10, 0));
pandaHprInterval1 = new CLerpNodePathInterval("pandaHprInterval1", 3.0,
CLerpInterval::BT_no_blend,
true, false, pandaActor, NodePath());
pandaHprInterval1->set_start_hpr(LPoint3f(0, 0, 0));
pandaHprInterval1->set_end_hpr(LPoint3f(180, 0, 0));
pandaHprInterval2 = new CLerpNodePathInterval("pandaHprInterval2", 3.0,
CLerpInterval::BT_no_blend,
true, false, pandaActor, NodePath());
pandaHprInterval2->set_start_hpr(LPoint3f(180, 0, 0));
pandaHprInterval2->set_end_hpr(LPoint3f(0, 0, 0));
// Create and play the sequence that coordinates the intervals
PT(CMetaInterval) pandaPace;
pandaPace = new CMetaInterval("pandaPace");
pandaPace->add_c_interval(pandaPosInterval1, 0,
CMetaInterval::RS_previous_end);
pandaPace->add_c_interval(pandaHprInterval1, 0,
CMetaInterval::RS_previous_end);
pandaPace->add_c_interval(pandaPosInterval2, 0,
CMetaInterval::RS_previous_end);
pandaPace->add_c_interval(pandaHprInterval2, 0,
CMetaInterval::RS_previous_end);
pandaPace->loop();
// Add our task.
taskMgr->add(new GenericAsyncTask("Spins the camera",
&SpinCameraTask, (void*) NULL));
taskMgr->add(new GenericAsyncTask("Continues Sound", &ContSoundTask, (void*) NULL));
// This is a simpler way to do stuff every frame,
// if you're too lazy to create a task.
Thread *current_thread = Thread::get_current_thread();
while(framework.do_frame(current_thread)) {
// Step the interval manager
CIntervalManager::get_global_ptr()->step();
}
framework.close_framework();
return (0);
}