Browse Source

Fix PBRT exporter coordinate system

Was just mirroring the x axis. This uses aiProcess_ConvertToLeftHanded and
rotates the root node to match PBRT.

The problem is apparent when using an environment map texture.
Samuel Kogler 2 years ago
parent
commit
55cb19f924
3 changed files with 24 additions and 6 deletions
  1. 1 1
      code/Common/Exporter.cpp
  2. 20 5
      code/Pbrt/PbrtExporter.cpp
  3. 3 0
      code/Pbrt/PbrtExporter.h

+ 1 - 1
code/Common/Exporter.cpp

@@ -225,7 +225,7 @@ static void setupExporterArray(std::vector<Exporter::ExportFormatEntry> &exporte
 #endif
 #endif
 
 
 #ifndef ASSIMP_BUILD_NO_PBRT_EXPORTER
 #ifndef ASSIMP_BUILD_NO_PBRT_EXPORTER
-	exporters.emplace_back("pbrt", "pbrt-v4 scene description file", "pbrt", &ExportScenePbrt, aiProcess_Triangulate | aiProcess_SortByPType);
+	exporters.emplace_back("pbrt", "pbrt-v4 scene description file", "pbrt", &ExportScenePbrt, aiProcess_ConvertToLeftHanded | aiProcess_Triangulate | aiProcess_SortByPType);
 #endif
 #endif
 
 
 #ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER
 #ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER

+ 20 - 5
code/Pbrt/PbrtExporter.cpp

@@ -111,7 +111,22 @@ PbrtExporter::PbrtExporter(
         mScene(pScene),
         mScene(pScene),
         mIOSystem(pIOSystem),
         mIOSystem(pIOSystem),
         mPath(path),
         mPath(path),
-        mFile(file) {
+        mFile(file),
+        mRootTransform(
+            // rotates the (already left-handed) CRS -90 degrees around the x axis in order to
+            // make +Z 'up' and +Y 'towards viewer', as in default in pbrt
+            1.f,  0.f,  0.f, 0.f, //
+            0.f,  0.f, -1.f, 0.f, //
+            0.f,  1.f,  0.f, 0.f, //
+            0.f,  0.f,  0.f, 1.f  //
+        ) {
+
+    mRootTransform = aiMatrix4x4(
+        -1.f,  0,  0.f, 0.f, //
+        0.0f,  -1.f,  0.f, 0.f, //
+        0.f,  0.f,  1.f, 0.f, //
+        0.f,  0.f,  0.f, 1.f  //
+    ) * mRootTransform;
     // Export embedded textures.
     // Export embedded textures.
     if (mScene->mNumTextures > 0)
     if (mScene->mNumTextures > 0)
         if (!mIOSystem->CreateDirectory("textures"))
         if (!mIOSystem->CreateDirectory("textures"))
@@ -260,7 +275,7 @@ aiMatrix4x4 PbrtExporter::GetNodeTransform(const aiString &name) const {
             node = node->mParent;
             node = node->mParent;
         }
         }
     }
     }
-    return m;
+    return mRootTransform * m;
 }
 }
 
 
 std::string PbrtExporter::TransformAsString(const aiMatrix4x4 &m) {
 std::string PbrtExporter::TransformAsString(const aiMatrix4x4 &m) {
@@ -327,7 +342,7 @@ void PbrtExporter::WriteCamera(int i) {
 
 
     if (!cameraActive)
     if (!cameraActive)
         mOutput << "# ";
         mOutput << "# ";
-    mOutput << "Scale -1 1 1\n";  // right handed -> left handed
+    mOutput << "Scale 1 1 1\n";
     if (!cameraActive)
     if (!cameraActive)
         mOutput << "# ";
         mOutput << "# ";
     mOutput << "LookAt "
     mOutput << "LookAt "
@@ -383,8 +398,8 @@ void PbrtExporter::WriteWorldDefinition() {
     }
     }
 
 
     mOutput << "# Geometry\n\n";
     mOutput << "# Geometry\n\n";
-    aiMatrix4x4 worldFromObject;
-    WriteGeometricObjects(mScene->mRootNode, worldFromObject, meshUses);
+
+    WriteGeometricObjects(mScene->mRootNode, mRootTransform, meshUses);
 }
 }
 
 
 void PbrtExporter::WriteTextures() {
 void PbrtExporter::WriteTextures() {

+ 3 - 0
code/Pbrt/PbrtExporter.h

@@ -100,6 +100,9 @@ private:
     //  A private set to keep track of which textures have been declared
     //  A private set to keep track of which textures have been declared
     std::set<std::string> mTextureSet;
     std::set<std::string> mTextureSet;
 
 
+    // Transform to apply to the root node and all root objects such as cameras, lights, etc.
+    aiMatrix4x4 mRootTransform;
+
     aiMatrix4x4 GetNodeTransform(const aiString& name) const;
     aiMatrix4x4 GetNodeTransform(const aiString& name) const;
     static std::string TransformAsString(const aiMatrix4x4& m);
     static std::string TransformAsString(const aiMatrix4x4& m);