├── .gitignore ├── README.md ├── assets └── dataset_web.gif └── rendering ├── blender.py ├── download.py ├── output ├── 2a7f866be31e43b89074f304a31ff82d │ ├── front_frame0.png │ ├── front_frame1.png │ ├── front_frame10.png │ ├── front_frame11.png │ ├── front_frame12.png │ ├── front_frame13.png │ ├── front_frame14.png │ ├── front_frame15.png │ ├── front_frame16.png │ ├── front_frame17.png │ ├── front_frame18.png │ ├── front_frame19.png │ ├── front_frame2.png │ ├── front_frame20.png │ ├── front_frame21.png │ ├── front_frame22.png │ ├── front_frame23.png │ ├── front_frame3.png │ ├── front_frame4.png │ ├── front_frame5.png │ ├── front_frame6.png │ ├── front_frame7.png │ ├── front_frame8.png │ ├── front_frame9.png │ ├── multi_frame0.png │ ├── multi_frame1.png │ ├── multi_frame10.png │ ├── multi_frame11.png │ ├── multi_frame12.png │ ├── multi_frame13.png │ ├── multi_frame14.png │ ├── multi_frame15.png │ ├── multi_frame16.png │ ├── multi_frame17.png │ ├── multi_frame18.png │ ├── multi_frame19.png │ ├── multi_frame2.png │ ├── multi_frame20.png │ ├── multi_frame21.png │ ├── multi_frame22.png │ ├── multi_frame23.png │ ├── multi_frame3.png │ ├── multi_frame4.png │ ├── multi_frame5.png │ ├── multi_frame6.png │ ├── multi_frame7.png │ ├── multi_frame8.png │ ├── multi_frame9.png │ ├── multi_static_frame0.png │ ├── multi_static_frame1.png │ ├── multi_static_frame10.png │ ├── multi_static_frame11.png │ ├── multi_static_frame12.png │ ├── multi_static_frame13.png │ ├── multi_static_frame14.png │ ├── multi_static_frame15.png │ ├── multi_static_frame16.png │ ├── multi_static_frame17.png │ ├── multi_static_frame18.png │ ├── multi_static_frame19.png │ ├── multi_static_frame2.png │ ├── multi_static_frame20.png │ ├── multi_static_frame21.png │ ├── multi_static_frame22.png │ ├── multi_static_frame23.png │ ├── multi_static_frame3.png │ ├── multi_static_frame4.png │ ├── multi_static_frame5.png │ ├── multi_static_frame6.png │ ├── multi_static_frame7.png │ ├── multi_static_frame8.png │ └── multi_static_frame9.png └── 900cafbf2ee3444d823026bd417010f0 │ ├── front_frame0.png │ ├── front_frame1.png │ ├── front_frame10.png │ ├── front_frame11.png │ ├── front_frame12.png │ ├── front_frame13.png │ ├── front_frame14.png │ ├── front_frame15.png │ ├── front_frame16.png │ ├── front_frame17.png │ ├── front_frame18.png │ ├── front_frame19.png │ ├── front_frame2.png │ ├── front_frame20.png │ ├── front_frame21.png │ ├── front_frame22.png │ ├── front_frame23.png │ ├── front_frame3.png │ ├── front_frame4.png │ ├── front_frame5.png │ ├── front_frame6.png │ ├── front_frame7.png │ ├── front_frame8.png │ ├── front_frame9.png │ ├── multi_frame0.png │ ├── multi_frame1.png │ ├── multi_frame10.png │ ├── multi_frame11.png │ ├── multi_frame12.png │ ├── multi_frame13.png │ ├── multi_frame14.png │ ├── multi_frame15.png │ ├── multi_frame16.png │ ├── multi_frame17.png │ ├── multi_frame18.png │ ├── multi_frame19.png │ ├── multi_frame2.png │ ├── multi_frame20.png │ ├── multi_frame21.png │ ├── multi_frame22.png │ ├── multi_frame23.png │ ├── multi_frame3.png │ ├── multi_frame4.png │ ├── multi_frame5.png │ ├── multi_frame6.png │ ├── multi_frame7.png │ ├── multi_frame8.png │ ├── multi_frame9.png │ ├── multi_static_frame0.png │ ├── multi_static_frame1.png │ ├── multi_static_frame10.png │ ├── multi_static_frame11.png │ ├── multi_static_frame12.png │ ├── multi_static_frame13.png │ ├── multi_static_frame14.png │ ├── multi_static_frame15.png │ ├── multi_static_frame16.png │ ├── multi_static_frame17.png │ ├── multi_static_frame18.png │ ├── multi_static_frame19.png │ ├── multi_static_frame2.png │ ├── multi_static_frame20.png │ ├── multi_static_frame21.png │ ├── multi_static_frame22.png │ ├── multi_static_frame23.png │ ├── multi_static_frame3.png │ ├── multi_static_frame4.png │ ├── multi_static_frame5.png │ ├── multi_static_frame6.png │ ├── multi_static_frame7.png │ ├── multi_static_frame8.png │ └── multi_static_frame9.png ├── render.py ├── render_script.png └── src ├── ObjV1_all_animated.txt ├── ObjV1_curated.txt ├── RemovedAssetSamples ├── 560430ec7088453c84d1ac6a568012c8.png ├── 706b873059ec439cb748748d480b5c4c.png ├── 7318c6d320eb4f958492ea942b3b52b0.png ├── 7be6e8773be64a1da6bedae657e1a054.png ├── 7c326907f7dd469789ec33c3f15ea13a.png └── 8d6dd9025be64fe4aa64d79710a7a26e.png └── sample.txt /.gitignore: -------------------------------------------------------------------------------- 1 | rendering/blender-3.2.2-linux-x64 2 | rendering/output 3 | rendering/obj_data 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Diffusion4D: Fast Spatial-temporal Consistent 4D Generation via Video Diffusion Models 2 | 3 | The official implementation of work "Diffusion4D: Fast Spatial-temporal Consistent 4D Generation via Video Diffusion Models". 4 | 5 | [[Project Page]](https://vita-group.github.io/Diffusion4D/) | [[Arxiv]](https://arxiv.org/abs/2405.16645) | [[Video (Youtube)]](https://www.youtube.com/watch?v=XJT-cMt_xVo) | [[视频 (Bilibili)]](https://b23.tv/ojVe6Uv) | [[Huggingface Dataset]](https://huggingface.co/datasets/hw-liang/Diffusion4D) 6 | 7 | # Image-to-4D 8 | ![demo_img_1](https://github.com/user-attachments/assets/3da5f105-4ed4-499a-bb95-8a79acb8cf1d) 9 | ![demo_img_2](https://github.com/user-attachments/assets/2d0cdfb9-55a3-46bc-a583-1bc2bb590f4e) 10 | ![demo_img_3](https://github.com/user-attachments/assets/9679468c-05ec-4b3c-a8b8-5c718737afbc) 11 | 12 | # Text-to-4D 13 | ![demo_text](https://github.com/user-attachments/assets/020b0fb9-ca8a-483f-8105-ac863727f5c6) 14 | # 3D-to-4D 15 | ![3d_1](https://github.com/user-attachments/assets/4fd7f4b4-ddcc-41f7-b113-9e691aecf0ac) 16 | ![3d_2](https://github.com/user-attachments/assets/c83fa84a-cdf0-4742-a347-6e5bc4ab82bb) 17 | 18 | 19 | # News 20 | - 2024.6.28: Released rendered data from curated [objaverse-xl](https://huggingface.co/datasets/hw-liang/Diffusion4D/tree/main/objaverseXL_curated), including orbital videos of dynamic 3D and monocular videos from front view. 21 | - 2024.6.4: Released rendered data from curated [objaverse-1.0](https://huggingface.co/datasets/hw-liang/Diffusion4D/tree/main/objaverse1.0_curated), including orbital videos of dynamic 3D, orbital videos of static 3D, and monocular videos from front view. 22 | - 2024.5.27: Released metadata for objects and data preparation code! 23 | - 2024.5.26: Released on arxiv! 24 | 25 | 26 | # 4D Dataset Preparation 27 | ![dataset_video](./assets/dataset_web.gif) 28 | 29 | We collect a large-scale, high-quality dynamic 3D(4D) dataset sourced from the vast 3D data corpus of [Objaverse-1.0](https://objaverse.allenai.org/objaverse-1.0/) and [Objaverse-XL](https://github.com/allenai/objaverse-xl). We apply a series of empirical rules to curate the source dataset. You can find more details in our [paper](https://arxiv.org/abs/2405.16645). In this part, we will release the selected 4D assets, including: 30 | 1. Curated high-quality 4D object ID. 31 | 2. A render script using Blender, providing optional settings to render your personalized data. 32 | 3. [Rendered objaverse-1.0 4D images](https://huggingface.co/datasets/hw-liang/Diffusion4D/tree/main/objaverse1.0_curated) and [Rendered objaverse-xl 4D images](https://huggingface.co/datasets/hw-liang/Diffusion4D/tree/main/objaverseXL_curated) by our team to save you GPU time. With 8 GPUs and a total of 16 threads, it took **5.5 days** to render the curated objaverse-1.0 dataset and about **30 days** for objaverse-xl dataset. 33 | 34 | ### 4D Dataset ID/Metadata 35 | We first collect 365k dynamic 3D assets from Objaverse-1.0 (42k) and Objaverse-xl (323k). Then we curate a high-quality subset to train our models. 36 | 37 | The uncurated 42k IDs of all the animated objects from objaverse-1.0 are in `rendering/src/ObjV1_all_animated.txt`. The curated ~11k IDs of the animated objects from objaverse-1.0 are in `rendering/src/ObjV1_curated.txt`. The curated ~71k IDs of the animated objects from objaverse-xl are in [huggingface](https://huggingface.co/datasets/hw-liang/Diffusion4D/blob/main/objaverseXL_curated/objaverseXL_curated_uuid_list.txt). 38 | 39 | Metadata of animated objects (323k) from objaverse-xl can be found in [huggingface](https://huggingface.co/datasets/hw-liang/Diffusion4D/blob/main/meta_xl_animation_tot.csv). We also release the metadata of all successfully rendered objects from [objaverse-xl's Github subset](https://huggingface.co/datasets/hw-liang/Diffusion4D/blob/main/meta_xl_tot.csv). 40 | 41 | For text-to-4D generation, the captions are obtained from the work [Cap3D](https://huggingface.co/datasets/tiange/Cap3D). 42 | 43 | ### 4D Dataset Rendering Script 44 | 1. Clone the repository and enter the rendering directory: 45 | 46 | ```bash 47 | git clone https://github.com/VITA-Group/Diffusion4D.git && \ 48 | cd rendering 49 | ``` 50 | 51 | 2. Download Blender: 52 | 53 | ```bash 54 | wget https://download.blender.org/release/Blender3.2/blender-3.2.2-linux-x64.tar.xz && \ 55 | tar -xf blender-3.2.2-linux-x64.tar.xz && \ 56 | rm blender-3.2.2-linux-x64.tar.xz 57 | ``` 58 | 59 | 3. Download 4D objects 60 | 61 | ```bash 62 | pip install objaverse 63 | python download.py --id_path src/sample.txt 64 | ``` 65 | 66 | Please change `objaverse._VERSIONED_PATH` in `download.py` to the path you prefer to store the glb files. By default, it will be downloaded to `obj_v1/`. 67 | 68 | 4. Render 4D images 69 | 70 | ```bash 71 | python render.py --obj_path "./obj_v1/glbs" \ 72 | --save_dir './output' \ 73 | --gpu_num 8 \ 74 | --frame_num 24 \ 75 | --azimuth_aug 1 \ 76 | --elevation_aug 0 \ 77 | --resolution 256 \ 78 | --mode_multi 1 \ 79 | --mode_static 1 \ 80 | --mode_front_view 0 \ 81 | --mode_four_view 0 82 | ``` 83 | 84 | Script Explanation: 85 | - `--obj_path` Downloaded object path in step 3. Keep the same as your 'BASE_PATH'. 86 | - `--save_dir` Directory to save. 87 | - `--gpu_num` GPU number for rendering. 88 | - `--frame_num` Number of frames to render. E.g., 24 means render from 'time=0' to 'time=24' images. You can set more or fewer frames, but the motion stops at a certain timestep, which differs with each case. Therefore, we do not recommend setting a large number of frames. 89 | - `--azimuth_aug` If set to 1, use azimuth augmentation. Images will be rendered from a random azimuth. Otherwise, set to 0. 90 | - `--elevation_aug` If set to 1, use elevation augmentation. Images will be rendered from a random elevation. Otherwise, set to 0. 91 | - `--resolution` Image resolution. We set 256*256. If you want higher resolution, you can set 512 or 1024. 92 | - `--mode_multi` If set to 1, use multi-view render mode. Images will be rendered from at 'time 0,view 0' to 'time T, view T'. Otherwise, set to 0. 93 | - `--mode_static` If set to 1, use multi-static-view render mode. Images will be rendered from at 'time 0,view 0' to 'time 0, view T'. Otherwise, set to 0. 94 | - `--mode_front_view` If set to 1, use front view render mode. Images will be rendered from at 'time 0,view front' to 'time T, view front'. The front view will change with azimuth augmention. Otherwise, set to 0. 95 | - `--mode_four_view` If set to 1, use four view render mode. Images will be rendered from at 'time 0,view front,left,right,back' to 'time T, view front,left,right,back'. Otherwise, set to 0. 96 | ![script](rendering/render_script.png) 97 | 98 | 99 | 100 | Output Explanation: 101 | ``` 102 | ├── output 103 | │ | object1 104 | │ ├── multi_frame0-23.png #mode_multi outputs 105 | │ ├── multi0-23.json #mode_multi cameras 106 | │ 107 | │ ├── multi_static_frame0-23.png #mode_static outputs 108 | │ ├── static0-23.json #mode_static cameras 109 | │ 110 | │ # optional 111 | │ ├── front_frame0-23.png #mode_front_view outputs 112 | │ ├── front.json #mode_front_view cameras 113 | │ ├── front/left/right/back_frame0-23.png #mode_four_view outputs 114 | │ ├── front/left/right/back.json #mode_four_view cameras 115 | │ 116 | │ | object2 117 | │ .... 118 | │ | object3 119 | │ .... 120 | ``` 121 | Our rendering script is based on [point-e](https://github.com/openai/point-e/blob/main/point_e/evals/scripts/blender_script.py) and [Objaverse](https://github.com/allenai/objaverse-xl/blob/main/scripts/rendering/blender_script.py) rendering scripts. Thanks a lot to all the authors for sharing! 122 | 123 | 124 | 125 | 126 | ### Acknowledgement 127 | This project is based on numerous outstanding research efforts and open-source contributions. We are deeply grateful to all the authors for their generosity in sharing their work! 128 | - https://github.com/alibaba/VideoMV 129 | - https://github.com/hustvl/4DGaussians 130 | - https://github.com/graphdeco-inria/gaussian-splatting 131 | - https://github.com/graphdeco-inria/diff-gaussian-rasterization 132 | - https://objaverse.allenai.org/objaverse-1.0/ 133 | - https://github.com/allenai/objaverse-xl 134 | - https://github.com/crockwell/Cap3D 135 | - https://github.com/openai/point-e 136 | 137 | ### If you find this repository/work/dataset helpful in your research, please consider citing the paper and starring the repo ⭐. 138 | 139 | ``` 140 | @article{liang2024diffusion4d, 141 | title={Diffusion4D: Fast Spatial-temporal Consistent 4D Generation via Video Diffusion Models}, 142 | author={Liang, Hanwen and Yin, Yuyang and Xu, Dejia and Liang, Hanxue and Wang, Zhangyang and Plataniotis, Konstantinos N and Zhao, Yao and Wei, Yunchao}, 143 | journal={arXiv preprint arXiv:2405.16645}, 144 | year={2024} 145 | } 146 | ``` 147 | 148 | 151 | -------------------------------------------------------------------------------- /assets/dataset_web.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/assets/dataset_web.gif -------------------------------------------------------------------------------- /rendering/blender.py: -------------------------------------------------------------------------------- 1 | """Blender script to render images of 3D models.""" 2 | 3 | import argparse 4 | import json 5 | import math 6 | import os 7 | import random 8 | import sys 9 | print(sys.path) 10 | from typing import Any, Callable, Dict, Generator, List, Literal, Optional, Set, Tuple 11 | from mathutils.noise import random_unit_vector 12 | import bpy 13 | import numpy as np 14 | from mathutils import Matrix, Vector 15 | import os 16 | # import imageio 17 | # from skimage.metrics import structural_similarity as ssim 18 | 19 | IMPORT_FUNCTIONS: Dict[str, Callable] = { 20 | "obj": bpy.ops.import_scene.obj, 21 | "glb": bpy.ops.import_scene.gltf, 22 | "gltf": bpy.ops.import_scene.gltf, 23 | "usd": bpy.ops.import_scene.usd, 24 | "fbx": bpy.ops.import_scene.fbx, 25 | "stl": bpy.ops.import_mesh.stl, 26 | "usda": bpy.ops.import_scene.usda, 27 | "dae": bpy.ops.wm.collada_import, 28 | "ply": bpy.ops.import_mesh.ply, 29 | "abc": bpy.ops.wm.alembic_import, 30 | "blend": bpy.ops.wm.append, 31 | } 32 | 33 | 34 | def reset_cameras() -> None: 35 | """Resets the cameras in the scene to a single default camera.""" 36 | # Delete all existing cameras 37 | bpy.ops.object.select_all(action="DESELECT") 38 | bpy.ops.object.select_by_type(type="CAMERA") 39 | bpy.ops.object.delete() 40 | 41 | # Create a new camera with default properties 42 | bpy.ops.object.camera_add() 43 | 44 | # Rename the new camera to 'NewDefaultCamera' 45 | new_camera = bpy.context.active_object 46 | new_camera.name = "Camera" 47 | 48 | # Set the new camera as the active camera for the scene 49 | scene.camera = new_camera 50 | 51 | 52 | def sample_point_on_sphere(radius: float) -> Tuple[float, float, float]: 53 | """Samples a point on a sphere with the given radius. 54 | 55 | Args: 56 | radius (float): Radius of the sphere. 57 | 58 | Returns: 59 | Tuple[float, float, float]: A point on the sphere. 60 | """ 61 | theta = random.random() * 2 * math.pi 62 | phi = math.acos(2 * random.random() - 1) 63 | return ( 64 | radius * math.sin(phi) * math.cos(theta), 65 | radius * math.sin(phi) * math.sin(theta), 66 | radius * math.cos(phi), 67 | ) 68 | 69 | 70 | def _sample_spherical( 71 | radius_min: float = 1.5, 72 | radius_max: float = 2.0, 73 | maxz: float = 1.6, 74 | minz: float = -0.75, 75 | ) -> np.ndarray: 76 | """Sample a random point in a spherical shell. 77 | 78 | Args: 79 | radius_min (float): Minimum radius of the spherical shell. 80 | radius_max (float): Maximum radius of the spherical shell. 81 | maxz (float): Maximum z value of the spherical shell. 82 | minz (float): Minimum z value of the spherical shell. 83 | 84 | Returns: 85 | np.ndarray: A random (x, y, z) point in the spherical shell. 86 | """ 87 | correct = False 88 | vec = np.array([0, 0, 0]) 89 | while not correct: 90 | vec = np.random.uniform(-1, 1, 3) 91 | # vec[2] = np.abs(vec[2]) 92 | radius = np.random.uniform(radius_min, radius_max, 1) 93 | vec = vec / np.linalg.norm(vec, axis=0) * radius[0] 94 | if maxz > vec[2] > minz: 95 | correct = True 96 | return vec 97 | 98 | 99 | # def randomize_camera( 100 | # radius_min: float = 5, 101 | # radius_max: float = 5, 102 | # maxz: float = 2.2, 103 | # minz: float = -2.2, 104 | # only_northern_hemisphere: bool = False, 105 | # ) -> bpy.types.Object: 106 | # """Randomizes the camera location and rotation inside of a spherical shell. 107 | 108 | # Args: 109 | # radius_min (float, optional): Minimum radius of the spherical shell. Defaults to 110 | # 1.5. 111 | # radius_max (float, optional): Maximum radius of the spherical shell. Defaults to 112 | # 2.0. 113 | # maxz (float, optional): Maximum z value of the spherical shell. Defaults to 1.6. 114 | # minz (float, optional): Minimum z value of the spherical shell. Defaults to 115 | # -0.75. 116 | # only_northern_hemisphere (bool, optional): Whether to only sample points in the 117 | # northern hemisphere. Defaults to False. 118 | 119 | # Returns: 120 | # bpy.types.Object: The camera object. 121 | # """ 122 | 123 | # x, y, z = _sample_spherical( 124 | # radius_min=radius_min, radius_max=radius_max, maxz=maxz, minz=minz 125 | # ) 126 | # camera = bpy.data.objects["Camera"] 127 | 128 | # # only positive z 129 | # if only_northern_hemisphere: 130 | # z = abs(z) 131 | 132 | # camera.location = Vector(np.array([x, y, z])) 133 | 134 | # direction = -camera.location 135 | # rot_quat = direction.to_track_quat("-Z", "Y") 136 | # camera.rotation_euler = rot_quat.to_euler() 137 | 138 | # return camera 139 | 140 | 141 | def randomize_camera(camera_dist=2.0,Direction_type='front',az_front_vector=None): 142 | direction = random_unit_vector() 143 | set_camera(direction, camera_dist=camera_dist,Direction_type=Direction_type,az_front_vector=az_front_vector) 144 | 145 | 146 | 147 | def _set_camera_at_size(i: int, scale: float = 1.5) -> bpy.types.Object: 148 | """Debugging function to set the camera on the 6 faces of a cube. 149 | 150 | Args: 151 | i (int): Index of the face of the cube. 152 | scale (float, optional): Scale of the cube. Defaults to 1.5. 153 | 154 | Returns: 155 | bpy.types.Object: The camera object. 156 | """ 157 | if i == 0: 158 | x, y, z = scale, 0, 0 159 | elif i == 1: 160 | x, y, z = -scale, 0, 0 161 | elif i == 2: 162 | x, y, z = 0, scale, 0 163 | elif i == 3: 164 | x, y, z = 0, -scale, 0 165 | elif i == 4: 166 | x, y, z = 0, 0, scale 167 | elif i == 5: 168 | x, y, z = 0, 0, -scale 169 | else: 170 | raise ValueError(f"Invalid index: i={i}, must be int in range [0, 5].") 171 | camera = bpy.data.objects["Camera"] 172 | camera.location = Vector(np.array([x, y, z])) 173 | direction = -camera.location 174 | rot_quat = direction.to_track_quat("-Z", "Y") 175 | camera.rotation_euler = rot_quat.to_euler() 176 | return camera 177 | 178 | 179 | def _create_light( 180 | name: str, 181 | light_type: Literal["POINT", "SUN", "SPOT", "AREA"], 182 | location: Tuple[float, float, float], 183 | rotation: Tuple[float, float, float], 184 | energy: float, 185 | use_shadow: bool = False, 186 | specular_factor: float = 1.0, 187 | ): 188 | """Creates a light object. 189 | 190 | Args: 191 | name (str): Name of the light object. 192 | light_type (Literal["POINT", "SUN", "SPOT", "AREA"]): Type of the light. 193 | location (Tuple[float, float, float]): Location of the light. 194 | rotation (Tuple[float, float, float]): Rotation of the light. 195 | energy (float): Energy of the light. 196 | use_shadow (bool, optional): Whether to use shadows. Defaults to False. 197 | specular_factor (float, optional): Specular factor of the light. Defaults to 1.0. 198 | 199 | Returns: 200 | bpy.types.Object: The light object. 201 | """ 202 | 203 | light_data = bpy.data.lights.new(name=name, type=light_type) 204 | light_object = bpy.data.objects.new(name, light_data) 205 | bpy.context.collection.objects.link(light_object) 206 | light_object.location = location 207 | light_object.rotation_euler = rotation 208 | light_data.use_shadow = use_shadow 209 | light_data.specular_factor = specular_factor 210 | light_data.energy = energy 211 | return light_object 212 | 213 | 214 | def randomize_lighting() -> Dict[str, bpy.types.Object]: 215 | """Randomizes the lighting in the scene. 216 | 217 | Returns: 218 | Dict[str, bpy.types.Object]: Dictionary of the lights in the scene. The keys are 219 | "key_light", "fill_light", "rim_light", and "bottom_light". 220 | """ 221 | 222 | # Clear existing lights 223 | bpy.ops.object.select_all(action="DESELECT") 224 | bpy.ops.object.select_by_type(type="LIGHT") 225 | bpy.ops.object.delete() 226 | 227 | # Create key light 228 | key_light = _create_light( 229 | name="Key_Light", 230 | light_type="SUN", 231 | location=(0, 0, 0), 232 | rotation=(0.785398, 0, -0.785398), 233 | energy=random.choice([3, 4, 5]), 234 | ) 235 | 236 | # Create fill light 237 | fill_light = _create_light( 238 | name="Fill_Light", 239 | light_type="SUN", 240 | location=(0, 0, 0), 241 | rotation=(0.785398, 0, 2.35619), 242 | energy=random.choice([2, 3, 4]), 243 | ) 244 | 245 | # Create rim light 246 | rim_light = _create_light( 247 | name="Rim_Light", 248 | light_type="SUN", 249 | location=(0, 0, 0), 250 | rotation=(-0.785398, 0, -3.92699), 251 | energy=random.choice([3, 4, 5]), 252 | ) 253 | 254 | # Create bottom light 255 | bottom_light = _create_light( 256 | name="Bottom_Light", 257 | light_type="SUN", 258 | location=(0, 0, 0), 259 | rotation=(3.14159, 0, 0), 260 | energy=random.choice([1, 2, 3]), 261 | ) 262 | 263 | return dict( 264 | key_light=key_light, 265 | fill_light=fill_light, 266 | rim_light=rim_light, 267 | bottom_light=bottom_light, 268 | ) 269 | 270 | 271 | def reset_scene() -> None: 272 | """Resets the scene to a clean state. 273 | 274 | Returns: 275 | None 276 | """ 277 | # delete everything that isn't part of a camera or a light 278 | for obj in bpy.data.objects: 279 | if obj.type not in {"CAMERA", "LIGHT"}: 280 | bpy.data.objects.remove(obj, do_unlink=True) 281 | 282 | # delete all the materials 283 | for material in bpy.data.materials: 284 | bpy.data.materials.remove(material, do_unlink=True) 285 | 286 | # delete all the textures 287 | for texture in bpy.data.textures: 288 | bpy.data.textures.remove(texture, do_unlink=True) 289 | 290 | # delete all the images 291 | for image in bpy.data.images: 292 | bpy.data.images.remove(image, do_unlink=True) 293 | 294 | 295 | def load_object(object_path: str) -> None: 296 | """Loads a model with a supported file extension into the scene. 297 | 298 | Args: 299 | object_path (str): Path to the model file. 300 | 301 | Raises: 302 | ValueError: If the file extension is not supported. 303 | 304 | Returns: 305 | None 306 | """ 307 | file_extension = object_path.split(".")[-1].lower() 308 | if file_extension is None: 309 | raise ValueError(f"Unsupported file type: {object_path}") 310 | 311 | if file_extension == "usdz": 312 | # install usdz io package 313 | dirname = os.path.dirname(os.path.realpath(__file__)) 314 | usdz_package = os.path.join(dirname, "io_scene_usdz.zip") 315 | bpy.ops.preferences.addon_install(filepath=usdz_package) 316 | # enable it 317 | addon_name = "io_scene_usdz" 318 | bpy.ops.preferences.addon_enable(module=addon_name) 319 | # import the usdz 320 | from io_scene_usdz.import_usdz import import_usdz 321 | 322 | import_usdz(context, filepath=object_path, materials=True, animations=True) 323 | return None 324 | 325 | # load from existing import functions 326 | import_function = IMPORT_FUNCTIONS[file_extension] 327 | 328 | if file_extension == "blend": 329 | import_function(directory=object_path, link=False) 330 | elif file_extension in {"glb", "gltf"}: 331 | import_function(filepath=object_path, merge_vertices=True) 332 | else: 333 | import_function(filepath=object_path) 334 | 335 | 336 | def scene_bbox( 337 | single_obj: Optional[bpy.types.Object] = None, ignore_matrix: bool = False 338 | ) -> Tuple[Vector, Vector]: 339 | """Returns the bounding box of the scene. 340 | 341 | Taken from Shap-E rendering script 342 | (https://github.com/openai/shap-e/blob/main/shap_e/rendering/blender/blender_script.py#L68-L82) 343 | 344 | Args: 345 | single_obj (Optional[bpy.types.Object], optional): If not None, only computes 346 | the bounding box for the given object. Defaults to None. 347 | ignore_matrix (bool, optional): Whether to ignore the object's matrix. Defaults 348 | to False. 349 | 350 | Raises: 351 | RuntimeError: If there are no objects in the scene. 352 | 353 | Returns: 354 | Tuple[Vector, Vector]: The minimum and maximum coordinates of the bounding box. 355 | """ 356 | bbox_min = (math.inf,) * 3 357 | bbox_max = (-math.inf,) * 3 358 | found = False 359 | for obj in get_scene_meshes() if single_obj is None else [single_obj]: 360 | found = True 361 | for coord in obj.bound_box: 362 | coord = Vector(coord) 363 | if not ignore_matrix: 364 | coord = obj.matrix_world @ coord 365 | bbox_min = tuple(min(x, y) for x, y in zip(bbox_min, coord)) 366 | bbox_max = tuple(max(x, y) for x, y in zip(bbox_max, coord)) 367 | 368 | if not found: 369 | raise RuntimeError("no objects in scene to compute bounding box for") 370 | 371 | return Vector(bbox_min), Vector(bbox_max) 372 | 373 | 374 | def get_scene_root_objects() -> Generator[bpy.types.Object, None, None]: 375 | """Returns all root objects in the scene. 376 | 377 | Yields: 378 | Generator[bpy.types.Object, None, None]: Generator of all root objects in the 379 | scene. 380 | """ 381 | for obj in bpy.context.scene.objects.values(): 382 | if not obj.parent: 383 | yield obj 384 | 385 | 386 | def get_scene_meshes() -> Generator[bpy.types.Object, None, None]: 387 | """Returns all meshes in the scene. 388 | 389 | Yields: 390 | Generator[bpy.types.Object, None, None]: Generator of all meshes in the scene. 391 | """ 392 | for obj in bpy.context.scene.objects.values(): 393 | if isinstance(obj.data, (bpy.types.Mesh)): 394 | yield obj 395 | 396 | 397 | def get_3x4_RT_matrix_from_blender(cam: bpy.types.Object) -> Matrix: 398 | """Returns the 3x4 RT matrix from the given camera. 399 | 400 | Taken from Zero123, which in turn was taken from 401 | https://github.com/panmari/stanford-shapenet-renderer/blob/master/render_blender.py 402 | 403 | Args: 404 | cam (bpy.types.Object): The camera object. 405 | 406 | Returns: 407 | Matrix: The 3x4 RT matrix from the given camera. 408 | """ 409 | # Use matrix_world instead to account for all constraints 410 | location, rotation = cam.matrix_world.decompose()[0:2] 411 | R_world2bcam = rotation.to_matrix().transposed() 412 | 413 | # Use location from matrix_world to account for constraints: 414 | T_world2bcam = -1 * R_world2bcam @ location 415 | 416 | # put into 3x4 matrix 417 | RT = Matrix( 418 | ( 419 | R_world2bcam[0][:] + (T_world2bcam[0],), 420 | R_world2bcam[1][:] + (T_world2bcam[1],), 421 | R_world2bcam[2][:] + (T_world2bcam[2],), 422 | ) 423 | ) 424 | return RT 425 | 426 | 427 | def delete_invisible_objects() -> None: 428 | """Deletes all invisible objects in the scene. 429 | 430 | Returns: 431 | None 432 | """ 433 | bpy.ops.object.select_all(action="DESELECT") 434 | for obj in scene.objects: 435 | if obj.hide_viewport or obj.hide_render: 436 | obj.hide_viewport = False 437 | obj.hide_render = False 438 | obj.hide_select = False 439 | obj.select_set(True) 440 | bpy.ops.object.delete() 441 | 442 | # Delete invisible collections 443 | invisible_collections = [col for col in bpy.data.collections if col.hide_viewport] 444 | for col in invisible_collections: 445 | bpy.data.collections.remove(col) 446 | 447 | 448 | def normalize_scene() -> None: 449 | """Normalizes the scene by scaling and translating it to fit in a unit cube centered 450 | at the origin. 451 | 452 | Mostly taken from the Point-E / Shap-E rendering script 453 | (https://github.com/openai/point-e/blob/main/point_e/evals/scripts/blender_script.py#L97-L112), 454 | but fix for multiple root objects: (see bug report here: 455 | https://github.com/openai/shap-e/pull/60). 456 | 457 | Returns: 458 | None 459 | """ 460 | if len(list(get_scene_root_objects())) > 1: 461 | # create an empty object to be used as a parent for all root objects 462 | parent_empty = bpy.data.objects.new("ParentEmpty", None) 463 | bpy.context.scene.collection.objects.link(parent_empty) 464 | 465 | # parent all root objects to the empty object 466 | for obj in get_scene_root_objects(): 467 | if obj != parent_empty: 468 | obj.parent = parent_empty 469 | 470 | bbox_min, bbox_max = scene_bbox() 471 | scale = 1 / max(bbox_max - bbox_min) 472 | for obj in get_scene_root_objects(): 473 | obj.scale = obj.scale * scale 474 | 475 | # Apply scale to matrix_world. 476 | bpy.context.view_layer.update() 477 | bbox_min, bbox_max = scene_bbox() 478 | offset = -(bbox_min + bbox_max) / 2 479 | for obj in get_scene_root_objects(): 480 | obj.matrix_world.translation += offset 481 | bpy.ops.object.select_all(action="DESELECT") 482 | 483 | # unparent the camera 484 | bpy.data.objects["Camera"].parent = None 485 | 486 | 487 | def delete_missing_textures() -> Dict[str, Any]: 488 | """Deletes all missing textures in the scene. 489 | 490 | Returns: 491 | Dict[str, Any]: Dictionary with keys "count", "files", and "file_path_to_color". 492 | "count" is the number of missing textures, "files" is a list of the missing 493 | texture file paths, and "file_path_to_color" is a dictionary mapping the 494 | missing texture file paths to a random color. 495 | """ 496 | missing_file_count = 0 497 | out_files = [] 498 | file_path_to_color = {} 499 | 500 | # Check all materials in the scene 501 | for material in bpy.data.materials: 502 | if material.use_nodes: 503 | for node in material.node_tree.nodes: 504 | if node.type == "TEX_IMAGE": 505 | image = node.image 506 | if image is not None: 507 | file_path = bpy.path.abspath(image.filepath) 508 | if file_path == "": 509 | # means it's embedded 510 | continue 511 | 512 | if not os.path.exists(file_path): 513 | # Find the connected Principled BSDF node 514 | connected_node = node.outputs[0].links[0].to_node 515 | 516 | if connected_node.type == "BSDF_PRINCIPLED": 517 | if file_path not in file_path_to_color: 518 | # Set a random color for the unique missing file path 519 | random_color = [random.random() for _ in range(3)] 520 | file_path_to_color[file_path] = random_color + [1] 521 | 522 | connected_node.inputs[ 523 | "Base Color" 524 | ].default_value = file_path_to_color[file_path] 525 | 526 | # Delete the TEX_IMAGE node 527 | material.node_tree.nodes.remove(node) 528 | missing_file_count += 1 529 | out_files.append(image.filepath) 530 | return { 531 | "count": missing_file_count, 532 | "files": out_files, 533 | "file_path_to_color": file_path_to_color, 534 | } 535 | 536 | 537 | def _get_random_color() -> Tuple[float, float, float, float]: 538 | """Generates a random RGB-A color. 539 | 540 | The alpha value is always 1. 541 | 542 | Returns: 543 | Tuple[float, float, float, float]: A random RGB-A color. Each value is in the 544 | range [0, 1]. 545 | """ 546 | return (random.random(), random.random(), random.random(), 1) 547 | 548 | 549 | def _apply_color_to_object( 550 | obj: bpy.types.Object, color: Tuple[float, float, float, float] 551 | ) -> None: 552 | """Applies the given color to the object. 553 | 554 | Args: 555 | obj (bpy.types.Object): The object to apply the color to. 556 | color (Tuple[float, float, float, float]): The color to apply to the object. 557 | 558 | Returns: 559 | None 560 | """ 561 | mat = bpy.data.materials.new(name=f"RandomMaterial_{obj.name}") 562 | mat.use_nodes = True 563 | nodes = mat.node_tree.nodes 564 | principled_bsdf = nodes.get("Principled BSDF") 565 | if principled_bsdf: 566 | principled_bsdf.inputs["Base Color"].default_value = color 567 | obj.data.materials.append(mat) 568 | 569 | 570 | def apply_single_random_color_to_all_objects() -> Tuple[float, float, float, float]: 571 | """Applies a single random color to all objects in the scene. 572 | 573 | Returns: 574 | Tuple[float, float, float, float]: The random color that was applied to all 575 | objects. 576 | """ 577 | rand_color = _get_random_color() 578 | for obj in bpy.context.scene.objects: 579 | if obj.type == "MESH": 580 | _apply_color_to_object(obj, rand_color) 581 | return rand_color 582 | 583 | 584 | class MetadataExtractor: 585 | """Class to extract metadata from a Blender scene.""" 586 | 587 | def __init__( 588 | self, object_path: str, scene: bpy.types.Scene, bdata: bpy.types.BlendData 589 | ) -> None: 590 | """Initializes the MetadataExtractor. 591 | 592 | Args: 593 | object_path (str): Path to the object file. 594 | scene (bpy.types.Scene): The current scene object from `bpy.context.scene`. 595 | bdata (bpy.types.BlendData): The current blender data from `bpy.data`. 596 | 597 | Returns: 598 | None 599 | """ 600 | self.object_path = object_path 601 | self.scene = scene 602 | self.bdata = bdata 603 | 604 | def get_poly_count(self) -> int: 605 | """Returns the total number of polygons in the scene.""" 606 | total_poly_count = 0 607 | for obj in self.scene.objects: 608 | if obj.type == "MESH": 609 | total_poly_count += len(obj.data.polygons) 610 | return total_poly_count 611 | 612 | def get_vertex_count(self) -> int: 613 | """Returns the total number of vertices in the scene.""" 614 | total_vertex_count = 0 615 | for obj in self.scene.objects: 616 | if obj.type == "MESH": 617 | total_vertex_count += len(obj.data.vertices) 618 | return total_vertex_count 619 | 620 | def get_edge_count(self) -> int: 621 | """Returns the total number of edges in the scene.""" 622 | total_edge_count = 0 623 | for obj in self.scene.objects: 624 | if obj.type == "MESH": 625 | total_edge_count += len(obj.data.edges) 626 | return total_edge_count 627 | 628 | def get_lamp_count(self) -> int: 629 | """Returns the number of lamps in the scene.""" 630 | return sum(1 for obj in self.scene.objects if obj.type == "LIGHT") 631 | 632 | def get_mesh_count(self) -> int: 633 | """Returns the number of meshes in the scene.""" 634 | return sum(1 for obj in self.scene.objects if obj.type == "MESH") 635 | 636 | def get_material_count(self) -> int: 637 | """Returns the number of materials in the scene.""" 638 | return len(self.bdata.materials) 639 | 640 | def get_object_count(self) -> int: 641 | """Returns the number of objects in the scene.""" 642 | return len(self.bdata.objects) 643 | 644 | def get_animation_count(self) -> int: 645 | """Returns the number of animations in the scene.""" 646 | return len(self.bdata.actions) 647 | 648 | def get_linked_files(self) -> List[str]: 649 | """Returns the filepaths of all linked files.""" 650 | image_filepaths = self._get_image_filepaths() 651 | material_filepaths = self._get_material_filepaths() 652 | linked_libraries_filepaths = self._get_linked_libraries_filepaths() 653 | 654 | all_filepaths = ( 655 | image_filepaths | material_filepaths | linked_libraries_filepaths 656 | ) 657 | if "" in all_filepaths: 658 | all_filepaths.remove("") 659 | return list(all_filepaths) 660 | 661 | def _get_image_filepaths(self) -> Set[str]: 662 | """Returns the filepaths of all images used in the scene.""" 663 | filepaths = set() 664 | for image in self.bdata.images: 665 | if image.source == "FILE": 666 | filepaths.add(bpy.path.abspath(image.filepath)) 667 | return filepaths 668 | 669 | def _get_material_filepaths(self) -> Set[str]: 670 | """Returns the filepaths of all images used in materials.""" 671 | filepaths = set() 672 | for material in self.bdata.materials: 673 | if material.use_nodes: 674 | for node in material.node_tree.nodes: 675 | if node.type == "TEX_IMAGE": 676 | image = node.image 677 | if image is not None: 678 | filepaths.add(bpy.path.abspath(image.filepath)) 679 | return filepaths 680 | 681 | def _get_linked_libraries_filepaths(self) -> Set[str]: 682 | """Returns the filepaths of all linked libraries.""" 683 | filepaths = set() 684 | for library in self.bdata.libraries: 685 | filepaths.add(bpy.path.abspath(library.filepath)) 686 | return filepaths 687 | 688 | def get_scene_size(self) -> Dict[str, list]: 689 | """Returns the size of the scene bounds in meters.""" 690 | bbox_min, bbox_max = scene_bbox() 691 | return {"bbox_max": list(bbox_max), "bbox_min": list(bbox_min)} 692 | 693 | def get_shape_key_count(self) -> int: 694 | """Returns the number of shape keys in the scene.""" 695 | total_shape_key_count = 0 696 | for obj in self.scene.objects: 697 | if obj.type == "MESH": 698 | shape_keys = obj.data.shape_keys 699 | if shape_keys is not None: 700 | total_shape_key_count += ( 701 | len(shape_keys.key_blocks) - 1 702 | ) # Subtract 1 to exclude the Basis shape key 703 | return total_shape_key_count 704 | 705 | def get_armature_count(self) -> int: 706 | """Returns the number of armatures in the scene.""" 707 | total_armature_count = 0 708 | for obj in self.scene.objects: 709 | if obj.type == "ARMATURE": 710 | total_armature_count += 1 711 | return total_armature_count 712 | 713 | def read_file_size(self) -> int: 714 | """Returns the size of the file in bytes.""" 715 | return os.path.getsize(self.object_path) 716 | 717 | def get_metadata(self) -> Dict[str, Any]: 718 | """Returns the metadata of the scene. 719 | 720 | Returns: 721 | Dict[str, Any]: Dictionary of the metadata with keys for "file_size", 722 | "poly_count", "vert_count", "edge_count", "material_count", "object_count", 723 | "lamp_count", "mesh_count", "animation_count", "linked_files", "scene_size", 724 | "shape_key_count", and "armature_count". 725 | """ 726 | return { 727 | "file_size": self.read_file_size(), 728 | "poly_count": self.get_poly_count(), 729 | "vert_count": self.get_vertex_count(), 730 | "edge_count": self.get_edge_count(), 731 | "material_count": self.get_material_count(), 732 | "object_count": self.get_object_count(), 733 | "lamp_count": self.get_lamp_count(), 734 | "mesh_count": self.get_mesh_count(), 735 | "animation_count": self.get_animation_count(), 736 | "linked_files": self.get_linked_files(), 737 | "scene_size": self.get_scene_size(), 738 | "shape_key_count": self.get_shape_key_count(), 739 | "armature_count": self.get_armature_count(), 740 | } 741 | 742 | def place_camera(time, camera_pose_mode="random", camera_dist_min=2.0, camera_dist_max=2.0,Direction_type='front',elevation=0,azimuth=0,az_front_vector=None): 743 | camera_dist = random.uniform(camera_dist_min, camera_dist_max) 744 | if camera_pose_mode == "random": 745 | randomize_camera(camera_dist=camera_dist,Direction_type=Direction_type,az_front_vector=az_front_vector) 746 | # bpy.ops.view3d.camera_to_view_selected() 747 | elif camera_pose_mode == "z-circular": 748 | pan_camera(time, axis="Z", camera_dist=camera_dist,elevation=elevation,Direction_type=Direction_type,azimuth=azimuth) 749 | elif camera_pose_mode == "z-circular-elevated": 750 | pan_camera(time, axis="Z", camera_dist=camera_dist, elevation=0.2617993878,Direction_type=Direction_type) 751 | else: 752 | raise ValueError(f"Unknown camera pose mode: {camera_pose_mode}") 753 | 754 | def pan_camera(time, axis="Z", camera_dist=2.0, elevation=-0.1,Direction_type='multi',azimuth=0): 755 | angle = (math.pi *2 -time * math.pi * 2)+ azimuth * math.pi * 2 756 | #example 15-345 757 | direction = [-math.cos(angle), -math.sin(angle), -elevation] 758 | direction = [math.sin(angle), math.cos(angle), -elevation] 759 | assert axis in ["X", "Y", "Z"] 760 | if axis == "X": 761 | direction = [direction[2], *direction[:2]] 762 | elif axis == "Y": 763 | direction = [direction[0], -elevation, direction[1]] 764 | direction = Vector(direction).normalized() 765 | set_camera(direction, camera_dist=camera_dist,Direction_type=Direction_type) 766 | 767 | 768 | def set_camera(direction, camera_dist=2.0,Direction_type='front',az_front_vector=None): 769 | if Direction_type=='front': 770 | direction=Vector((0, 1, 0)).normalized() 771 | elif Direction_type=='back': 772 | direction=Vector((0, -1, 0)).normalized() 773 | elif Direction_type=='left': 774 | direction=Vector((1, 0, 0)).normalized() 775 | elif Direction_type=='right': 776 | direction=Vector((-1, 0, 0)).normalized() 777 | elif Direction_type=='az_front': 778 | direction=az_front_vector 779 | 780 | 781 | print('direction:',direction) 782 | camera_pos = -camera_dist * direction 783 | bpy.context.scene.camera.location = camera_pos 784 | 785 | # https://blender.stackexchange.com/questions/5210/pointing-the-camera-in-a-particular-direction-programmatically 786 | rot_quat = direction.to_track_quat("-Z", "Y") 787 | bpy.context.scene.camera.rotation_euler = rot_quat.to_euler() 788 | 789 | bpy.context.view_layer.update() 790 | 791 | def write_camera_metadata(path): 792 | x_fov, y_fov = scene_fov() 793 | bbox_min, bbox_max = scene_bbox() 794 | matrix = bpy.context.scene.camera.matrix_world 795 | matrix_world_np = np.array(matrix) 796 | 797 | with open(path, "w") as f: 798 | json.dump( 799 | dict( 800 | matrix_world=matrix_world_np.tolist(), 801 | format_version=6, 802 | max_depth=5.0, 803 | bbox=[list(bbox_min), list(bbox_max)], 804 | origin=list(matrix.col[3])[:3], 805 | x_fov=x_fov, 806 | y_fov=y_fov, 807 | x=list(matrix.col[0])[:3], 808 | y=list(-matrix.col[1])[:3], 809 | z=list(-matrix.col[2])[:3], 810 | ), 811 | f, 812 | ) 813 | 814 | def scene_fov(): 815 | x_fov = bpy.context.scene.camera.data.angle_x 816 | y_fov = bpy.context.scene.camera.data.angle_y 817 | width = bpy.context.scene.render.resolution_x 818 | height = bpy.context.scene.render.resolution_y 819 | if bpy.context.scene.camera.data.angle == x_fov: 820 | y_fov = 2 * math.atan(math.tan(x_fov / 2) * height / width) 821 | else: 822 | x_fov = 2 * math.atan(math.tan(y_fov / 2) * width / height) 823 | return x_fov, y_fov 824 | 825 | 826 | def render_object( 827 | object_file: str, 828 | frame_num: int, 829 | only_northern_hemisphere: bool, 830 | output_dir: str, 831 | elevation:int, 832 | azimuth:float, 833 | ) -> None: 834 | """Saves rendered images with its camera matrix and metadata of the object. 835 | 836 | Args: 837 | object_file (str): Path to the object file. 838 | frame_num (int): Number of renders to save of the object. 839 | only_northern_hemisphere (bool): Whether to only render sides of the object that 840 | are in the northern hemisphere. This is useful for rendering objects that 841 | are photogrammetrically scanned, as the bottom of the object often has 842 | holes. 843 | output_dir (str): Path to the directory where the rendered images and metadata 844 | will be saved. 845 | 846 | Returns: 847 | None 848 | """ 849 | os.makedirs(output_dir, exist_ok=True) 850 | 851 | # load the object 852 | if object_file.endswith(".blend"): 853 | bpy.ops.object.mode_set(mode="OBJECT") 854 | #bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS') 855 | reset_cameras() 856 | delete_invisible_objects() 857 | else: 858 | reset_scene() 859 | load_object(object_file) 860 | 861 | # Set up cameras 862 | # cam = scene.objects["Camera"] 863 | # cam.data.lens = 35 864 | # cam.data.sensor_width = 32 865 | 866 | # # Set up camera constraints 867 | # cam_constraint = cam.constraints.new(type="TRACK_TO") 868 | # cam_constraint.track_axis = "TRACK_NEGATIVE_Z" 869 | # cam_constraint.up_axis = "UP_Y" 870 | # empty = bpy.data.objects.new("Empty", None) 871 | # scene.collection.objects.link(empty) 872 | # cam_constraint.target = empty 873 | 874 | # Extract the metadata. This must be done before normalizing the scene to get 875 | # accurate bounding box information. 876 | metadata_extractor = MetadataExtractor( 877 | object_path=object_file, scene=scene, bdata=bpy.data 878 | ) 879 | metadata = metadata_extractor.get_metadata() 880 | print(metadata) 881 | 882 | # delete all objects that are not meshes 883 | if object_file.lower().endswith(".usdz"): 884 | # don't delete missing textures on usdz files, lots of them are embedded 885 | missing_textures = None 886 | else: 887 | missing_textures = delete_missing_textures() 888 | metadata["missing_textures"] = missing_textures 889 | 890 | # possibly apply a random color to all objects 891 | if object_file.endswith(".stl") or object_file.endswith(".ply"): 892 | assert len(bpy.context.selected_objects) == 1 893 | rand_color = apply_single_random_color_to_all_objects() 894 | metadata["random_color"] = rand_color 895 | else: 896 | metadata["random_color"] = None 897 | 898 | # save metadata 899 | metadata_path = os.path.join(output_dir, "metadata.json") 900 | os.makedirs(os.path.dirname(metadata_path), exist_ok=True) 901 | with open(metadata_path, "w", encoding="utf-8") as f: 902 | json.dump(metadata, f, sort_keys=True, indent=2) 903 | 904 | # normalize the scene 905 | normalize_scene() 906 | 907 | # randomize the lighting 908 | randomize_lighting() 909 | # camera = bpy.data.objects["Camera"] 910 | # camera.location = Vector((0.0, -4.0, 0.0)) 911 | # look_at(camera, Vector((0.0, 0.0, 0.0))) 912 | 913 | 914 | camera_pose="random" 915 | camera_dist_min=2 916 | camera_dist_max=2 917 | # render the images 918 | 919 | 920 | angle = azimuth * math.pi * 2 921 | direction = [math.sin(angle), math.cos(angle), 0] 922 | direction_az = Vector(direction).normalized() 923 | 924 | for frame in range(frame_num): 925 | if args.mode_multi: 926 | t = frame / max(frame_num - 1, 1) 927 | place_camera( 928 | t, 929 | camera_pose_mode="z-circular", 930 | camera_dist_min=camera_dist_min, 931 | camera_dist_max=camera_dist_max, 932 | Direction_type='multi', 933 | elevation=elevation, 934 | azimuth=azimuth 935 | ) 936 | bpy.context.scene.frame_set(frame) 937 | render_path = os.path.join(output_dir, f"multi_frame{frame}.png") #view and frame 938 | scene.render.filepath = render_path 939 | bpy.ops.render.render(write_still=True) 940 | write_camera_metadata(os.path.join(output_dir, f"multi{frame}.json")) 941 | 942 | 943 | if args.mode_front: 944 | place_camera( 945 | 0, 946 | camera_pose_mode="random", 947 | camera_dist_min=camera_dist_min, 948 | camera_dist_max=camera_dist_max, 949 | Direction_type='az_front', 950 | az_front_vector=direction_az 951 | ) 952 | bpy.context.scene.frame_set(frame) 953 | render_path = os.path.join(output_dir, f"front_frame{frame}.png") #view and frame 954 | scene.render.filepath = render_path 955 | bpy.ops.render.render(write_still=True) 956 | 957 | write_camera_metadata(os.path.join(output_dir, f"front.json")) 958 | 959 | #print('args.mode_four_view:',args.mode_four_view) 960 | if args.mode_four_view: 961 | #front 962 | place_camera( 963 | 0, 964 | camera_pose_mode="random", 965 | camera_dist_min=camera_dist_min, 966 | camera_dist_max=camera_dist_max, 967 | Direction_type='front' 968 | ) 969 | bpy.context.scene.frame_set(frame) 970 | render_path = os.path.join(output_dir, f"front_frame{frame}.png") #view and frame 971 | scene.render.filepath = render_path 972 | bpy.ops.render.render(write_still=True) 973 | write_camera_metadata(os.path.join(output_dir, f"front.json")) 974 | 975 | place_camera( 976 | 0, 977 | camera_pose_mode="random", 978 | camera_dist_min=camera_dist_min, 979 | camera_dist_max=camera_dist_max, 980 | Direction_type='back' 981 | ) 982 | bpy.context.scene.frame_set(frame) 983 | render_path = os.path.join(output_dir, f"back_frame{frame}.png") #view and frame 984 | scene.render.filepath = render_path 985 | bpy.ops.render.render(write_still=True) 986 | write_camera_metadata(os.path.join(output_dir, f"back.json")) 987 | 988 | place_camera( 989 | 0, 990 | camera_pose_mode="random", 991 | camera_dist_min=camera_dist_min, 992 | camera_dist_max=camera_dist_max, 993 | Direction_type='left' 994 | ) 995 | bpy.context.scene.frame_set(frame) 996 | render_path = os.path.join(output_dir, f"left_frame{frame}.png") #view and frame 997 | scene.render.filepath = render_path 998 | bpy.ops.render.render(write_still=True) 999 | write_camera_metadata(os.path.join(output_dir, f"left.json")) 1000 | 1001 | place_camera( 1002 | 0, 1003 | camera_pose_mode="random", 1004 | camera_dist_min=camera_dist_min, 1005 | camera_dist_max=camera_dist_max, 1006 | Direction_type='right' 1007 | ) 1008 | bpy.context.scene.frame_set(frame) 1009 | render_path = os.path.join(output_dir, f"right_frame{frame}.png") #view and frame 1010 | scene.render.filepath = render_path 1011 | bpy.ops.render.render(write_still=True) 1012 | write_camera_metadata(os.path.join(output_dir, f"right.json")) 1013 | 1014 | for frame in range(frame_num): 1015 | if args.mode_static: 1016 | t = frame / max(frame_num - 1, 1) 1017 | place_camera( 1018 | t, 1019 | camera_pose_mode="z-circular", 1020 | camera_dist_min=camera_dist_min, 1021 | camera_dist_max=camera_dist_max, 1022 | Direction_type='multi', 1023 | elevation=elevation, 1024 | azimuth=azimuth 1025 | ) 1026 | bpy.context.scene.frame_set(0) 1027 | render_path = os.path.join(output_dir, f"multi_static_frame{frame}.png") #view and frame 1028 | scene.render.filepath = render_path 1029 | bpy.ops.render.render(write_still=True) 1030 | write_camera_metadata(os.path.join(output_dir, f"static{frame}.json")) 1031 | 1032 | 1033 | 1034 | 1035 | def look_at(obj_camera, point): 1036 | # Calculate the direction vector from the camera to the point 1037 | direction = point - obj_camera.location 1038 | # Make the camera look in this direction 1039 | rot_quat = direction.to_track_quat('-Z', 'Y') 1040 | obj_camera.rotation_euler = rot_quat.to_euler() 1041 | 1042 | if __name__ == "__main__": 1043 | parser = argparse.ArgumentParser() 1044 | parser.add_argument( 1045 | "--object_path", 1046 | type=str, 1047 | #required=True, 1048 | help="Path of the object file", 1049 | ) 1050 | parser.add_argument( 1051 | "--output_dir", 1052 | default='output_duck', 1053 | type=str, 1054 | #required=True, 1055 | help="Path to the directory where the rendered images and metadata will be saved.", 1056 | ) 1057 | parser.add_argument( 1058 | "--engine", 1059 | type=str, 1060 | default="CYCLES", 1061 | choices=["CYCLES", "BLENDER_EEVEE"], 1062 | ) 1063 | parser.add_argument( 1064 | "--only_northern_hemisphere", 1065 | action="store_true", 1066 | help="Only render the northern hemisphere of the object.", 1067 | default=False, 1068 | ) 1069 | parser.add_argument( 1070 | "--frame_num", 1071 | type=int, 1072 | default=24, 1073 | help="Number of frame to save of the object.", 1074 | ) 1075 | parser.add_argument( 1076 | "--gpu_id", 1077 | type=int, 1078 | default=0, 1079 | help="current gpu id", 1080 | ) 1081 | 1082 | parser.add_argument( 1083 | "--elevation", 1084 | type=int, 1085 | default=0, 1086 | help="elevation of each object", 1087 | ) 1088 | 1089 | parser.add_argument( 1090 | "--azimuth", 1091 | type=float, 1092 | default=0, 1093 | help="azimuth of each object", 1094 | ) 1095 | parser.add_argument( 1096 | "--resolution", 1097 | type=int, 1098 | default=256, 1099 | help="azimuth of each object", 1100 | ) 1101 | 1102 | parser.add_argument( 1103 | "--mode_multi", 1104 | type=int, default=0, 1105 | help="render multi-view images at each time", 1106 | ) 1107 | 1108 | parser.add_argument( 1109 | "--mode_four_view", 1110 | type=int, default=0, 1111 | help="render images of four views at each time", 1112 | ) 1113 | 1114 | parser.add_argument( 1115 | "--mode_static", 1116 | type=int, default=0, 1117 | help="render multi view images at time 0", 1118 | ) 1119 | 1120 | parser.add_argument( 1121 | "--mode_front", 1122 | type=int, default=0, 1123 | help="render images of front views at each time", 1124 | ) 1125 | 1126 | 1127 | argv = sys.argv[sys.argv.index("--") + 1 :] 1128 | args = parser.parse_args(argv) 1129 | #args = parser.parse_args() 1130 | os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu_id) 1131 | context = bpy.context 1132 | scene = context.scene 1133 | render = scene.render 1134 | 1135 | # Set render settings 1136 | render.engine = args.engine 1137 | render.image_settings.file_format = "PNG" 1138 | render.image_settings.color_mode = "RGBA" 1139 | render.resolution_x = args.resolution 1140 | render.resolution_y = args.resolution 1141 | render.resolution_percentage = 100 1142 | 1143 | #Set cycles settings 1144 | # dev_list = [3,5] 1145 | # gpus = enable_gpus("CUDA", dev_list) 1146 | # print("Activated gpu's: ") 1147 | # print(gpus) 1148 | 1149 | scene.cycles.device = "GPU" 1150 | scene.cycles.samples = 128 1151 | scene.cycles.diffuse_bounces = 1 1152 | scene.cycles.glossy_bounces = 1 1153 | scene.cycles.transparent_max_bounces = 3 1154 | scene.cycles.transmission_bounces = 3 1155 | scene.cycles.filter_width = 0.01 1156 | scene.cycles.use_denoising = True 1157 | scene.render.film_transparent = True 1158 | bpy.context.preferences.addons["cycles"].preferences.get_devices() 1159 | bpy.context.preferences.addons[ 1160 | "cycles" 1161 | ].preferences.compute_device_type = "CUDA" # or "OPENCL" 1162 | 1163 | 1164 | # Render the images 1165 | render_object( 1166 | object_file=args.object_path, 1167 | frame_num=args.frame_num, 1168 | only_northern_hemisphere=args.only_northern_hemisphere, 1169 | output_dir=args.output_dir, 1170 | elevation=args.elevation/180, 1171 | azimuth=args.azimuth, 1172 | 1173 | ) 1174 | -------------------------------------------------------------------------------- /rendering/download.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import objaverse 3 | import multiprocessing 4 | 5 | parser = argparse.ArgumentParser() 6 | parser.add_argument("--id_path", type=str, default="src/sample.txt") 7 | args = parser.parse_args() 8 | multiprocessing_cpu_count=multiprocessing.cpu_count() 9 | 10 | with open(args.id_path, 'r', encoding='utf-8') as file: 11 | lines = file.readlines() 12 | object_uids = [line.strip() for line in lines] 13 | # print(object_uids) 14 | print('file number:', len(object_uids)) 15 | 16 | # objaverse.BASE_PATH = '/home/projects/Diffusion4D/rendering/' 17 | objaverse._VERSIONED_PATH = 'obj_v1/' 18 | objaverse.load_objects( 19 | uids=object_uids, 20 | download_processes=multiprocessing_cpu_count 21 | ) 22 | print('download finished') 23 | -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame0.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame1.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame10.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame11.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame12.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame13.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame14.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame15.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame16.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame17.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame18.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame19.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame2.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame20.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame21.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame22.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame23.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame3.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame4.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame5.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame6.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame7.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame8.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/front_frame9.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame0.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame1.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame10.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame11.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame12.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame13.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame14.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame15.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame16.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame17.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame18.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame19.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame2.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame20.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame21.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame22.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame23.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame3.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame4.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame5.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame6.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame7.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame8.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_frame9.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame0.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame1.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame10.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame11.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame12.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame13.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame14.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame15.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame16.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame17.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame18.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame19.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame2.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame20.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame21.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame22.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame23.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame3.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame4.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame5.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame6.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame7.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame8.png -------------------------------------------------------------------------------- /rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/2a7f866be31e43b89074f304a31ff82d/multi_static_frame9.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame0.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame1.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame10.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame11.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame12.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame13.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame14.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame15.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame16.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame17.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame18.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame19.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame2.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame20.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame21.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame22.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame23.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame3.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame4.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame5.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame6.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame7.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame8.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/front_frame9.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame0.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame1.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame10.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame11.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame12.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame13.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame14.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame15.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame16.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame17.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame18.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame19.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame2.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame20.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame21.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame22.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame23.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame3.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame4.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame5.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame6.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame7.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame8.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_frame9.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame0.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame1.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame10.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame11.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame12.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame13.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame14.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame15.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame16.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame17.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame18.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame19.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame2.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame20.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame21.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame22.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame23.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame3.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame4.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame5.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame6.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame7.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame8.png -------------------------------------------------------------------------------- /rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/output/900cafbf2ee3444d823026bd417010f0/multi_static_frame9.png -------------------------------------------------------------------------------- /rendering/render.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import concurrent.futures 4 | import subprocess 5 | import logging 6 | import random 7 | import argparse 8 | parser = argparse.ArgumentParser() 9 | parser.add_argument("--obj_path", type=str, default="./obj_data/hf-objaverse-v1/glbs") 10 | parser.add_argument("--save_dir", type=str, default='./output') 11 | parser.add_argument("--gpu_num", type=int, default=8) 12 | parser.add_argument("--frame_num", type=int, default=24) 13 | parser.add_argument("--azimuth_aug", type=int, default=0) 14 | parser.add_argument("--elevation_aug", type=int, default=0,) 15 | parser.add_argument("--resolution", default=256) 16 | parser.add_argument("--mode_multi", type=int, default=0) 17 | parser.add_argument("--mode_static", type=int, default=0) 18 | parser.add_argument("--mode_front_view", type=int, default=0) 19 | parser.add_argument("--mode_four_view", type=int, default=0) 20 | 21 | 22 | args = parser.parse_args() 23 | 24 | #read objavsers glb path 25 | glb_files = [] 26 | for root, dirs, files in os.walk(args.obj_path): 27 | for file in files: 28 | if file.endswith('.glb'): 29 | glb_file_path = os.path.join(root, file) 30 | glb_files.append(glb_file_path) 31 | 32 | 33 | os.makedirs(args.save_dir,exist_ok=True) 34 | 35 | 36 | def execute_command(args,glb_file, gpu_id,file_name): 37 | #print('args.azimuth_aug:',args.azimuth_aug) 38 | if args.azimuth_aug: 39 | azimuth=round(random.uniform(0, 1), 2) 40 | file_name+=f'_az{azimuth:.2f}' 41 | else: 42 | azimuth=0 43 | 44 | if args.elevation_aug: 45 | elevation= random.randint(5,30) 46 | file_name+=f'_el{elevation:.2f}' 47 | else: 48 | elevation=0 49 | 50 | 51 | save_path=os.path.join(args.save_dir,file_name) 52 | command=f'CUDA_VISIBLE_DEVICES={gpu_id} export DISPLAY=:0.1 && blender-3.2.2-linux-x64/blender \ 53 | --background --python blender.py -- \ 54 | --object_path {glb_file} \ 55 | --frame_num {args.frame_num} \ 56 | --output_dir {save_path} \ 57 | --gpu_id {gpu_id} \ 58 | --azimuth {azimuth}\ 59 | --elevation {elevation}\ 60 | --resolution {args.resolution} \ 61 | --mode_multi {args.mode_multi}\ 62 | --mode_static {args.mode_static}\ 63 | --mode_front {args.mode_front_view}\ 64 | --mode_four_view {args.mode_four_view}' 65 | 66 | print('command:',command) 67 | logging.info(f'Executing command: {command}') 68 | result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 69 | logging.info(result.stdout.decode()) 70 | logging.error(result.stderr.decode()) 71 | 72 | 73 | 74 | #distribute glb id to each gpu 75 | tasks = [(glb_file, i % args.gpu_num,os.path.basename(glb_file)) for i, glb_file in enumerate(glb_files)] 76 | 77 | 78 | #run 79 | with concurrent.futures.ProcessPoolExecutor(max_workers=args.gpu_num) as executor: 80 | futures = [executor.submit(execute_command, args,glb_file, gpu_id,file_name.split('.')[0]) for glb_file, gpu_id,file_name in tasks] 81 | logging.basicConfig(level=logging.INFO) 82 | concurrent.futures.wait(futures) 83 | 84 | -------------------------------------------------------------------------------- /rendering/render_script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/render_script.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/560430ec7088453c84d1ac6a568012c8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/560430ec7088453c84d1ac6a568012c8.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/706b873059ec439cb748748d480b5c4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/706b873059ec439cb748748d480b5c4c.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/7318c6d320eb4f958492ea942b3b52b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/7318c6d320eb4f958492ea942b3b52b0.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/7be6e8773be64a1da6bedae657e1a054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/7be6e8773be64a1da6bedae657e1a054.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/7c326907f7dd469789ec33c3f15ea13a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/7c326907f7dd469789ec33c3f15ea13a.png -------------------------------------------------------------------------------- /rendering/src/RemovedAssetSamples/8d6dd9025be64fe4aa64d79710a7a26e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VITA-Group/Diffusion4D/41ce66e6a9d7e6109d6b60a6fc307652bcbf0faf/rendering/src/RemovedAssetSamples/8d6dd9025be64fe4aa64d79710a7a26e.png -------------------------------------------------------------------------------- /rendering/src/sample.txt: -------------------------------------------------------------------------------- 1 | 2a7f866be31e43b89074f304a31ff82d 2 | 900cafbf2ee3444d823026bd417010f0 --------------------------------------------------------------------------------