From 0f125cbd5f21f2968c8012b480e28ca016927ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Cerven=C3=BD?= Date: Thu, 24 Aug 2023 17:38:48 +0200 Subject: [PATCH] Fix conversion from Blender to COLMAP coords in NeRF camera import. (#111) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Červený --- scene/dataset_readers.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 98c73e8..2a6f904 100644 --- a/scene/dataset_readers.py +++ b/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