private void Apply3D(AudioListener listener, AudioEmitter emitter) { if (sid == 0) { return; } float x, y, z; AL.GetListener(ALListener3f.Position, out x, out y, out z); Vector3 posOffset = emitter.Position - listener.Position; // set up orientation matrix Matrix orientation = Matrix.Identity; Vector3 forward = listener.Forward.Normalized(); Vector3 right = Vector3.Cross(forward, listener.Up); Vector3 up = Vector3.Cross(right, forward); orientation.M11 = right.X; orientation.M12 = right.Y; orientation.M13 = right.Z; orientation.M21 = up.X; orientation.M22 = up.Y; orientation.M23 = up.Z; orientation.M31 = -forward.X; orientation.M32 = -forward.Y; orientation.M33 = -forward.Z; // set up our final position and velocity according to orientation of listener Vector3 finalPos = new Vector3(x + posOffset.X, y + posOffset.Y, z + posOffset.Z); finalPos = Vector3.Transform(finalPos, orientation); Vector3 finalVel = emitter.Velocity; finalVel = Vector3.Transform(finalVel, orientation); // set the position based on relative positon AL.Source(sid, ALSource3f.Position, finalPos.X, finalPos.Y, finalPos.Z); AL.Source(sid, ALSource3f.Velocity, finalVel.X, finalVel.Y, finalVel.Z); }
public void Apply3D(AudioListener[] listeners, AudioEmitter emitter) { throw new NotSupportedException("Just one listener is supported!"); //foreach(var l in listeners) // Apply3D(l,emitter); }