Ver código fonte

Fix conversion from Blender to COLMAP coords in NeRF camera import. (#111)

Co-authored-by: Jakub Červený <jakub.cerveny@melowntech.com>
Jakub Červený 2 anos atrás
pai
commit
0f125cbd5f
1 arquivos alterados com 9 adições e 4 exclusões
  1. 9 4
      scene/dataset_readers.py

+ 9 - 4
scene/dataset_readers.py

@@ -187,10 +187,15 @@ def readCamerasFromTransforms(path, transformsfile, white_background, extension=
         for idx, frame in enumerate(frames):
             cam_name = os.path.join(path, frame["file_path"] + extension)
 
-            matrix = np.linalg.inv(np.array(frame["transform_matrix"]))
-            R = -np.transpose(matrix[:3,:3])
-            R[:,0] = -R[:,0]
-            T = -matrix[:3, 3]
+            # NeRF 'transform_matrix' is a camera-to-world transform
+            c2w = np.array(frame["transform_matrix"])
+            # change from OpenGL/Blender camera axes (Y up, Z back) to COLMAP (Y down, Z forward)
+            c2w[:3, 1:3] *= -1
+
+            # get the world-to-camera transform and set R, T
+            w2c = np.linalg.inv(c2w)
+            R = np.transpose(w2c[:3,:3])  # R is stored transposed due to 'glm' in CUDA code
+            T = w2c[:3, 3]
 
             image_path = os.path.join(path, cam_name)
             image_name = Path(cam_name).stem