具体的には以下の回転の変換で躓いています。
/*
座標系はBlenderと合わせている。
XY軸が平面軸で、Z軸が上下になっている。Z+が上で、Z-が下である。
*/
; 音源の位置を指定
getpos objID, x, y, z
; 音源の位置をvAudioに対してOpenGL系座標からDirectX座標に変換する形で指定
vAudio3DSetPosition x, y, -z
if stat == 0 : dialog "音源の位置設定無効", 1, "vAudio3DSetPosition error": end
; プレイヤーの位置を指定
getpos playerID, x, y, z
; プレイヤーの位置をvAudioに対してOpenGL系座標からDirectX座標に変換する形で指定
vAudio3DSetListenerPosition x, y, -z
if stat == 0 : dialog "プレイヤーの位置設定無効", 1, "vAudio3DSetListenerPosition error": end
; ここまでの位置関係は問題ないはずである
; プレイヤーの頭上の向き
; DirectXに合わせて、Zの向きを反転している
fvset head_vector, 0.0, 0.0, -1.0
/*
ここではgetangで向きを取得しているが、
もしクォータニオンから変換した方が向きが正確であるなら、getquatの方がいい。
*/
getang playerID, pang.0, pang.1, pang.2 ; プレイヤーの向き
/*
ここでプレイヤーの向きをOpenGL系回転からDirectX系回転へ変換しなけばならない。
ネットの変換系TISPにはDirectX系回転はOpenGLとは逆で、時計回りではなく反時計回りだという資料があったので、
全ての軸を反転してみたのだが、上手くいかない。
回転順序か、オイラー角のせいかもしれないが原因は不明。
getquatで取得して、クォータニオンからDirectX回転へ変換した方がいいかもしれないが、やり方が分からない。
*/
pang.0 = -pang.0
pang.1 = -pang.1
pang.2 = -pang.2
vAudio3DSetListenerOrientation pang.0, pang.1, pang.2, head_vector.0, head_vector.1, head_vector.2
if stat == 0 : dialog "プレイヤーの向き設定無効", 1, "vAudio3DSetListenerOrientation error" : end