@@ -45,6 +45,42 @@ namespace plateau::meshWriter {
4545 ios->SetBoolProp (EXP_ASCIIFBX, options.file_format == FbxFileFormat::ASCII);
4646 const auto fbx_scene = FbxScene::Create (manager_, " " );
4747
48+ FbxAxisSystem axis_system;
49+ // FBXのデファクトは右手座標系です。
50+ // 左手座標系ではUnityやUEで正しく読み込めないことがあるため非推奨です。
51+ switch (options.coordinate_system ) {
52+ case geometry::CoordinateSystem::ENU:
53+ axis_system = FbxAxisSystem (
54+ FbxAxisSystem::EUpVector::eZAxis,
55+ FbxAxisSystem::EFrontVector::eParityOdd, // X,Y,ZからUp軸を除いて、残った2軸のうち前者ならParityEven, 後者ならParityOdd
56+ FbxAxisSystem::eRightHanded); // フレミングの法則の要領で中指を折ったとき、親指がX、人差し指がY、中指がZ。左右どちらの手に合うか。
57+ break ;
58+ case geometry::CoordinateSystem::ESU:
59+ axis_system = FbxAxisSystem (
60+ FbxAxisSystem::EUpVector::eZAxis,
61+ FbxAxisSystem::EFrontVector::eParityOdd,
62+ FbxAxisSystem::eLeftHanded);
63+ break ;
64+ case geometry::CoordinateSystem::WUN:
65+ axis_system = FbxAxisSystem (
66+ FbxAxisSystem::EUpVector::eYAxis,
67+ FbxAxisSystem::EFrontVector::eParityOdd,
68+ FbxAxisSystem::eRightHanded);
69+ break ;
70+ case geometry::CoordinateSystem::EUN:
71+ axis_system = FbxAxisSystem (
72+ FbxAxisSystem::EUpVector::eYAxis,
73+ FbxAxisSystem::EFrontVector::eParityOdd,
74+ FbxAxisSystem::eLeftHanded);
75+ break ;
76+ }
77+ // 座標軸の向きをFBXファイルに書き込みます。
78+ // これを確認するには、FBXをASCIIフォーマットで出力してテキストエディタで開き、
79+ // GlobalSettingsのPropertiesのAxis系プロパティを確認します。
80+ // これにより、どの座標軸で書き出したとしてもアプリケーションにFBXをインポートするときに向き補正が働き、
81+ // 同じ向きに読み込めるはずです(非推奨の左手座標系は除く)。
82+ fbx_scene->GetGlobalSettings ().SetAxisSystem (axis_system);
83+
4884 // create scene info
4985 FbxDocumentInfo* SceneInfo = FbxDocumentInfo::Create (manager_, " SceneInfo" );
5086 fbx_scene->SetSceneInfo (SceneInfo);
0 commit comments