mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 21:26:25 +02:00
fast compute of HRTF azimuth
This commit is contained in:
parent
dcdf07191b
commit
ad970c9f5c
2 changed files with 21 additions and 13 deletions
|
@ -545,7 +545,6 @@ float computeAzimuth(const AvatarAudioStream& listeningNodeStream, const Positio
|
||||||
const glm::vec3& relativePosition) {
|
const glm::vec3& relativePosition) {
|
||||||
glm::quat inverseOrientation = glm::inverse(listeningNodeStream.getOrientation());
|
glm::quat inverseOrientation = glm::inverse(listeningNodeStream.getOrientation());
|
||||||
|
|
||||||
// Compute sample delay for the two ears to create phase panning
|
|
||||||
glm::vec3 rotatedSourcePosition = inverseOrientation * relativePosition;
|
glm::vec3 rotatedSourcePosition = inverseOrientation * relativePosition;
|
||||||
|
|
||||||
// project the rotated source position vector onto the XZ plane
|
// project the rotated source position vector onto the XZ plane
|
||||||
|
@ -553,11 +552,17 @@ float computeAzimuth(const AvatarAudioStream& listeningNodeStream, const Positio
|
||||||
|
|
||||||
const float SOURCE_DISTANCE_THRESHOLD = 1e-30f;
|
const float SOURCE_DISTANCE_THRESHOLD = 1e-30f;
|
||||||
|
|
||||||
if (glm::length2(rotatedSourcePosition) > SOURCE_DISTANCE_THRESHOLD) {
|
float rotatedSourcePositionLength2 = glm::length2(rotatedSourcePosition);
|
||||||
|
if (rotatedSourcePositionLength2 > SOURCE_DISTANCE_THRESHOLD) {
|
||||||
|
|
||||||
// produce an oriented angle about the y-axis
|
// produce an oriented angle about the y-axis
|
||||||
return glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f), glm::normalize(rotatedSourcePosition), glm::vec3(0.0f, -1.0f, 0.0f));
|
// return glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f), glm::normalize(rotatedSourcePosition), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
} else {
|
glm::vec3 direction = rotatedSourcePosition * (1.0f / fastSqrtf(rotatedSourcePositionLength2));
|
||||||
// there is no distance between listener and source - return no azimuth
|
float angle = fastAcosf(glm::clamp(-direction.z, -1.0f, 1.0f));
|
||||||
return 0;
|
return (direction.x < 0.0f) ? -angle : angle;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// no azimuth if they are in same spot
|
||||||
|
return 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
|
|
||||||
#include "AudioClientLogging.h"
|
#include "AudioClientLogging.h"
|
||||||
#include "AudioLogging.h"
|
#include "AudioLogging.h"
|
||||||
|
#include "AudioHelpers.h"
|
||||||
|
|
||||||
#include "AudioClient.h"
|
#include "AudioClient.h"
|
||||||
|
|
||||||
|
@ -1688,23 +1689,25 @@ int AudioClient::calculateNumberOfFrameSamples(int numBytes) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
float AudioClient::azimuthForSource(const glm::vec3& relativePosition) {
|
float AudioClient::azimuthForSource(const glm::vec3& relativePosition) {
|
||||||
// copied from AudioMixer, more or less
|
|
||||||
glm::quat inverseOrientation = glm::inverse(_orientationGetter());
|
glm::quat inverseOrientation = glm::inverse(_orientationGetter());
|
||||||
|
|
||||||
// compute sample delay for the 2 ears to create phase panning
|
|
||||||
glm::vec3 rotatedSourcePosition = inverseOrientation * relativePosition;
|
glm::vec3 rotatedSourcePosition = inverseOrientation * relativePosition;
|
||||||
|
|
||||||
// project the rotated source position vector onto x-y plane
|
// project the rotated source position vector onto the XZ plane
|
||||||
rotatedSourcePosition.y = 0.0f;
|
rotatedSourcePosition.y = 0.0f;
|
||||||
|
|
||||||
static const float SOURCE_DISTANCE_THRESHOLD = 1e-30f;
|
static const float SOURCE_DISTANCE_THRESHOLD = 1e-30f;
|
||||||
|
|
||||||
if (glm::length2(rotatedSourcePosition) > SOURCE_DISTANCE_THRESHOLD) {
|
float rotatedSourcePositionLength2 = glm::length2(rotatedSourcePosition);
|
||||||
|
if (rotatedSourcePositionLength2 > SOURCE_DISTANCE_THRESHOLD) {
|
||||||
|
|
||||||
// produce an oriented angle about the y-axis
|
// produce an oriented angle about the y-axis
|
||||||
return glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f), glm::normalize(rotatedSourcePosition), glm::vec3(0.0f, -1.0f, 0.0f));
|
// return glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f), glm::normalize(rotatedSourcePosition), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
} else {
|
glm::vec3 direction = rotatedSourcePosition * (1.0f / fastSqrtf(rotatedSourcePositionLength2));
|
||||||
|
float angle = fastAcosf(glm::clamp(-direction.z, -1.0f, 1.0f));
|
||||||
|
return (direction.x < 0.0f) ? -angle : angle;
|
||||||
|
|
||||||
|
} else {
|
||||||
// no azimuth if they are in same spot
|
// no azimuth if they are in same spot
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue