| import numpy as np |
| import warp as wp |
| import matplotlib.pyplot as plt |
| import math |
| from forward import render_gaussians |
| from utils.math_utils import world_to_view, projection_matrix |
|
|
| |
| wp.init() |
|
|
| def setup_example_scene(image_width=1800, image_height=1800, fovx=45.0, fovy=45.0, znear=0.01, zfar=100.0): |
| """Setup example scene with camera and Gaussians for testing and debugging""" |
| |
| T = np.array([0, 0, 5], dtype=np.float32) |
| R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, -1]], dtype=np.float32) |
| world_to_camera = np.eye(4, dtype=np.float32) |
| world_to_camera[:3, :3] = R |
| world_to_camera[:3, 3] = T |
| world_to_camera = world_to_camera.T |
| |
| |
| view_matrix = world_to_view(R=R, t=T) |
| proj_matrix = projection_matrix(fovx=fovx, fovy=fovy, znear=znear, zfar=zfar).T |
| full_proj_matrix = world_to_camera @ proj_matrix |
| |
| camera_center = np.linalg.inv(world_to_camera)[3, :3] |
| |
| |
| tan_fovx = math.tan(fovx * 0.5) |
| tan_fovy = math.tan(fovy * 0.5) |
| |
| focal_x = image_width / (2 * tan_fovx) |
| focal_y = image_height / (2 * tan_fovy) |
| |
| camera_params = { |
| 'R': R, |
| 'T': T, |
| 'camera_center': camera_center, |
| 'view_matrix': view_matrix, |
| 'proj_matrix': proj_matrix, |
| 'world_to_camera': world_to_camera, |
| 'full_proj_matrix': full_proj_matrix, |
| 'tan_fovx': tan_fovx, |
| 'tan_fovy': tan_fovy, |
| 'focal_x': focal_x, |
| 'focal_y': focal_y, |
| 'width': image_width, |
| 'height': image_height |
| } |
| |
| |
| pts = np.array([[-5, 0, -10], [0, 2, -10], [5, 0, -10]], dtype=np.float32) |
| n = len(pts) |
| |
| |
| shs = np.array([[0.71734341, 0.91905449, 0.49961076], |
| [0.08068483, 0.82132256, 0.01301602], |
| [0.8335743, 0.31798138, 0.19709007], |
| [0.82589597, 0.28206231, 0.790489 ], |
| [0.24008527, 0.21312673, 0.53132892], |
| [0.19493135, 0.37989934, 0.61886235], |
| [0.98106522, 0.28960672, 0.57313965], |
| [0.92623716, 0.46034381, 0.5485369 ], |
| [0.81660616, 0.7801104, 0.27813915], |
| [0.96114063, 0.69872817, 0.68313804], |
| [0.95464185, 0.21984855, 0.92912192], |
| [0.23503135, 0.29786121, 0.24999751], |
| [0.29844887, 0.6327788, 0.05423596], |
| [0.08934335, 0.11851827, 0.04186001], |
| [0.59331831, 0.919777, 0.71364335], |
| [0.83377388, 0.40242542, 0.8792624 ]]*n).reshape(n, 16, 3) |
| |
| |
| |
| opacities = np.ones((n, 1), dtype=np.float32) |
|
|
| |
| scales = (0.2 + 1.5 * np.random.rand(n, 3)).astype(np.float32) |
|
|
| |
| q = np.random.randn(n, 4).astype(np.float32) |
| rotations = q / np.linalg.norm(q, axis=1, keepdims=True) |
| |
| colors = np.ones((n, 3), dtype=np.float32) |
| |
| return pts, shs, scales, colors, rotations, opacities, camera_params |
|
|
| if __name__ == "__main__": |
| |
| image_width = 1800 |
| image_height = 1800 |
| background = np.array([0.0, 0.0, 0.0], dtype=np.float32) |
| scale_modifier = 1.0 |
| sh_degree = 3 |
| prefiltered = False |
| antialiasing = False |
| clamped = True |
| |
| |
| pts, shs, scales, colors, rotations, opacities, camera_params = setup_example_scene( |
| image_width=image_width, |
| image_height=image_height |
| ) |
| n = len(pts) |
| print(f"Created example scene with {n} Gaussians") |
| |
| |
| rendered_image, depth_image, _ = render_gaussians( |
| background=background, |
| means3D=pts, |
| colors=colors, |
| opacity=opacities, |
| scales=scales, |
| rotations=rotations, |
| scale_modifier=scale_modifier, |
| viewmatrix=camera_params['view_matrix'], |
| projmatrix=camera_params['full_proj_matrix'], |
| tan_fovx=camera_params['tan_fovx'], |
| tan_fovy=camera_params['tan_fovy'], |
| image_height=image_height, |
| image_width=image_width, |
| sh=shs, |
| degree=sh_degree, |
| campos=camera_params['camera_center'], |
| prefiltered=prefiltered, |
| antialiasing=antialiasing, |
| clamped=clamped, |
| debug=False |
| ) |
|
|
| print("Rendering completed") |
| |
| |
| rendered_array = wp.to_torch(rendered_image).cpu().numpy() |
| |
| |
| plt.figure(figsize=(10, 10)) |
| plt.imshow(rendered_array) |
| plt.axis('off') |
| plt.savefig("example_render.png", bbox_inches='tight', dpi=150) |
| print("Rendered image saved to example_render.png") |
|
|