「ややこしいUnityの座標系の確認方法」シリーズ.UnityObjectToViewPos関数は右手系用なのか左手系用なのか? マニュアルやブログの解説で読んでもピンとこないのでどういうことなのか? これも実験で確かめてみる. この図のとおり,カメラとオブジェクトを配置.
この状況ならオブジェクト座標(右図)でキューブの中央は
UnityObjectToViewPos関数がこの演算を単にやってるとすると,
次のプログラムのxyz_oの値を色々変えたときにどうなるのか?
xyz_oかxyz_cのどちらか,もしくは両方が右手系扱い(
fixed4 frag (v2f i) : SV_Target { float3 xyz_o = float3(1, 0, 0); float3 xyz_c = UnityObjectToViewPos(xyz_o); return float4(xyz_c, 1); }
左手系→左手系
右手系→右手系
右手系→左手系
左手系→右手系
結果
結果は「左手系→右手系」と完全に一致した. これが分かった後,その他色々な値を入れてみたけど,やっぱりこれで正しい. つまり
UnityObjectToViewPos関数は引数はUnityと同じ左手系の座標をとるけど,出力は右手系のカメラとして計算している.
つまりめちゃくちゃややこしい.少なくともシェーダ内のこの関数はなぜかカメラ座標系だけ右手系になるみたい. 加えて,同じ右手系でもx軸が右,y軸が下,z軸が前の右手系1と,x軸が右,y軸が上,z軸が後の右手系2では結果は違う. その時は,右手系1から右手系2への変換を考えて更に変換すればいい.