Surround Sound / 3D Audio Panning Is Inverted

grm

New Member
Mar 12, 2026
1
2

Game Version

v2026.3.5.3775

Operating System

Windows 11

What Happened​

All 3D-spatialized sound effects (engines, RCS thrusters) are
panned to the rear speakers in surround sound, multichannel configurations.

What Was Expected​

Spatialized sound should come from the direction of the source, relative to the camera's facing direction.
Rotating the camera around the vehicle should cause the sound to pan smoothly across the surround field.

Reproduction Steps​

  1. Configure a surround sound speaker setup (5.1 or 7.1) in Windows.​
  2. Launch KSA.​
  3. Load any situation with a rocket.​
  4. Ignite the main engine and orbit the camera around the vehicle.​
  5. Observe: engine sound comes predominantly from the rear speakers regardless of camera orientation.​

Reproduction Rate​

Always

Additional Info​

  • Root cause identified and potential fix found:​

Camera.EgoToView() [Camera.cs:193]* transforms sound source positions from ego space into view space using the camera's view matrix — a pure rotation built from the Ego2View quaternion via float4x4.CreateFromQuaternion [Camera.cs:391–393]*, with no translation component.​
SpatialAudio.PositionView() [SpatialAudio.cs:14–16]* and VelocityView() [SpatialAudio.cs:19–21]* call EgoToView to convert ego-space vectors to view space. These view-space vectors are passed directly to FMOD via Channel.TrySet3dAttributes() [ChannelWrapper.cs:336]*.​
FMOD is initialized with _3dRightHanded [GameAudio.cs:88]*, which tells FMOD to interpret coordinates as right-handed but does not change the default listener vectors. The default listener forward is always (0, 0, 1) (+Z). Set3dListenerAttributes is never called, so the listener permanently faces +Z.​
In Vulkan's right-handed coordinate system, view-space forward is -Z.​
A sound in front of the camera is placed at -Z in view space, which FMOD interprets as behind the +Z-facing listener, routing it to the rear speakers.​
My fix is to negate the Z component of the view-space position returned by EgoToView, aligning Vulkan's -Z forward with FMOD's +Z forward.
Multiplying the Transform result by float3(1, 1, -1) corrects the spatial panning for all surround configurations.​

Alternatively, a single call to System.Set3dListenerAttributes with forward = (0, 0, -1) at initialization might achieve the same result without modifying EgoToView.​
* lines from decompiled code; just for reference

Thank you for reading this. :)
(Apologies for the bad video quality)

 
Last edited:
Upvote 2