├── .gitignore ├── README.md ├── data ├── bridge_pointcloud.npz ├── cow.mtl ├── cow.obj ├── cow_on_plane.mtl ├── cow_on_plane.obj ├── cow_on_plane.png ├── cow_texture.png ├── cow_with_axis.mtl ├── cow_with_axis.obj ├── cow_with_axis.png ├── joint_mesh.mtl ├── joint_mesh.obj ├── joint_mesh.png └── rgbd_data.pkl ├── images ├── bridge.jpg ├── cow_mesh_axis.png ├── cow_render.jpg ├── cow_retextured.jpg ├── dolly.gif ├── joint_mesh_result.png ├── plant.jpg ├── sphere_100.jpg ├── sphere_1000.jpg ├── sphere_200.jpg ├── sphere_500.jpg ├── sphere_mesh.jpg ├── transform1.jpg ├── transform2.jpg ├── transform3.jpg ├── transform4.jpg └── transform_none.jpg ├── requirements.txt └── starter ├── __init__.py ├── camera_transforms.py ├── dolly_zoom.py ├── render_generic.py ├── render_mesh.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 16-825 Assignment 1: Rendering Basics with PyTorch3D (Total: 100 Points + 10 Bonus) 2 | 3 | Goals: In this assignment, you will learn the basics of rendering with PyTorch3D, 4 | explore 3D representations, and practice constructing simple geometry. 5 | 6 | You may also find it helpful to follow the [Pytorch3D tutorials](https://github.com/facebookresearch/pytorch3d). 7 | 8 | ## Table of Contents 9 | 0. [Setup](#0-setup) 10 | 1. [Practicing with Cameras](#1-practicing-with-cameras-15-points) (15 Points) 11 | 2. [Practicing with Meshes](#2-practicing-with-meshes-10-points) (10 Points) 12 | 3. [Re-texturing a mesh](#3-re-texturing-a-mesh-10-points) (10 Points) 13 | 4. [Camera Transformations](#4-camera-transformations-10-points) (10 Points) 14 | 5. [Rendering Generic 3D Representations](#5-rendering-generic-3d-representations) (45 Points) 15 | 6. [Do Something Fun](#6-do-something-fun-10-points) (10 Points) 16 | 7. [Extra Credit](#extra-credit-7-sampling-points-on-meshes-10-points) (10 Points) 17 | 18 | ## 0. Setup 19 | 20 | You will need to install Pytorch3d. See the directions for your platform 21 | [here](https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md). 22 | You will also need to install Pytorch. If you do not have a GPU, you can directly pip 23 | install it (`pip install torch`). Otherwise, follow the installation directions 24 | [here](https://pytorch.org/get-started/locally/). 25 | 26 | Other miscellaneous packages that you will need can be installed using the 27 | `requirements.txt` file (`pip install -r requirements.txt`). 28 | 29 | If you have access to a GPU, the rendering code may run faster, but everything should 30 | be able to run locally on a CPU. Below are some sample installation instructions for a Linux Machine. 31 | 32 | For GPU installation, we recommend CUDA>=11.6. 33 | 34 | ```bash 35 | # GPU Installation on a CUDA 11.6 Machine 36 | conda create -n learning3d python=3.10 37 | conda activate learning3d 38 | pip install torch --index-url https://download.pytorch.org/whl/cu116 # Modify according to your cuda version. For example, cu121 for CUDA 12.1 39 | pip install fvcore iopath 40 | conda install -c bottler nvidiacub (required for CUDA older than 11.7) 41 | MAX_JOBS=8 pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable" # This will take some time to compile! 42 | pip install -r requirements.txt 43 | 44 | # CPU Installation 45 | conda create -n learning3d python=3.10 46 | conda activate learning3d 47 | pip install torch --index-url https://download.pytorch.org/whl/cpu 48 | pip install fvcore iopath 49 | MAX_JOBS=8 pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable" 50 | pip install -r requirements.txt 51 | 52 | ``` 53 | 54 | Make sure that you have gcc $\ge$ 4.9. 55 | 56 | ### 0.1 Rendering your first mesh 57 | 58 | To render a mesh using Pytorch3D, you will need a mesh that defines the geometry and 59 | texture of an object, a camera that defines the viewpoint, and a Pytorch3D renderer 60 | that encapsulates rasterization and shading parameters. You can abstract away the 61 | renderer using the `get_mesh_renderer` wrapper function in `utils.py`: 62 | ```python 63 | renderer = get_mesh_renderer(image_size=512) 64 | ``` 65 | 66 | Meshes in Pytorch3D are defined by a list of vertices, faces, and texture information. 67 | We will be using per-vertex texture features that assign an RGB color to each vertex. 68 | You can construct a mesh using the `pytorch3d.structures.Meshes` class: 69 | ```python 70 | vertices = ... # 1 x N_v x 3 tensor. 71 | faces = ... # 1 x N_f x 3 tensor. 72 | textures = ... # 1 x N_v x 3 tensor. 73 | meshes = pytorch3d.structures.Meshes( 74 | verts=vertices, 75 | faces=faces, 76 | textures=pytorch3d.renderer.TexturesVertex(textures), 77 | ) 78 | ``` 79 | Note that Pytorch3D assumes that meshes are *batched*, so the first dimension of all 80 | parameters should be 1. You can easily do this by calling `tensor.unsqueeze(0)` to add 81 | a batch dimension. 82 | 83 | Cameras can be constructed using a rotation, translation, and field-of-view 84 | (in degrees). A camera with identity rotation placed 3 units from the origin can be 85 | constructed as follows: 86 | ```python 87 | cameras = pytorch3d.renderer.FoVPerspectiveCameras( 88 | R=torch.eye(3).unsqueeze(0), 89 | T=torch.tensor([[0, 0, 3]]), 90 | fov=60, 91 | ) 92 | ``` 93 | Again, the rotation and translations must be batched. **You should familiarize yourself 94 | with the [camera coordinate system](https://pytorch3d.org/docs/cameras) that Pytorch3D 95 | uses. This will save you a lot of headaches down the line.** 96 | 97 | Finally, to render the mesh, call the `renderer` on the mesh, camera, and lighting 98 | (optional). Our light will be placed in front of the cow at (0, 0, -3). 99 | ```python 100 | lights = pytorch3d.renderer.PointLights(location=[[0, 0, -3]]) 101 | rend = renderer(mesh, cameras=cameras, lights=lights) 102 | image = rend[0, ..., :3].numpy() 103 | ``` 104 | The output from the renderer is B x H x W x 4. Since our batch is one, we can just take 105 | the first element of the batch to get an image of H x W x 4. The fourth channel contains 106 | silhouette information that we will ignore, so we will only keep the 3 RGB channels. 107 | 108 | An example of the entire process is available in `starter/render_mesh.py`, which loads 109 | a sample cow mesh and renders it. Please take a close look at the code and make sure 110 | you understand how it works. If you run `python -m starter.render_mesh`, you should see 111 | the following output: 112 | 113 | ![Cow render](images/cow_render.jpg) 114 | 115 | ## 1. Practicing with Cameras (15 Points) 116 | 117 | ### 1.1. 360-degree Renders (5 points) 118 | 119 | Your first task is to create a 360-degree gif video that shows many continuous views of the 120 | provided cow mesh. For many of your results this semester, you will be expected to show 121 | full turntable views of your outputs. You may find the following helpful: 122 | * [`pytorch3d.renderer.look_at_view_transform`](https://pytorch3d.readthedocs.io/en/latest/modules/renderer/cameras.html#pytorch3d.renderer.cameras.look_at_view_transform): 123 | Given a distance, elevation, and azimuth, this function returns the corresponding 124 | set of rotations and translations to align the world to view coordinate system. 125 | * Rendering a gif given a set of images: 126 | ```python 127 | import imageio 128 | my_images = ... # List of images [(H, W, 3)] 129 | duration = 1000 // 15 # Convert FPS (frames per second) to duration (ms per frame) 130 | imageio.mimsave('my_gif.gif', my_images, duration=duration) 131 | ``` 132 | You can pass an additional argument `loop=0` to `imageio.mimsave` to make the gif loop. 133 | 134 | 135 | > **Submission**: On your webpage, you should include a gif that shows the cow mesh from many 136 | continuously changing viewpoints. 137 | 138 | 139 | 140 | ### 1.2 Re-creating the Dolly Zoom (10 points) 141 | 142 | The [Dolly Zoom](https://en.wikipedia.org/wiki/Dolly_zoom) is a famous camera effect, 143 | first used in the Alfred Hitchcock film 144 | [Vertigo](https://www.youtube.com/watch?v=G7YJkBcRWB8). 145 | The core idea is to change the focal length of the camera while moving the camera in a 146 | way such that the subject is the same size in the frame, producing a rather unsettling 147 | effect. 148 | 149 | In this task, you will recreate this effect in Pytorch3D, producing an output that 150 | should look something like this: 151 | 152 | ![Dolly Zoom](images/dolly.gif) 153 | 154 | You will make modifications to `starter/dolly_zoom.py`. You can render your gif by 155 | calling `python -m starter.dolly_zoom`. 156 | 157 | > **Submission**: On your webpage, include a gif with your dolly zoom effect. 158 | 159 | ## 2. Practicing with Meshes (10 Points) 160 | 161 | ### 2.1 Constructing a Tetrahedron (5 points) 162 | 163 | In this part, you will practice working with the geometry of 3D meshes. 164 | Construct a tetrahedron mesh and then render it from multiple viewpoints. 165 | Your tetrahedron does not need to be a regular 166 | tetrahedron (i.e. not all faces need to be equilateral triangles) as long as it is 167 | obvious from the renderings that the shape is a tetrahedron. 168 | 169 | You will need to manually define the vertices and faces of the mesh. Once you have the 170 | vertices and faces, you can define a single-color texture, similarly to the cow in 171 | `render_mesh.py`. Remember that the faces are the vertex indices of the triangle mesh. 172 | 173 | It may help to draw a picture of your tetrahedron and label the vertices and assign 3D 174 | coordinates. 175 | 176 | > **Submission**: On your webpage, show a 360-degree gif animation of your tetrahedron. 177 | Also, list how many vertices and (triangle) faces your mesh should have. 178 | 179 | ### 2.2 Constructing a Cube (5 points) 180 | 181 | Construct a cube mesh and then render it from multiple viewpoints. Remember that we are 182 | still working with triangle meshes, so you will need to use two sets of triangle faces 183 | to represent one face of the cube. 184 | 185 | > **Submission**: On your webpage, show a 360-degree gif animation of your cube. 186 | Also, list how many vertices and (triangle) faces your mesh should have. 187 | 188 | 189 | ## 3. Re-texturing a mesh (10 points) 190 | 191 | Now let's practice re-texturing a mesh. For this task, we will be retexturing the cow 192 | mesh such that the color smoothly changes from the front of the cow to the back of the 193 | cow. 194 | 195 | More concretely, you will pick 2 RGB colors, `color1` and `color2`. We will assign the 196 | front of the cow a color of `color1`, and the back of the cow a color of `color2`. 197 | The front of the cow corresponds to the vertex with the smallest z-coordinate `z_min`, 198 | and the back of the cow corresponds to the vertex with the largest z-coordinate `z_max`. 199 | Then, we will assign the color of each vertex using linear interpolation based on the 200 | z-value of the vertex: 201 | ```python 202 | alpha = (z - z_min) / (z_max - z_min) 203 | color = alpha * color2 + (1 - alpha) * color1 204 | ``` 205 | 206 | Your final output should look something like this: 207 | 208 | ![Cow render](images/cow_retextured.jpg) 209 | 210 | In this case, `color1 = [0, 0, 1]` and `color2 = [1, 0, 0]`. 211 | 212 | > **Submission**: In your submission, describe your choice of `color1` and `color2`, and include a gif of the rendered mesh. 213 | 214 | ## 4. Camera Transformations (10 points) 215 | 216 | When working with 3D, finding a reasonable camera pose is often the first step to 217 | producing a useful visualization, and an important first step toward debugging. 218 | 219 | Running `python -m starter.camera_transforms` produces the following image using 220 | the camera extrinsics rotation `R_0` and translation `T_0`: 221 | 222 | ![Cow render](images/transform_none.jpg) 223 | 224 | 225 | What are the relative camera transformations that would produce each of the following 226 | output images? You should find a set (R_relative, T_relative) such that the new camera 227 | extrinsics with `R = R_relative @ R_0` and `T = R_relative @ T_0 + T_relative` produces 228 | each of the following images: 229 | 230 | 231 | ![Cow render](images/transform1.jpg) 232 | ![Cow render](images/transform3.jpg) 233 | ![Cow render](images/transform4.jpg) 234 | ![Cow render](images/transform2.jpg) 235 | 236 | > **Submission**: In your report, describe in words what R_relative and T_relative should be doing and include the rendering produced by your choice of R_relative and T_relative. 237 | 238 | 239 | 240 | ## 5. Rendering Generic 3D Representations (45 Points) 241 | 242 | The simplest possible 3D representation is simply a collection of 3D points, each 243 | possibly associated with a color feature. PyTorch3D provides functionality for rendering 244 | point clouds. 245 | 246 | Similar to the mesh rendering, we will need a `PointCloud` object consisting of 3D 247 | points and colors, a camera from which to view the point cloud, and a Pytorch3D Point 248 | Renderer which we have wrapped similarly to the Mesh Renderer. 249 | 250 | To construct a point cloud, use the `PointCloud` class: 251 | ```python 252 | points = ... # 1 x N x 3 253 | rgb = ... # 1 x N x 3 254 | point_cloud = pytorch3d.structures.PointCloud( 255 | points=points, features=rgb 256 | ) 257 | ``` 258 | As with all the mesh rendering, everything should be batched. 259 | 260 | The point renderer takes in a point cloud and a camera and returns a B x H x W x 4 261 | rendering, similar to the mesh renderer. 262 | ``` 263 | from starter.utils import get_points_renderer 264 | points_renderer = get_points_renderer( 265 | image_size=256, 266 | radius=0.01, 267 | ) 268 | rend = points_renderer(point_cloud, cameras=cameras) 269 | image = rend[0, ..., :3].numpy() # (B, H, W, 4) -> (H, W, 3). 270 | ``` 271 | 272 | To see a full working example of rendering a point cloud, see `render_bridge` in 273 | `starter/render_generic.py`. 274 | 275 | If you run `python -m starter.render_generic --render point_cloud`, you should 276 | get the following output: 277 | 278 | 279 | ![bridge](images/bridge.jpg) 280 | 281 | 282 | ### 5.1 Rendering Point Clouds from RGB-D Images (10 points) 283 | 284 | In this part, we will practice rendering point clouds constructed from 2 RGB-D images 285 | from the [Common Objects in 3D Dataset](https://github.com/facebookresearch/co3d). 286 | 287 | ![plant](images/plant.jpg) 288 | 289 | In `render_generic.py`, the `load_rgbd_data` function will load the data for 2 images of the same 290 | plant. The dictionary should contain the RGB image, a depth map, a mask, and a 291 | Pytorch3D camera corresponding to the pose that the image was taken from. 292 | 293 | You should use the `unproject_depth_image` function in `utils.py` to convert a depth 294 | image into a point cloud (parameterized as a set of 3D coordinates and corresponding 295 | color values). The `unproject_depth_image` function uses the camera 296 | intrinsics and extrinisics to cast a ray from every pixel in the image into world 297 | coordinates space. The ray's final distance is the depth value at that pixel, and the 298 | color of each point can be determined from the corresponding image pixel. 299 | 300 | Construct 3 different point clouds: 301 | 1. The point cloud corresponding to the first image 302 | 2. The point cloud corresponding to the second image 303 | 3. The point cloud formed by the union of the first 2 point clouds. 304 | 305 | Try visualizing each of the point clouds from various camera viewpoints. We suggest 306 | starting with cameras initialized 6 units from the origin with equally spaced azimuth 307 | values. 308 | 309 | > **Submission**: In your submission, include a gif of each of these point clouds mentioned above side-by-side. 310 | 311 | ### 5.2 Parametric Functions (10 + 5 points) 312 | 313 | A parametric function generates a 3D point for each point in the source domain. 314 | For example, given an elevation `theta` and azimuth `phi`, we can parameterize the 315 | surface of a unit sphere as 316 | `(sin(theta) * cos(phi), cos(theta), sin(theta) * sin(phi))`. 317 | 318 | By sampling values of `theta` and `phi`, we can generate a sphere point cloud. 319 | You can render a sphere point cloud by calling `python -m starter.render_generic --render parametric`. 320 | Note that the amount of samples can have an effect on the appearance quality. Below, we show the 321 | output with a 100x100 grid of (phi, theta) pairs (`--num_samples 100`) as well as a 322 | 1000x1000 grid (`--num_samples 1000`). The latter may take a long time to run on CPU. 323 | 324 | ![Sphere 100](images/sphere_100.jpg) 325 | ![Sphere 1000](images/sphere_1000.jpg) 326 | 327 | Your task is to render a [torus](https://en.wikipedia.org/wiki/Torus) point cloud by 328 | sampling its parametric function. 329 | 330 | > **Submission**: 331 | > - In your writeup, include a 360-degree gif of your torus point cloud, and make sure the hole is visible. You may choose to texture your point cloud however you wish. (10 points) 332 | > - Include a 360-degree gif on any new object of your choice. (5 points) 333 | 334 | 335 | 336 | ### 5.3 Implicit Surfaces (15 + 5 points) 337 | 338 | In this part, we will explore representing geometry as a function in the form of an implicit function. 339 | In general, given a function F(x, y, z), we can define the surface to be the zero level-set of F i.e. 340 | (x,y,z) such that F(x, y, z) = 0. The function F can be a mathematical equation or even a neural 341 | network. 342 | To visualize such a representation, we can discretize the 3D space and evaluate the 343 | implicit function, storing the values in a voxel grid. 344 | Finally, to recover the mesh, we can run the 345 | [marching cubes](https://en.wikipedia.org/wiki/Marching_cubes) algorithm to extract 346 | the 0-level set. 347 | 348 | In practice, we can generate our voxel coordinates using `torch.meshgrid` which we will 349 | use to query our function (in this case mathematical ones). 350 | Once we have our voxel grid, we can use the 351 | [`mcubes`](https://github.com/pmneila/PyMCubes) library to convert it into a mesh. 352 | 353 | A sample sphere mesh can be constructed implicitly and rendered by calling 354 | `python -m starter.render_generic --render implicit`. 355 | The output should like like this: 356 | 357 | ![Sphere mesh](images/sphere_mesh.jpg) 358 | 359 | Your task is to render a torus again, this time as a mesh defined by an implicit 360 | function. 361 | 362 | > **Submission**: 363 | > - In your writeup, include a 360-degree gif of your torus mesh, and make sure the hole 364 | is visible. (10 points) 365 | > - In addition, discuss some of the tradeoffs between rendering as a mesh 366 | vs a point cloud. Things to consider might include rendering speed, rendering quality, 367 | ease of use, memory usage, etc. (5 points) 368 | > - Include a 360-degree gif on any new object of your choice. This object can be different from what you used in 5.2 (5 points) 369 | 370 | **** 371 | 372 | ## 6. Do Something Fun (10 points) 373 | 374 | Now that you have learned to work with various 3D represenations and render them, it 375 | is time to try something fun. Create your own 3D structures, or render something in an interesting way, 376 | or creatively texture, or anything else that appeals to you - the (3D) world is your oyster! 377 | If you wish to download additional meshes, [Free3D](https://free3d.com/) is a good place to start. 378 | 379 | > **Submission**: Include a creative use of the tools in this assignment on your webpage! 380 | 381 | ## (Extra Credit) 7. Sampling Points on Meshes (10 points) 382 | 383 | We will explore how to obtain point clouds from triangle meshes. 384 | One obvious way to do this is to simply discard the face information and treat the vertices as a point cloud. 385 | However, this might be unreasonable if the faces are not of equal size. 386 | 387 | 388 | Instead, as we saw in the lectures, a solution to this problem is to use a uniform sampling of the surface using 389 | stratified sampling. The procedure is as follows: 390 | 391 | 1. Sample a face with probability proportional to the area of the face 392 | 2. Sample a random [barycentric coordinate](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) uniformly 393 | 3. Compute the corresponding point using baricentric coordinates on the selected face. 394 | 395 | 396 | For this part, write a function that takes a triangle mesh and the number of samples 397 | and outputs a point cloud. Then, using the cow mesh, randomly sample 10, 100, 1000, and 398 | 10000 points. 399 | 400 | > **Submission**: Render each pointcloud and the original cow mesh side-by-side, and 401 | include the gif in your writeup. 402 | -------------------------------------------------------------------------------- /data/bridge_pointcloud.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/bridge_pointcloud.npz -------------------------------------------------------------------------------- /data/cow.mtl: -------------------------------------------------------------------------------- 1 | newmtl material_1 2 | map_Kd cow_texture.png 3 | 4 | # Test colors 5 | 6 | Ka 1.000 1.000 1.000 # white 7 | Kd 1.000 1.000 1.000 # white 8 | Ks 0.000 0.000 0.000 # black 9 | Ns 10.0 10 | -------------------------------------------------------------------------------- /data/cow_on_plane.mtl: -------------------------------------------------------------------------------- 1 | newmtl mesh 2 | map_Kd cow_on_plane.png 3 | -------------------------------------------------------------------------------- /data/cow_on_plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/cow_on_plane.png -------------------------------------------------------------------------------- /data/cow_texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/cow_texture.png -------------------------------------------------------------------------------- /data/cow_with_axis.mtl: -------------------------------------------------------------------------------- 1 | newmtl mesh 2 | map_Kd cow_with_axis.png 3 | -------------------------------------------------------------------------------- /data/cow_with_axis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/cow_with_axis.png -------------------------------------------------------------------------------- /data/joint_mesh.mtl: -------------------------------------------------------------------------------- 1 | newmtl mesh 2 | map_Kd joint_mesh.png 3 | -------------------------------------------------------------------------------- /data/joint_mesh.obj: -------------------------------------------------------------------------------- 1 | 2 | mtllib joint_mesh.mtl 3 | usemtl mesh 4 | 5 | v 4.538120 -0.461880 -0.461880 6 | v 4.538120 -0.461880 0.461880 7 | v 4.538120 0.461880 -0.461880 8 | v 4.538120 0.461880 0.461880 9 | v 5.461880 -0.461880 -0.461880 10 | v 5.461880 -0.461880 0.461880 11 | v 5.461880 0.461880 -0.461880 12 | v 5.461880 0.461880 0.461880 13 | v 3.254247 -0.266667 0.000000 14 | v 2.122876 -0.266667 0.653197 15 | v 2.122876 -0.266667 -0.653197 16 | v 2.500000 0.800000 0.000000 17 | v -0.525687 0.850678 0.000000 18 | v 0.525687 0.850678 0.000000 19 | v -0.525687 -0.850678 0.000000 20 | v 0.525687 -0.850678 0.000000 21 | v 0.000000 -0.525687 0.850678 22 | v 0.000000 0.525687 0.850678 23 | v 0.000000 -0.525687 -0.850678 24 | v 0.000000 0.525687 -0.850678 25 | v 0.850678 0.000000 -0.525687 26 | v 0.850678 0.000000 0.525687 27 | v -0.850678 0.000000 -0.525687 28 | v -0.850678 0.000000 0.525687 29 | v 0.000000 1.000000 0.000000 30 | v -0.308993 0.809014 0.500020 31 | v -0.308993 0.809014 -0.500020 32 | v -0.809014 0.500020 -0.308993 33 | v -0.809014 0.500020 0.308993 34 | v 0.308993 0.809014 0.500020 35 | v 0.308993 0.809014 -0.500020 36 | v 0.809014 0.500020 -0.308993 37 | v 0.809014 0.500020 0.308993 38 | v 0.000000 -1.000000 0.000000 39 | v -0.308993 -0.809014 0.500020 40 | v -0.308993 -0.809014 -0.500020 41 | v -0.809014 -0.500020 -0.308993 42 | v -0.809014 -0.500020 0.308993 43 | v 0.308993 -0.809014 0.500020 44 | v 0.308993 -0.809014 -0.500020 45 | v 0.809014 -0.500020 -0.308993 46 | v 0.809014 -0.500020 0.308993 47 | v 0.000000 0.000000 1.000000 48 | v 0.500020 -0.308993 0.809014 49 | v -0.500020 -0.308993 0.809014 50 | v 0.500020 0.308993 0.809014 51 | v -0.500020 0.308993 0.809014 52 | v 0.000000 0.000000 -1.000000 53 | v 0.500020 -0.308993 -0.809014 54 | v -0.500020 -0.308993 -0.809014 55 | v 0.500020 0.308993 -0.809014 56 | v -0.500020 0.308993 -0.809014 57 | v 1.000000 0.000000 0.000000 58 | v -1.000000 0.000000 0.000000 59 | v -0.273241 0.961946 0.000000 60 | v -0.433854 0.862683 0.259903 61 | v -0.433854 0.862683 -0.259903 62 | v -0.693757 0.702073 -0.160610 63 | v -0.693757 0.702073 0.160610 64 | v 0.273241 0.961946 0.000000 65 | v 0.433854 0.862683 0.259903 66 | v 0.433854 0.862683 -0.259903 67 | v 0.693757 0.702073 -0.160610 68 | v 0.693757 0.702073 0.160610 69 | v -0.273241 -0.961946 0.000000 70 | v -0.433854 -0.862683 0.259903 71 | v -0.433854 -0.862683 -0.259903 72 | v -0.693757 -0.702073 -0.160610 73 | v -0.693757 -0.702073 0.160610 74 | v 0.273241 -0.961946 0.000000 75 | v 0.433854 -0.862683 0.259903 76 | v 0.433854 -0.862683 -0.259903 77 | v 0.693757 -0.702073 -0.160610 78 | v 0.693757 -0.702073 0.160610 79 | v -0.160610 -0.693757 0.702073 80 | v 0.160610 -0.693757 0.702073 81 | v 0.000000 -0.273241 0.961946 82 | v 0.259903 -0.433854 0.862683 83 | v -0.259903 -0.433854 0.862683 84 | v -0.160610 0.693757 0.702073 85 | v 0.160610 0.693757 0.702073 86 | v 0.000000 0.273241 0.961946 87 | v 0.259903 0.433854 0.862683 88 | v -0.259903 0.433854 0.862683 89 | v -0.160610 -0.693757 -0.702073 90 | v 0.160610 -0.693757 -0.702073 91 | v 0.000000 -0.273241 -0.961946 92 | v 0.259903 -0.433854 -0.862683 93 | v -0.259903 -0.433854 -0.862683 94 | v -0.160610 0.693757 -0.702073 95 | v 0.160610 0.693757 -0.702073 96 | v 0.000000 0.273241 -0.961946 97 | v 0.259903 0.433854 -0.862683 98 | v -0.259903 0.433854 -0.862683 99 | v 0.862683 0.259903 -0.433854 100 | v 0.862683 -0.259903 -0.433854 101 | v 0.702073 -0.160610 -0.693757 102 | v 0.702073 0.160610 -0.693757 103 | v 0.961946 0.000000 -0.273241 104 | v 0.862683 0.259903 0.433854 105 | v 0.862683 -0.259903 0.433854 106 | v 0.702073 -0.160610 0.693757 107 | v 0.702073 0.160610 0.693757 108 | v 0.961946 0.000000 0.273241 109 | v -0.862683 0.259903 -0.433854 110 | v -0.862683 -0.259903 -0.433854 111 | v -0.702073 -0.160610 -0.693757 112 | v -0.702073 0.160610 -0.693757 113 | v -0.961946 0.000000 -0.273241 114 | v -0.862683 0.259903 0.433854 115 | v -0.862683 -0.259903 0.433854 116 | v -0.702073 -0.160610 0.693757 117 | v -0.702073 0.160610 0.693757 118 | v -0.961946 0.000000 0.273241 119 | v -0.162448 0.951056 0.262876 120 | v -0.162448 0.951056 -0.262876 121 | v 0.162448 0.951056 0.262876 122 | v 0.162448 0.951056 -0.262876 123 | v -0.587773 0.688202 0.425325 124 | v 0.000000 0.850640 0.525748 125 | v -0.425325 0.587773 0.688202 126 | v -0.587773 0.688202 -0.425325 127 | v 0.000000 0.850640 -0.525748 128 | v -0.425325 0.587773 -0.688202 129 | v -0.850640 0.525748 0.000000 130 | v -0.688202 0.425325 -0.587773 131 | v -0.951056 0.262876 -0.162448 132 | v -0.688202 0.425325 0.587773 133 | v -0.951056 0.262876 0.162448 134 | v 0.587773 0.688202 0.425325 135 | v 0.425325 0.587773 0.688202 136 | v 0.587773 0.688202 -0.425325 137 | v 0.425325 0.587773 -0.688202 138 | v 0.850640 0.525748 0.000000 139 | v 0.688202 0.425325 -0.587773 140 | v 0.951056 0.262876 -0.162448 141 | v 0.688202 0.425325 0.587773 142 | v 0.951056 0.262876 0.162448 143 | v -0.162448 -0.951056 0.262876 144 | v -0.162448 -0.951056 -0.262876 145 | v 0.162448 -0.951056 0.262876 146 | v 0.162448 -0.951056 -0.262876 147 | v -0.587773 -0.688202 0.425325 148 | v 0.000000 -0.850640 0.525748 149 | v -0.425325 -0.587773 0.688202 150 | v -0.587773 -0.688202 -0.425325 151 | v 0.000000 -0.850640 -0.525748 152 | v -0.425325 -0.587773 -0.688202 153 | v -0.850640 -0.525748 0.000000 154 | v -0.688202 -0.425325 -0.587773 155 | v -0.951056 -0.262876 -0.162448 156 | v -0.688202 -0.425325 0.587773 157 | v -0.951056 -0.262876 0.162448 158 | v 0.587773 -0.688202 0.425325 159 | v 0.425325 -0.587773 0.688202 160 | v 0.587773 -0.688202 -0.425325 161 | v 0.425325 -0.587773 -0.688202 162 | v 0.850640 -0.525748 0.000000 163 | v 0.688202 -0.425325 -0.587773 164 | v 0.951056 -0.262876 -0.162448 165 | v 0.688202 -0.425325 0.587773 166 | v 0.951056 -0.262876 0.162448 167 | v 0.262876 -0.162448 0.951056 168 | v -0.262876 -0.162448 0.951056 169 | v 0.262876 0.162448 0.951056 170 | v -0.262876 0.162448 0.951056 171 | v 0.525748 0.000000 0.850640 172 | v -0.525748 0.000000 0.850640 173 | v 0.262876 -0.162448 -0.951056 174 | v -0.262876 -0.162448 -0.951056 175 | v 0.262876 0.162448 -0.951056 176 | v -0.262876 0.162448 -0.951056 177 | v 0.525748 0.000000 -0.850640 178 | v -0.525748 0.000000 -0.850640 179 | v -0.403319 0.915059 0.000000 180 | v -0.484402 0.864951 0.131206 181 | v -0.484402 0.864951 -0.131206 182 | v -0.615608 0.783870 -0.081080 183 | v -0.615608 0.783870 0.081080 184 | v 0.403319 0.915059 0.000000 185 | v 0.484402 0.864951 0.131206 186 | v 0.484402 0.864951 -0.131206 187 | v 0.615608 0.783870 -0.081080 188 | v 0.615608 0.783870 0.081080 189 | v -0.403319 -0.915059 0.000000 190 | v -0.484402 -0.864951 0.131206 191 | v -0.484402 -0.864951 -0.131206 192 | v -0.615608 -0.783870 -0.081080 193 | v -0.615608 -0.783870 0.081080 194 | v 0.403319 -0.915059 0.000000 195 | v 0.484402 -0.864951 0.131206 196 | v 0.484402 -0.864951 -0.131206 197 | v 0.615608 -0.783870 -0.081080 198 | v 0.615608 -0.783870 0.081080 199 | v -0.081080 -0.615608 0.783870 200 | v 0.081080 -0.615608 0.783870 201 | v 0.000000 -0.403319 0.915059 202 | v 0.131206 -0.484402 0.864951 203 | v -0.131206 -0.484402 0.864951 204 | v -0.081080 0.615608 0.783870 205 | v 0.081080 0.615608 0.783870 206 | v 0.000000 0.403319 0.915059 207 | v 0.131206 0.484402 0.864951 208 | v -0.131206 0.484402 0.864951 209 | v -0.081080 -0.615608 -0.783870 210 | v 0.081080 -0.615608 -0.783870 211 | v 0.000000 -0.403319 -0.915059 212 | v 0.131206 -0.484402 -0.864951 213 | v -0.131206 -0.484402 -0.864951 214 | v -0.081080 0.615608 -0.783870 215 | v 0.081080 0.615608 -0.783870 216 | v 0.000000 0.403319 -0.915059 217 | v 0.131206 0.484402 -0.864951 218 | v -0.131206 0.484402 -0.864951 219 | v 0.864951 0.131206 -0.484402 220 | v 0.864951 -0.131206 -0.484402 221 | v 0.783870 -0.081080 -0.615608 222 | v 0.783870 0.081080 -0.615608 223 | v 0.915059 0.000000 -0.403319 224 | v 0.864951 0.131206 0.484402 225 | v 0.864951 -0.131206 0.484402 226 | v 0.783870 -0.081080 0.615608 227 | v 0.783870 0.081080 0.615608 228 | v 0.915059 0.000000 0.403319 229 | v -0.864951 0.131206 -0.484402 230 | v -0.864951 -0.131206 -0.484402 231 | v -0.783870 -0.081080 -0.615608 232 | v -0.783870 0.081080 -0.615608 233 | v -0.915059 0.000000 -0.403319 234 | v -0.864951 0.131206 0.484402 235 | v -0.864951 -0.131206 0.484402 236 | v -0.783870 -0.081080 0.615608 237 | v -0.783870 0.081080 0.615608 238 | v -0.915059 0.000000 0.403319 239 | v -0.137939 0.990441 0.000000 240 | v 0.137939 0.990441 0.000000 241 | v -0.082236 0.987688 0.133077 242 | v -0.082236 0.987688 -0.133077 243 | v 0.082236 0.987688 0.133077 244 | v 0.082236 0.987688 -0.133077 245 | v -0.375009 0.843917 0.383630 246 | v -0.237068 0.758639 0.606849 247 | v -0.238659 0.891005 0.386203 248 | v -0.453973 0.757940 0.468440 249 | v -0.156422 0.840169 0.519276 250 | v -0.371736 0.707099 0.601517 251 | v -0.375009 0.843917 -0.383630 252 | v -0.237068 0.758639 -0.606849 253 | v -0.238659 0.891005 -0.386203 254 | v -0.453973 0.757940 -0.468440 255 | v -0.156422 0.840169 -0.519276 256 | v -0.371736 0.707099 -0.601517 257 | v -0.758639 0.606849 -0.237068 258 | v -0.843917 0.383630 -0.375009 259 | v -0.707099 0.601517 -0.371736 260 | v -0.840169 0.519276 -0.156422 261 | v -0.757940 0.468440 -0.453973 262 | v -0.891005 0.386203 -0.238659 263 | v -0.758639 0.606849 0.237068 264 | v -0.843917 0.383630 0.375009 265 | v -0.707099 0.601517 0.371736 266 | v -0.840169 0.519276 0.156422 267 | v -0.757940 0.468440 0.453973 268 | v -0.891005 0.386203 0.238659 269 | v 0.375009 0.843917 0.383630 270 | v 0.237068 0.758639 0.606849 271 | v 0.238659 0.891005 0.386203 272 | v 0.156422 0.840169 0.519276 273 | v 0.453973 0.757940 0.468440 274 | v 0.371736 0.707099 0.601517 275 | v 0.375009 0.843917 -0.383630 276 | v 0.237068 0.758639 -0.606849 277 | v 0.238659 0.891005 -0.386203 278 | v 0.156422 0.840169 -0.519276 279 | v 0.453973 0.757940 -0.468440 280 | v 0.371736 0.707099 -0.601517 281 | v 0.758639 0.606849 -0.237068 282 | v 0.843917 0.383630 -0.375009 283 | v 0.707099 0.601517 -0.371736 284 | v 0.840169 0.519276 -0.156422 285 | v 0.757940 0.468440 -0.453973 286 | v 0.891005 0.386203 -0.238659 287 | v 0.758639 0.606849 0.237068 288 | v 0.843917 0.383630 0.375009 289 | v 0.707099 0.601517 0.371736 290 | v 0.840169 0.519276 0.156422 291 | v 0.757940 0.468440 0.453973 292 | v 0.891005 0.386203 0.238659 293 | v -0.137939 -0.990441 0.000000 294 | v 0.137939 -0.990441 0.000000 295 | v -0.082236 -0.987688 0.133077 296 | v -0.082236 -0.987688 -0.133077 297 | v 0.082236 -0.987688 0.133077 298 | v 0.082236 -0.987688 -0.133077 299 | v -0.375009 -0.843917 0.383630 300 | v -0.237068 -0.758639 0.606849 301 | v -0.238659 -0.891005 0.386203 302 | v -0.453973 -0.757940 0.468440 303 | v -0.156422 -0.840169 0.519276 304 | v -0.371736 -0.707099 0.601517 305 | v -0.375009 -0.843917 -0.383630 306 | v -0.237068 -0.758639 -0.606849 307 | v -0.238659 -0.891005 -0.386203 308 | v -0.453973 -0.757940 -0.468440 309 | v -0.156422 -0.840169 -0.519276 310 | v -0.371736 -0.707099 -0.601517 311 | v -0.758639 -0.606849 -0.237068 312 | v -0.843917 -0.383630 -0.375009 313 | v -0.707099 -0.601517 -0.371736 314 | v -0.840169 -0.519276 -0.156422 315 | v -0.757940 -0.468440 -0.453973 316 | v -0.891005 -0.386203 -0.238659 317 | v -0.758639 -0.606849 0.237068 318 | v -0.843917 -0.383630 0.375009 319 | v -0.707099 -0.601517 0.371736 320 | v -0.840169 -0.519276 0.156422 321 | v -0.757940 -0.468440 0.453973 322 | v -0.891005 -0.386203 0.238659 323 | v 0.375009 -0.843917 0.383630 324 | v 0.237068 -0.758639 0.606849 325 | v 0.238659 -0.891005 0.386203 326 | v 0.156422 -0.840169 0.519276 327 | v 0.453973 -0.757940 0.468440 328 | v 0.371736 -0.707099 0.601517 329 | v 0.375009 -0.843917 -0.383630 330 | v 0.237068 -0.758639 -0.606849 331 | v 0.238659 -0.891005 -0.386203 332 | v 0.156422 -0.840169 -0.519276 333 | v 0.453973 -0.757940 -0.468440 334 | v 0.371736 -0.707099 -0.601517 335 | v 0.758639 -0.606849 -0.237068 336 | v 0.843917 -0.383630 -0.375009 337 | v 0.707099 -0.601517 -0.371736 338 | v 0.840169 -0.519276 -0.156422 339 | v 0.757940 -0.468440 -0.453973 340 | v 0.891005 -0.386203 -0.238659 341 | v 0.758639 -0.606849 0.237068 342 | v 0.843917 -0.383630 0.375009 343 | v 0.707099 -0.601517 0.371736 344 | v 0.840169 -0.519276 0.156422 345 | v 0.757940 -0.468440 0.453973 346 | v 0.891005 -0.386203 0.238659 347 | v 0.000000 -0.137939 0.990441 348 | v 0.000000 0.137939 0.990441 349 | v 0.133077 -0.082236 0.987688 350 | v -0.133077 -0.082236 0.987688 351 | v 0.133077 0.082236 0.987688 352 | v -0.133077 0.082236 0.987688 353 | v 0.383630 -0.375009 0.843917 354 | v 0.606849 -0.237068 0.758639 355 | v 0.468440 -0.453973 0.757940 356 | v 0.601517 -0.371736 0.707099 357 | v 0.386203 -0.238659 0.891005 358 | v 0.519276 -0.156422 0.840169 359 | v -0.383630 -0.375009 0.843917 360 | v -0.606849 -0.237068 0.758639 361 | v -0.468440 -0.453973 0.757940 362 | v -0.601517 -0.371736 0.707099 363 | v -0.386203 -0.238659 0.891005 364 | v -0.519276 -0.156422 0.840169 365 | v 0.383630 0.375009 0.843917 366 | v 0.606849 0.237068 0.758639 367 | v 0.468440 0.453973 0.757940 368 | v 0.601517 0.371736 0.707099 369 | v 0.386203 0.238659 0.891005 370 | v 0.519276 0.156422 0.840169 371 | v -0.383630 0.375009 0.843917 372 | v -0.606849 0.237068 0.758639 373 | v -0.468440 0.453973 0.757940 374 | v -0.601517 0.371736 0.707099 375 | v -0.386203 0.238659 0.891005 376 | v -0.519276 0.156422 0.840169 377 | v 0.000000 -0.137939 -0.990441 378 | v 0.000000 0.137939 -0.990441 379 | v 0.133077 -0.082236 -0.987688 380 | v -0.133077 -0.082236 -0.987688 381 | v 0.133077 0.082236 -0.987688 382 | v -0.133077 0.082236 -0.987688 383 | v 0.383630 -0.375009 -0.843917 384 | v 0.606849 -0.237068 -0.758639 385 | v 0.468440 -0.453973 -0.757940 386 | v 0.601517 -0.371736 -0.707099 387 | v 0.386203 -0.238659 -0.891005 388 | v 0.519276 -0.156422 -0.840169 389 | v -0.383630 -0.375009 -0.843917 390 | v -0.606849 -0.237068 -0.758639 391 | v -0.468440 -0.453973 -0.757940 392 | v -0.601517 -0.371736 -0.707099 393 | v -0.386203 -0.238659 -0.891005 394 | v -0.519276 -0.156422 -0.840169 395 | v 0.383630 0.375009 -0.843917 396 | v 0.606849 0.237068 -0.758639 397 | v 0.468440 0.453973 -0.757940 398 | v 0.601517 0.371736 -0.707099 399 | v 0.386203 0.238659 -0.891005 400 | v 0.519276 0.156422 -0.840169 401 | v -0.383630 0.375009 -0.843917 402 | v -0.606849 0.237068 -0.758639 403 | v -0.468440 0.453973 -0.757940 404 | v -0.601517 0.371736 -0.707099 405 | v -0.386203 0.238659 -0.891005 406 | v -0.519276 0.156422 -0.840169 407 | v 0.990441 0.000000 -0.137939 408 | v 0.990441 0.000000 0.137939 409 | v 0.987688 0.133077 -0.082236 410 | v 0.987688 0.133077 0.082236 411 | v 0.987688 -0.133077 -0.082236 412 | v 0.987688 -0.133077 0.082236 413 | v -0.990441 0.000000 -0.137939 414 | v -0.990441 0.000000 0.137939 415 | v -0.987688 0.133077 -0.082236 416 | v -0.987688 0.133077 0.082236 417 | v -0.987688 -0.133077 -0.082236 418 | v -0.987688 -0.133077 0.082236 419 | v -0.358199 0.924316 0.131661 420 | v -0.358199 0.924316 -0.131661 421 | v -0.220098 0.966396 0.132798 422 | v -0.220098 0.966396 -0.132798 423 | v -0.571223 0.792670 0.213023 424 | v -0.301235 0.916249 0.264093 425 | v -0.516098 0.783465 0.346158 426 | v -0.571223 0.792670 -0.213023 427 | v -0.301235 0.916249 -0.264093 428 | v -0.516098 0.783465 -0.346158 429 | v -0.702882 0.711307 0.000000 430 | v -0.647394 0.702329 -0.295998 431 | v -0.780187 0.620262 -0.081136 432 | v -0.647394 0.702329 0.295998 433 | v -0.780187 0.620262 0.081136 434 | v 0.358199 0.924316 0.131661 435 | v 0.358199 0.924316 -0.131661 436 | v 0.220098 0.966396 0.132798 437 | v 0.220098 0.966396 -0.132798 438 | v 0.571223 0.792670 0.213023 439 | v 0.301235 0.916249 0.264093 440 | v 0.516098 0.783465 0.346158 441 | v 0.571223 0.792670 -0.213023 442 | v 0.301235 0.916249 -0.264093 443 | v 0.516098 0.783465 -0.346158 444 | v 0.702882 0.711307 0.000000 445 | v 0.647394 0.702329 -0.295998 446 | v 0.780187 0.620262 -0.081136 447 | v 0.647394 0.702329 0.295998 448 | v 0.780187 0.620262 0.081136 449 | v -0.358199 -0.924316 0.131661 450 | v -0.358199 -0.924316 -0.131661 451 | v -0.220098 -0.966396 0.132798 452 | v -0.220098 -0.966396 -0.132798 453 | v -0.571223 -0.792670 0.213023 454 | v -0.301235 -0.916249 0.264093 455 | v -0.516098 -0.783465 0.346158 456 | v -0.571223 -0.792670 -0.213023 457 | v -0.301235 -0.916249 -0.264093 458 | v -0.516098 -0.783465 -0.346158 459 | v -0.702882 -0.711307 0.000000 460 | v -0.647394 -0.702329 -0.295998 461 | v -0.780187 -0.620262 -0.081136 462 | v -0.647394 -0.702329 0.295998 463 | v -0.780187 -0.620262 0.081136 464 | v 0.358199 -0.924316 0.131661 465 | v 0.358199 -0.924316 -0.131661 466 | v 0.220098 -0.966396 0.132798 467 | v 0.220098 -0.966396 -0.132798 468 | v 0.571223 -0.792670 0.213023 469 | v 0.301235 -0.916249 0.264093 470 | v 0.516098 -0.783465 0.346158 471 | v 0.571223 -0.792670 -0.213023 472 | v 0.301235 -0.916249 -0.264093 473 | v 0.516098 -0.783465 -0.346158 474 | v 0.702882 -0.711307 0.000000 475 | v 0.647394 -0.702329 -0.295998 476 | v 0.780187 -0.620262 -0.081136 477 | v 0.647394 -0.702329 0.295998 478 | v 0.780187 -0.620262 0.081136 479 | v 0.000000 -0.702882 0.711307 480 | v -0.213023 -0.571223 0.792670 481 | v -0.081136 -0.780187 0.620262 482 | v -0.295998 -0.647394 0.702329 483 | v 0.213023 -0.571223 0.792670 484 | v 0.081136 -0.780187 0.620262 485 | v 0.295998 -0.647394 0.702329 486 | v 0.131661 -0.358199 0.924316 487 | v -0.131661 -0.358199 0.924316 488 | v 0.132798 -0.220098 0.966396 489 | v -0.132798 -0.220098 0.966396 490 | v 0.346158 -0.516098 0.783465 491 | v 0.264093 -0.301235 0.916249 492 | v -0.346158 -0.516098 0.783465 493 | v -0.264093 -0.301235 0.916249 494 | v 0.000000 0.702882 0.711307 495 | v -0.213023 0.571223 0.792670 496 | v -0.081136 0.780187 0.620262 497 | v -0.295998 0.647394 0.702329 498 | v 0.213023 0.571223 0.792670 499 | v 0.081136 0.780187 0.620262 500 | v 0.295998 0.647394 0.702329 501 | v 0.131661 0.358199 0.924316 502 | v -0.131661 0.358199 0.924316 503 | v 0.132798 0.220098 0.966396 504 | v -0.132798 0.220098 0.966396 505 | v 0.346158 0.516098 0.783465 506 | v 0.264093 0.301235 0.916249 507 | v -0.346158 0.516098 0.783465 508 | v -0.264093 0.301235 0.916249 509 | v 0.000000 -0.702882 -0.711307 510 | v -0.213023 -0.571223 -0.792670 511 | v -0.081136 -0.780187 -0.620262 512 | v -0.295998 -0.647394 -0.702329 513 | v 0.213023 -0.571223 -0.792670 514 | v 0.081136 -0.780187 -0.620262 515 | v 0.295998 -0.647394 -0.702329 516 | v 0.131661 -0.358199 -0.924316 517 | v -0.131661 -0.358199 -0.924316 518 | v 0.132798 -0.220098 -0.966396 519 | v -0.132798 -0.220098 -0.966396 520 | v 0.346158 -0.516098 -0.783465 521 | v 0.264093 -0.301235 -0.916249 522 | v -0.346158 -0.516098 -0.783465 523 | v -0.264093 -0.301235 -0.916249 524 | v 0.000000 0.702882 -0.711307 525 | v -0.213023 0.571223 -0.792670 526 | v -0.081136 0.780187 -0.620262 527 | v -0.295998 0.647394 -0.702329 528 | v 0.213023 0.571223 -0.792670 529 | v 0.081136 0.780187 -0.620262 530 | v 0.295998 0.647394 -0.702329 531 | v 0.131661 0.358199 -0.924316 532 | v -0.131661 0.358199 -0.924316 533 | v 0.132798 0.220098 -0.966396 534 | v -0.132798 0.220098 -0.966396 535 | v 0.346158 0.516098 -0.783465 536 | v 0.264093 0.301235 -0.916249 537 | v -0.346158 0.516098 -0.783465 538 | v -0.264093 0.301235 -0.916249 539 | v 0.792670 0.213023 -0.571223 540 | v 0.924316 0.131661 -0.358199 541 | v 0.783465 0.346158 -0.516098 542 | v 0.916249 0.264093 -0.301235 543 | v 0.792670 -0.213023 -0.571223 544 | v 0.924316 -0.131661 -0.358199 545 | v 0.783465 -0.346158 -0.516098 546 | v 0.916249 -0.264093 -0.301235 547 | v 0.711307 0.000000 -0.702882 548 | v 0.702329 -0.295998 -0.647394 549 | v 0.620262 -0.081136 -0.780187 550 | v 0.702329 0.295998 -0.647394 551 | v 0.620262 0.081136 -0.780187 552 | v 0.966396 0.132798 -0.220098 553 | v 0.966396 -0.132798 -0.220098 554 | v 0.792670 0.213023 0.571223 555 | v 0.924316 0.131661 0.358199 556 | v 0.783465 0.346158 0.516098 557 | v 0.916249 0.264093 0.301235 558 | v 0.792670 -0.213023 0.571223 559 | v 0.924316 -0.131661 0.358199 560 | v 0.783465 -0.346158 0.516098 561 | v 0.916249 -0.264093 0.301235 562 | v 0.711307 0.000000 0.702882 563 | v 0.702329 -0.295998 0.647394 564 | v 0.620262 -0.081136 0.780187 565 | v 0.702329 0.295998 0.647394 566 | v 0.620262 0.081136 0.780187 567 | v 0.966396 0.132798 0.220098 568 | v 0.966396 -0.132798 0.220098 569 | v -0.792670 0.213023 -0.571223 570 | v -0.924316 0.131661 -0.358199 571 | v -0.783465 0.346158 -0.516098 572 | v -0.916249 0.264093 -0.301235 573 | v -0.792670 -0.213023 -0.571223 574 | v -0.924316 -0.131661 -0.358199 575 | v -0.783465 -0.346158 -0.516098 576 | v -0.916249 -0.264093 -0.301235 577 | v -0.711307 0.000000 -0.702882 578 | v -0.702329 -0.295998 -0.647394 579 | v -0.620262 -0.081136 -0.780187 580 | v -0.702329 0.295998 -0.647394 581 | v -0.620262 0.081136 -0.780187 582 | v -0.966396 0.132798 -0.220098 583 | v -0.966396 -0.132798 -0.220098 584 | v -0.792670 0.213023 0.571223 585 | v -0.924316 0.131661 0.358199 586 | v -0.783465 0.346158 0.516098 587 | v -0.916249 0.264093 0.301235 588 | v -0.792670 -0.213023 0.571223 589 | v -0.924316 -0.131661 0.358199 590 | v -0.783465 -0.346158 0.516098 591 | v -0.916249 -0.264093 0.301235 592 | v -0.711307 0.000000 0.702882 593 | v -0.702329 -0.295998 0.647394 594 | v -0.620262 -0.081136 0.780187 595 | v -0.702329 0.295998 0.647394 596 | v -0.620262 0.081136 0.780187 597 | v -0.966396 0.132798 0.220098 598 | v -0.966396 -0.132798 0.220098 599 | v 0.000000 0.963858 0.266415 600 | v -0.082317 0.912977 0.399621 601 | v 0.000000 0.963858 -0.266415 602 | v -0.082317 0.912977 -0.399621 603 | v 0.082317 0.912977 0.399621 604 | v 0.082317 0.912977 -0.399621 605 | v -0.513369 0.646578 0.564260 606 | v -0.646578 0.564260 0.513369 607 | v -0.564260 0.513369 0.646578 608 | v -0.513369 0.646578 -0.564260 609 | v -0.646578 0.564260 -0.513369 610 | v -0.564260 0.513369 -0.646578 611 | v -0.912977 0.399621 -0.082317 612 | v -0.912977 0.399621 0.082317 613 | v -0.963858 0.266415 0.000000 614 | v 0.513369 0.646578 0.564260 615 | v 0.646578 0.564260 0.513369 616 | v 0.564260 0.513369 0.646578 617 | v 0.513369 0.646578 -0.564260 618 | v 0.646578 0.564260 -0.513369 619 | v 0.564260 0.513369 -0.646578 620 | v 0.912977 0.399621 -0.082317 621 | v 0.912977 0.399621 0.082317 622 | v 0.963858 0.266415 0.000000 623 | v 0.000000 -0.963858 0.266415 624 | v -0.082317 -0.912977 0.399621 625 | v 0.000000 -0.963858 -0.266415 626 | v -0.082317 -0.912977 -0.399621 627 | v 0.082317 -0.912977 0.399621 628 | v 0.082317 -0.912977 -0.399621 629 | v -0.513369 -0.646578 0.564260 630 | v -0.646578 -0.564260 0.513369 631 | v -0.564260 -0.513369 0.646578 632 | v -0.513369 -0.646578 -0.564260 633 | v -0.646578 -0.564260 -0.513369 634 | v -0.564260 -0.513369 -0.646578 635 | v -0.912977 -0.399621 -0.082317 636 | v -0.912977 -0.399621 0.082317 637 | v -0.963858 -0.266415 0.000000 638 | v 0.513369 -0.646578 0.564260 639 | v 0.646578 -0.564260 0.513369 640 | v 0.564260 -0.513369 0.646578 641 | v 0.513369 -0.646578 -0.564260 642 | v 0.646578 -0.564260 -0.513369 643 | v 0.564260 -0.513369 -0.646578 644 | v 0.912977 -0.399621 -0.082317 645 | v 0.912977 -0.399621 0.082317 646 | v 0.963858 -0.266415 0.000000 647 | v 0.266415 0.000000 0.963858 648 | v 0.399621 -0.082317 0.912977 649 | v -0.266415 0.000000 0.963858 650 | v -0.399621 -0.082317 0.912977 651 | v 0.399621 0.082317 0.912977 652 | v -0.399621 0.082317 0.912977 653 | v 0.266415 0.000000 -0.963858 654 | v 0.399621 -0.082317 -0.912977 655 | v -0.266415 0.000000 -0.963858 656 | v -0.399621 -0.082317 -0.912977 657 | v 0.399621 0.082317 -0.912977 658 | v -0.399621 0.082317 -0.912977 659 | vt 0.767241 0.250000 660 | vt 0.922414 0.250000 661 | vt 0.844828 0.750000 662 | vt 0.422414 0.250000 663 | vt 0.577586 0.250000 664 | vt 0.500000 0.750000 665 | vt 0.077586 0.250000 666 | vt 0.232759 0.250000 667 | vt 0.155172 0.750000 668 | f 1/1 2/2 3/3 669 | f 4/1 2/2 3/3 670 | f 5/1 6/2 7/3 671 | f 6/1 7/2 8/3 672 | f 1/1 2/2 5/3 673 | f 2/1 5/2 6/3 674 | f 3/1 4/2 7/3 675 | f 4/1 7/2 8/3 676 | f 1/1 3/2 5/3 677 | f 3/1 5/2 7/3 678 | f 2/1 4/2 6/3 679 | f 4/1 6/2 8/3 680 | f 9/4 10/5 11/6 681 | f 9/4 10/5 12/6 682 | f 9/4 11/5 12/6 683 | f 10/4 11/5 12/6 684 | f 13/7 179/8 176/9 685 | f 13/7 176/8 175/9 686 | f 13/7 175/8 177/9 687 | f 13/7 177/8 178/9 688 | f 13/7 178/8 179/9 689 | f 14/7 181/8 184/9 690 | f 18/7 204/8 202/9 691 | f 24/7 234/8 231/9 692 | f 23/7 228/8 227/9 693 | f 20/7 211/8 213/9 694 | f 16/7 194/8 191/9 695 | f 16/7 191/8 190/9 696 | f 16/7 190/8 192/9 697 | f 16/7 192/8 193/9 698 | f 16/7 193/8 194/9 699 | f 17/7 198/8 197/9 700 | f 15/7 186/8 189/9 701 | f 19/7 205/8 209/9 702 | f 21/7 217/8 218/9 703 | f 22/7 224/8 220/9 704 | f 24/7 233/8 230/9 705 | f 18/7 201/8 200/9 706 | f 14/7 182/8 180/9 707 | f 20/7 214/8 210/9 708 | f 23/7 229/8 225/9 709 | f 18/7 203/8 201/9 710 | f 24/7 232/8 233/9 711 | f 23/7 226/8 229/9 712 | f 20/7 212/8 214/9 713 | f 14/7 183/8 182/9 714 | f 22/7 222/8 221/9 715 | f 17/7 195/8 196/9 716 | f 15/7 187/8 185/9 717 | f 19/7 208/8 206/9 718 | f 21/7 219/8 216/9 719 | f 22/7 223/8 222/9 720 | f 17/7 199/8 195/9 721 | f 15/7 188/8 187/9 722 | f 19/7 207/8 208/9 723 | f 21/7 215/8 219/9 724 | f 18/7 200/8 204/9 725 | f 14/7 180/8 181/9 726 | f 20/7 210/8 211/9 727 | f 23/7 225/8 228/9 728 | f 24/7 230/8 234/9 729 | f 22/7 220/8 223/9 730 | f 17/7 197/8 199/9 731 | f 15/7 189/8 188/9 732 | f 19/7 209/8 207/9 733 | f 21/7 218/8 215/9 734 | f 17/7 196/8 198/9 735 | f 15/7 185/8 186/9 736 | f 19/7 206/8 205/9 737 | f 21/7 216/8 217/9 738 | f 22/7 221/8 224/9 739 | f 18/7 202/8 203/9 740 | f 24/7 231/8 232/9 741 | f 23/7 227/8 226/9 742 | f 20/7 213/8 212/9 743 | f 14/7 184/8 183/9 744 | f 47/7 369/8 370/9 745 | f 30/7 267/8 268/9 746 | f 31/7 274/8 273/9 747 | f 52/7 400/8 399/9 748 | f 54/7 412/8 411/9 749 | f 46/7 364/8 363/9 750 | f 45/7 359/8 360/9 751 | f 37/7 310/8 312/9 752 | f 48/7 376/8 378/9 753 | f 32/7 281/8 279/9 754 | f 44/7 351/8 352/9 755 | f 35/7 297/8 299/9 756 | f 36/7 305/8 303/9 757 | f 49/7 382/8 381/9 758 | f 53/7 408/8 407/9 759 | f 46/7 365/8 366/9 760 | f 45/7 358/8 357/9 761 | f 37/7 311/8 309/9 762 | f 48/7 377/8 375/9 763 | f 32/7 280/8 282/9 764 | f 29/7 261/8 259/9 765 | f 26/7 243/8 241/9 766 | f 25/7 238/8 235/9 767 | f 27/7 250/8 247/9 768 | f 28/7 256/8 253/9 769 | f 30/7 269/8 265/9 770 | f 47/7 371/8 367/9 771 | f 54/7 414/8 410/9 772 | f 52/7 402/8 398/9 773 | f 31/7 276/8 272/9 774 | f 42/7 339/8 337/9 775 | f 39/7 321/8 319/9 776 | f 34/7 294/8 290/9 777 | f 40/7 329/8 325/9 778 | f 41/7 334/8 331/9 779 | f 44/7 353/8 349/9 780 | f 35/7 298/8 295/9 781 | f 36/7 306/8 302/9 782 | f 49/7 384/8 380/9 783 | f 53/7 406/8 404/9 784 | f 47/7 370/8 368/9 785 | f 30/7 268/8 266/9 786 | f 31/7 273/8 271/9 787 | f 52/7 399/8 397/9 788 | f 54/7 411/8 409/9 789 | f 46/7 363/8 361/9 790 | f 45/7 360/8 356/9 791 | f 37/7 312/8 308/9 792 | f 48/7 378/8 374/9 793 | f 32/7 279/8 277/9 794 | f 44/7 352/8 350/9 795 | f 35/7 299/8 296/9 796 | f 36/7 303/8 301/9 797 | f 49/7 381/8 379/9 798 | f 53/7 407/8 403/9 799 | f 46/7 366/8 362/9 800 | f 45/7 357/8 355/9 801 | f 37/7 309/8 307/9 802 | f 48/7 375/8 373/9 803 | f 32/7 282/8 278/9 804 | f 26/7 246/8 242/9 805 | f 25/7 239/8 236/9 806 | f 27/7 251/8 248/9 807 | f 28/7 257/8 254/9 808 | f 29/7 264/8 260/9 809 | f 33/7 287/8 284/9 810 | f 43/7 346/8 343/9 811 | f 38/7 316/8 313/9 812 | f 50/7 389/8 385/9 813 | f 51/7 394/8 392/9 814 | f 39/7 324/8 320/9 815 | f 34/7 291/8 289/9 816 | f 40/7 328/8 326/9 817 | f 41/7 335/8 332/9 818 | f 42/7 342/8 338/9 819 | f 43/7 347/8 344/9 820 | f 38/7 317/8 314/9 821 | f 50/7 388/8 386/9 822 | f 51/7 395/8 391/9 823 | f 33/7 286/8 283/9 824 | f 26/7 244/8 246/9 825 | f 25/7 237/8 239/9 826 | f 27/7 249/8 251/9 827 | f 28/7 255/8 257/9 828 | f 29/7 262/8 264/9 829 | f 33/7 285/8 287/9 830 | f 43/7 348/8 346/9 831 | f 38/7 318/8 316/9 832 | f 50/7 390/8 389/9 833 | f 51/7 393/8 394/9 834 | f 39/7 323/8 324/9 835 | f 34/7 293/8 291/9 836 | f 40/7 327/8 328/9 837 | f 41/7 333/8 335/9 838 | f 42/7 340/8 342/9 839 | f 43/7 345/8 347/9 840 | f 38/7 315/8 317/9 841 | f 50/7 387/8 388/9 842 | f 51/7 396/8 395/9 843 | f 33/7 288/8 286/9 844 | f 26/7 241/8 244/9 845 | f 25/7 235/8 237/9 846 | f 27/7 247/8 249/9 847 | f 28/7 253/8 255/9 848 | f 29/7 259/8 262/9 849 | f 33/7 283/8 285/9 850 | f 43/7 344/8 348/9 851 | f 38/7 314/8 318/9 852 | f 50/7 386/8 390/9 853 | f 51/7 391/8 393/9 854 | f 39/7 319/8 323/9 855 | f 34/7 290/8 293/9 856 | f 40/7 325/8 327/9 857 | f 41/7 331/8 333/9 858 | f 42/7 337/8 340/9 859 | f 43/7 343/8 345/9 860 | f 38/7 313/8 315/9 861 | f 50/7 385/8 387/9 862 | f 51/7 392/8 396/9 863 | f 33/7 284/8 288/9 864 | f 29/7 260/8 263/9 865 | f 26/7 242/8 245/9 866 | f 25/7 236/8 240/9 867 | f 27/7 248/8 252/9 868 | f 28/7 254/8 258/9 869 | f 30/7 266/8 270/9 870 | f 47/7 368/8 372/9 871 | f 54/7 409/8 413/9 872 | f 52/7 397/8 401/9 873 | f 31/7 271/8 275/9 874 | f 42/7 338/8 341/9 875 | f 39/7 320/8 322/9 876 | f 34/7 289/8 292/9 877 | f 40/7 326/8 330/9 878 | f 41/7 332/8 336/9 879 | f 44/7 350/8 354/9 880 | f 35/7 296/8 300/9 881 | f 36/7 301/8 304/9 882 | f 49/7 379/8 383/9 883 | f 53/7 403/8 405/9 884 | f 47/7 367/8 369/9 885 | f 30/7 265/8 267/9 886 | f 31/7 272/8 274/9 887 | f 52/7 398/8 400/9 888 | f 54/7 410/8 412/9 889 | f 46/7 362/8 364/9 890 | f 45/7 355/8 359/9 891 | f 37/7 307/8 310/9 892 | f 48/7 373/8 376/9 893 | f 32/7 278/8 281/9 894 | f 44/7 349/8 351/9 895 | f 35/7 295/8 297/9 896 | f 36/7 302/8 305/9 897 | f 49/7 380/8 382/9 898 | f 53/7 404/8 408/9 899 | f 46/7 361/8 365/9 900 | f 45/7 356/8 358/9 901 | f 37/7 308/8 311/9 902 | f 48/7 374/8 377/9 903 | f 32/7 277/8 280/9 904 | f 29/7 263/8 261/9 905 | f 26/7 245/8 243/9 906 | f 25/7 240/8 238/9 907 | f 27/7 252/8 250/9 908 | f 28/7 258/8 256/9 909 | f 30/7 270/8 269/9 910 | f 47/7 372/8 371/9 911 | f 54/7 413/8 414/9 912 | f 52/7 401/8 402/9 913 | f 31/7 275/8 276/9 914 | f 42/7 341/8 339/9 915 | f 39/7 322/8 321/9 916 | f 34/7 292/8 294/9 917 | f 40/7 330/8 329/9 918 | f 41/7 336/8 334/9 919 | f 44/7 354/8 353/9 920 | f 35/7 300/8 298/9 921 | f 36/7 304/8 306/9 922 | f 49/7 383/8 384/9 923 | f 53/7 405/8 406/9 924 | f 119/7 421/8 428/9 925 | f 115/7 417/8 420/9 926 | f 116/7 423/8 418/9 927 | f 122/7 426/8 424/9 928 | f 125/7 429/8 427/9 929 | f 130/7 443/8 436/9 930 | f 166/7 500/8 504/9 931 | f 153/7 587/8 594/9 932 | f 174/7 575/8 577/9 933 | f 133/7 531/8 526/9 934 | f 154/7 466/8 473/9 935 | f 141/7 462/8 465/9 936 | f 142/7 468/8 463/9 937 | f 156/7 471/8 469/9 938 | f 158/7 474/8 472/9 939 | f 163/7 484/8 487/9 940 | f 143/7 458/8 451/9 941 | f 148/7 518/8 508/9 942 | f 173/7 547/8 545/9 943 | f 138/7 553/8 563/9 944 | f 128/7 582/8 591/9 945 | f 120/7 492/8 495/9 946 | f 118/7 433/8 438/9 947 | f 124/7 523/8 533/9 948 | f 127/7 568/8 578/9 949 | f 131/7 496/8 501/9 950 | f 168/7 592/8 590/9 951 | f 151/7 579/8 572/9 952 | f 172/7 534/8 530/9 953 | f 132/7 439/8 441/9 954 | f 161/7 556/8 559/9 955 | f 144/7 480/8 477/9 956 | f 140/7 448/8 453/9 957 | f 157/7 511/8 516/9 958 | f 160/7 542/8 549/9 959 | f 167/7 560/8 562/9 960 | f 145/7 478/8 488/9 961 | f 146/7 454/8 456/9 962 | f 169/7 517/8 514/9 963 | f 136/7 548/8 538/9 964 | f 121/7 503/8 493/9 965 | f 117/7 435/8 432/9 966 | f 123/7 525/8 522/9 967 | f 126/7 576/8 567/9 968 | f 129/7 593/8 583/9 969 | f 137/7 561/8 552/9 970 | f 164/7 489/8 485/9 971 | f 149/7 457/8 459/9 972 | f 170/7 515/8 519/9 973 | f 135/7 537/8 546/9 974 | f 155/7 486/8 481/9 975 | f 139/7 450/8 447/9 976 | f 147/7 507/8 510/9 977 | f 159/7 544/8 541/9 978 | f 162/7 564/8 557/9 979 | f 165/7 502/8 499/9 980 | f 152/7 589/8 586/9 981 | f 150/7 571/8 574/9 982 | f 171/7 529/8 532/9 983 | f 134/7 442/8 444/9 984 | f 119/7 602/8 601/9 985 | f 115/7 596/8 595/9 986 | f 116/7 597/8 598/9 987 | f 122/7 604/8 605/9 988 | f 125/7 607/8 608/9 989 | f 130/7 610/8 611/9 990 | f 166/7 648/8 645/9 991 | f 153/7 633/8 632/9 992 | f 174/7 654/8 652/9 993 | f 133/7 613/8 615/9 994 | f 154/7 635/8 634/9 995 | f 141/7 623/8 619/9 996 | f 142/7 621/8 624/9 997 | f 156/7 637/8 638/9 998 | f 158/7 640/8 641/9 999 | f 163/7 644/8 643/9 1000 | f 143/7 625/8 626/9 1001 | f 148/7 628/8 630/9 1002 | f 173/7 650/8 653/9 1003 | f 138/7 618/8 617/9 1004 | f 59/7 419/8 179/9 1005 | f 56/7 415/8 176/9 1006 | f 55/7 416/8 175/9 1007 | f 57/7 422/8 177/9 1008 | f 58/7 425/8 178/9 1009 | f 61/7 434/8 181/9 1010 | f 84/7 498/8 204/9 1011 | f 114/7 585/8 234/9 1012 | f 108/7 573/8 228/9 1013 | f 91/7 524/8 211/9 1014 | f 74/7 464/8 194/9 1015 | f 71/7 460/8 191/9 1016 | f 70/7 461/8 190/9 1017 | f 72/7 467/8 192/9 1018 | f 73/7 470/8 193/9 1019 | f 78/7 482/8 198/9 1020 | f 66/7 449/8 186/9 1021 | f 85/7 506/8 205/9 1022 | f 97/7 543/8 217/9 1023 | f 104/7 551/8 224/9 1024 | f 113/7 580/8 233/9 1025 | f 81/7 490/8 201/9 1026 | f 62/7 431/8 182/9 1027 | f 94/7 521/8 214/9 1028 | f 109/7 566/8 229/9 1029 | f 83/7 494/8 203/9 1030 | f 112/7 588/8 232/9 1031 | f 106/7 570/8 226/9 1032 | f 92/7 528/8 212/9 1033 | f 63/7 437/8 183/9 1034 | f 102/7 554/8 222/9 1035 | f 75/7 475/8 195/9 1036 | f 67/7 446/8 187/9 1037 | f 88/7 509/8 208/9 1038 | f 99/7 540/8 219/9 1039 | f 103/7 558/8 223/9 1040 | f 79/7 476/8 199/9 1041 | f 68/7 452/8 188/9 1042 | f 87/7 512/8 207/9 1043 | f 95/7 536/8 215/9 1044 | f 80/7 491/8 200/9 1045 | f 60/7 430/8 180/9 1046 | f 90/7 520/8 210/9 1047 | f 105/7 565/8 225/9 1048 | f 110/7 581/8 230/9 1049 | f 100/7 550/8 220/9 1050 | f 77/7 483/8 197/9 1051 | f 69/7 455/8 189/9 1052 | f 89/7 513/8 209/9 1053 | f 98/7 535/8 218/9 1054 | f 76/7 479/8 196/9 1055 | f 65/7 445/8 185/9 1056 | f 86/7 505/8 206/9 1057 | f 96/7 539/8 216/9 1058 | f 101/7 555/8 221/9 1059 | f 82/7 497/8 202/9 1060 | f 111/7 584/8 231/9 1061 | f 107/7 569/8 227/9 1062 | f 93/7 527/8 213/9 1063 | f 64/7 440/8 184/9 1064 | f 121/7 603/8 369/9 1065 | f 117/7 599/8 267/9 1066 | f 123/7 600/8 274/9 1067 | f 126/7 606/8 400/9 1068 | f 129/7 609/8 412/9 1069 | f 137/7 612/8 364/9 1070 | f 164/7 646/8 359/9 1071 | f 149/7 631/8 310/9 1072 | f 170/7 651/8 376/9 1073 | f 135/7 614/8 281/9 1074 | f 155/7 636/8 351/9 1075 | f 139/7 620/8 297/9 1076 | f 147/7 622/8 305/9 1077 | f 159/7 639/8 382/9 1078 | f 162/7 642/8 408/9 1079 | f 165/7 647/8 365/9 1080 | f 152/7 627/8 358/9 1081 | f 150/7 629/8 311/9 1082 | f 171/7 649/8 377/9 1083 | f 134/7 616/8 280/9 1084 | f 119/7 428/8 261/9 1085 | f 115/7 420/8 243/9 1086 | f 116/7 418/8 238/9 1087 | f 122/7 424/8 250/9 1088 | f 125/7 427/8 256/9 1089 | f 130/7 436/8 269/9 1090 | f 166/7 504/8 371/9 1091 | f 153/7 594/8 414/9 1092 | f 174/7 577/8 402/9 1093 | f 133/7 526/8 276/9 1094 | f 154/7 473/8 339/9 1095 | f 141/7 465/8 321/9 1096 | f 142/7 463/8 294/9 1097 | f 156/7 469/8 329/9 1098 | f 158/7 472/8 334/9 1099 | f 163/7 487/8 353/9 1100 | f 143/7 451/8 298/9 1101 | f 148/7 508/8 306/9 1102 | f 173/7 545/8 384/9 1103 | f 138/7 563/8 406/9 1104 | f 128/7 591/8 370/9 1105 | f 120/7 495/8 268/9 1106 | f 118/7 438/8 273/9 1107 | f 124/7 533/8 399/9 1108 | f 127/7 578/8 411/9 1109 | f 131/7 501/8 363/9 1110 | f 168/7 590/8 360/9 1111 | f 151/7 572/8 312/9 1112 | f 172/7 530/8 378/9 1113 | f 132/7 441/8 279/9 1114 | f 161/7 559/8 352/9 1115 | f 144/7 477/8 299/9 1116 | f 140/7 453/8 303/9 1117 | f 157/7 516/8 381/9 1118 | f 160/7 549/8 407/9 1119 | f 167/7 562/8 366/9 1120 | f 145/7 488/8 357/9 1121 | f 146/7 456/8 309/9 1122 | f 169/7 514/8 375/9 1123 | f 136/7 538/8 282/9 1124 | f 121/7 493/8 246/9 1125 | f 117/7 432/8 239/9 1126 | f 123/7 522/8 251/9 1127 | f 126/7 567/8 257/9 1128 | f 129/7 583/8 264/9 1129 | f 137/7 552/8 287/9 1130 | f 164/7 485/8 346/9 1131 | f 149/7 459/8 316/9 1132 | f 170/7 519/8 389/9 1133 | f 135/7 546/8 394/9 1134 | f 155/7 481/8 324/9 1135 | f 139/7 447/8 291/9 1136 | f 147/7 510/8 328/9 1137 | f 159/7 541/8 335/9 1138 | f 162/7 557/8 342/9 1139 | f 165/7 499/8 347/9 1140 | f 152/7 586/8 317/9 1141 | f 150/7 574/8 388/9 1142 | f 171/7 532/8 395/9 1143 | f 134/7 444/8 286/9 1144 | f 119/7 601/8 244/9 1145 | f 115/7 595/8 237/9 1146 | f 116/7 598/8 249/9 1147 | f 122/7 605/8 255/9 1148 | f 125/7 608/8 262/9 1149 | f 130/7 611/8 285/9 1150 | f 166/7 645/8 348/9 1151 | f 153/7 632/8 318/9 1152 | f 174/7 652/8 390/9 1153 | f 133/7 615/8 393/9 1154 | f 154/7 634/8 323/9 1155 | f 141/7 619/8 293/9 1156 | f 142/7 624/8 327/9 1157 | f 156/7 638/8 333/9 1158 | f 158/7 641/8 340/9 1159 | f 163/7 643/8 345/9 1160 | f 143/7 626/8 315/9 1161 | f 148/7 630/8 387/9 1162 | f 173/7 653/8 396/9 1163 | f 138/7 617/8 288/9 1164 | f 56/7 421/8 241/9 1165 | f 55/7 417/8 235/9 1166 | f 57/7 423/8 247/9 1167 | f 58/7 426/8 253/9 1168 | f 59/7 429/8 259/9 1169 | f 64/7 443/8 283/9 1170 | f 82/7 500/8 344/9 1171 | f 111/7 587/8 314/9 1172 | f 107/7 575/8 386/9 1173 | f 93/7 531/8 391/9 1174 | f 71/7 466/8 319/9 1175 | f 70/7 462/8 290/9 1176 | f 72/7 468/8 325/9 1177 | f 73/7 471/8 331/9 1178 | f 74/7 474/8 337/9 1179 | f 77/7 484/8 343/9 1180 | f 69/7 458/8 313/9 1181 | f 89/7 518/8 385/9 1182 | f 98/7 547/8 392/9 1183 | f 100/7 553/8 284/9 1184 | f 110/7 582/8 260/9 1185 | f 80/7 492/8 242/9 1186 | f 60/7 433/8 236/9 1187 | f 90/7 523/8 248/9 1188 | f 105/7 568/8 254/9 1189 | f 81/7 496/8 266/9 1190 | f 113/7 592/8 368/9 1191 | f 109/7 579/8 409/9 1192 | f 94/7 534/8 397/9 1193 | f 62/7 439/8 271/9 1194 | f 101/7 556/8 338/9 1195 | f 76/7 480/8 320/9 1196 | f 65/7 448/8 289/9 1197 | f 86/7 511/8 326/9 1198 | f 96/7 542/8 332/9 1199 | f 102/7 560/8 350/9 1200 | f 75/7 478/8 296/9 1201 | f 67/7 454/8 301/9 1202 | f 88/7 517/8 379/9 1203 | f 99/7 548/8 403/9 1204 | f 84/7 503/8 367/9 1205 | f 61/7 435/8 265/9 1206 | f 91/7 525/8 272/9 1207 | f 108/7 576/8 398/9 1208 | f 114/7 593/8 410/9 1209 | f 103/7 561/8 362/9 1210 | f 79/7 489/8 355/9 1211 | f 68/7 457/8 307/9 1212 | f 87/7 515/8 373/9 1213 | f 95/7 537/8 278/9 1214 | f 78/7 486/8 349/9 1215 | f 66/7 450/8 295/9 1216 | f 85/7 507/8 302/9 1217 | f 97/7 544/8 380/9 1218 | f 104/7 564/8 404/9 1219 | f 83/7 502/8 361/9 1220 | f 112/7 589/8 356/9 1221 | f 106/7 571/8 308/9 1222 | f 92/7 529/8 374/9 1223 | f 63/7 442/8 277/9 1224 | f 128/7 602/8 263/9 1225 | f 120/7 596/8 245/9 1226 | f 118/7 597/8 240/9 1227 | f 124/7 604/8 252/9 1228 | f 127/7 607/8 258/9 1229 | f 131/7 610/8 270/9 1230 | f 168/7 648/8 372/9 1231 | f 151/7 633/8 413/9 1232 | f 172/7 654/8 401/9 1233 | f 132/7 613/8 275/9 1234 | f 161/7 635/8 341/9 1235 | f 144/7 623/8 322/9 1236 | f 140/7 621/8 292/9 1237 | f 157/7 637/8 330/9 1238 | f 160/7 640/8 336/9 1239 | f 167/7 644/8 354/9 1240 | f 145/7 625/8 300/9 1241 | f 146/7 628/8 304/9 1242 | f 169/7 650/8 383/9 1243 | f 136/7 618/8 405/9 1244 | f 56/7 419/8 421/9 1245 | f 55/7 415/8 417/9 1246 | f 57/7 416/8 423/9 1247 | f 58/7 422/8 426/9 1248 | f 59/7 425/8 429/9 1249 | f 64/7 434/8 443/9 1250 | f 82/7 498/8 500/9 1251 | f 111/7 585/8 587/9 1252 | f 107/7 573/8 575/9 1253 | f 93/7 524/8 531/9 1254 | f 71/7 464/8 466/9 1255 | f 70/7 460/8 462/9 1256 | f 72/7 461/8 468/9 1257 | f 73/7 467/8 471/9 1258 | f 74/7 470/8 474/9 1259 | f 77/7 482/8 484/9 1260 | f 69/7 449/8 458/9 1261 | f 89/7 506/8 518/9 1262 | f 98/7 543/8 547/9 1263 | f 100/7 551/8 553/9 1264 | f 110/7 580/8 582/9 1265 | f 80/7 490/8 492/9 1266 | f 60/7 431/8 433/9 1267 | f 90/7 521/8 523/9 1268 | f 105/7 566/8 568/9 1269 | f 81/7 494/8 496/9 1270 | f 113/7 588/8 592/9 1271 | f 109/7 570/8 579/9 1272 | f 94/7 528/8 534/9 1273 | f 62/7 437/8 439/9 1274 | f 101/7 554/8 556/9 1275 | f 76/7 475/8 480/9 1276 | f 65/7 446/8 448/9 1277 | f 86/7 509/8 511/9 1278 | f 96/7 540/8 542/9 1279 | f 102/7 558/8 560/9 1280 | f 75/7 476/8 478/9 1281 | f 67/7 452/8 454/9 1282 | f 88/7 512/8 517/9 1283 | f 99/7 536/8 548/9 1284 | f 84/7 491/8 503/9 1285 | f 61/7 430/8 435/9 1286 | f 91/7 520/8 525/9 1287 | f 108/7 565/8 576/9 1288 | f 114/7 581/8 593/9 1289 | f 103/7 550/8 561/9 1290 | f 79/7 483/8 489/9 1291 | f 68/7 455/8 457/9 1292 | f 87/7 513/8 515/9 1293 | f 95/7 535/8 537/9 1294 | f 78/7 479/8 486/9 1295 | f 66/7 445/8 450/9 1296 | f 85/7 505/8 507/9 1297 | f 97/7 539/8 544/9 1298 | f 104/7 555/8 564/9 1299 | f 83/7 497/8 502/9 1300 | f 112/7 584/8 589/9 1301 | f 106/7 569/8 571/9 1302 | f 92/7 527/8 529/9 1303 | f 63/7 440/8 442/9 1304 | f 128/7 603/8 602/9 1305 | f 120/7 599/8 596/9 1306 | f 118/7 600/8 597/9 1307 | f 124/7 606/8 604/9 1308 | f 127/7 609/8 607/9 1309 | f 131/7 612/8 610/9 1310 | f 168/7 646/8 648/9 1311 | f 151/7 631/8 633/9 1312 | f 172/7 651/8 654/9 1313 | f 132/7 614/8 613/9 1314 | f 161/7 636/8 635/9 1315 | f 144/7 620/8 623/9 1316 | f 140/7 622/8 621/9 1317 | f 157/7 639/8 637/9 1318 | f 160/7 642/8 640/9 1319 | f 167/7 647/8 644/9 1320 | f 145/7 627/8 625/9 1321 | f 146/7 629/8 628/9 1322 | f 169/7 649/8 650/9 1323 | f 136/7 616/8 618/9 1324 | f 56/7 176/8 419/9 1325 | f 55/7 175/8 415/9 1326 | f 57/7 177/8 416/9 1327 | f 58/7 178/8 422/9 1328 | f 59/7 179/8 425/9 1329 | f 64/7 184/8 434/9 1330 | f 82/7 202/8 498/9 1331 | f 111/7 231/8 585/9 1332 | f 107/7 227/8 573/9 1333 | f 93/7 213/8 524/9 1334 | f 71/7 191/8 464/9 1335 | f 70/7 190/8 460/9 1336 | f 72/7 192/8 461/9 1337 | f 73/7 193/8 467/9 1338 | f 74/7 194/8 470/9 1339 | f 77/7 197/8 482/9 1340 | f 69/7 189/8 449/9 1341 | f 89/7 209/8 506/9 1342 | f 98/7 218/8 543/9 1343 | f 100/7 220/8 551/9 1344 | f 110/7 230/8 580/9 1345 | f 80/7 200/8 490/9 1346 | f 60/7 180/8 431/9 1347 | f 90/7 210/8 521/9 1348 | f 105/7 225/8 566/9 1349 | f 81/7 201/8 494/9 1350 | f 113/7 233/8 588/9 1351 | f 109/7 229/8 570/9 1352 | f 94/7 214/8 528/9 1353 | f 62/7 182/8 437/9 1354 | f 101/7 221/8 554/9 1355 | f 76/7 196/8 475/9 1356 | f 65/7 185/8 446/9 1357 | f 86/7 206/8 509/9 1358 | f 96/7 216/8 540/9 1359 | f 102/7 222/8 558/9 1360 | f 75/7 195/8 476/9 1361 | f 67/7 187/8 452/9 1362 | f 88/7 208/8 512/9 1363 | f 99/7 219/8 536/9 1364 | f 84/7 204/8 491/9 1365 | f 61/7 181/8 430/9 1366 | f 91/7 211/8 520/9 1367 | f 108/7 228/8 565/9 1368 | f 114/7 234/8 581/9 1369 | f 103/7 223/8 550/9 1370 | f 79/7 199/8 483/9 1371 | f 68/7 188/8 455/9 1372 | f 87/7 207/8 513/9 1373 | f 95/7 215/8 535/9 1374 | f 78/7 198/8 479/9 1375 | f 66/7 186/8 445/9 1376 | f 85/7 205/8 505/9 1377 | f 97/7 217/8 539/9 1378 | f 104/7 224/8 555/9 1379 | f 83/7 203/8 497/9 1380 | f 112/7 232/8 584/9 1381 | f 106/7 226/8 569/9 1382 | f 92/7 212/8 527/9 1383 | f 63/7 183/8 440/9 1384 | f 128/7 370/8 603/9 1385 | f 120/7 268/8 599/9 1386 | f 118/7 273/8 600/9 1387 | f 124/7 399/8 606/9 1388 | f 127/7 411/8 609/9 1389 | f 131/7 363/8 612/9 1390 | f 168/7 360/8 646/9 1391 | f 151/7 312/8 631/9 1392 | f 172/7 378/8 651/9 1393 | f 132/7 279/8 614/9 1394 | f 161/7 352/8 636/9 1395 | f 144/7 299/8 620/9 1396 | f 140/7 303/8 622/9 1397 | f 157/7 381/8 639/9 1398 | f 160/7 407/8 642/9 1399 | f 167/7 366/8 647/9 1400 | f 145/7 357/8 627/9 1401 | f 146/7 309/8 629/9 1402 | f 169/7 375/8 649/9 1403 | f 136/7 282/8 616/9 1404 | f 59/7 259/8 428/9 1405 | f 56/7 241/8 420/9 1406 | f 55/7 235/8 418/9 1407 | f 57/7 247/8 424/9 1408 | f 58/7 253/8 427/9 1409 | f 61/7 265/8 436/9 1410 | f 84/7 367/8 504/9 1411 | f 114/7 410/8 594/9 1412 | f 108/7 398/8 577/9 1413 | f 91/7 272/8 526/9 1414 | f 74/7 337/8 473/9 1415 | f 71/7 319/8 465/9 1416 | f 70/7 290/8 463/9 1417 | f 72/7 325/8 469/9 1418 | f 73/7 331/8 472/9 1419 | f 78/7 349/8 487/9 1420 | f 66/7 295/8 451/9 1421 | f 85/7 302/8 508/9 1422 | f 97/7 380/8 545/9 1423 | f 104/7 404/8 563/9 1424 | f 113/7 368/8 591/9 1425 | f 81/7 266/8 495/9 1426 | f 62/7 271/8 438/9 1427 | f 94/7 397/8 533/9 1428 | f 109/7 409/8 578/9 1429 | f 83/7 361/8 501/9 1430 | f 112/7 356/8 590/9 1431 | f 106/7 308/8 572/9 1432 | f 92/7 374/8 530/9 1433 | f 63/7 277/8 441/9 1434 | f 102/7 350/8 559/9 1435 | f 75/7 296/8 477/9 1436 | f 67/7 301/8 453/9 1437 | f 88/7 379/8 516/9 1438 | f 99/7 403/8 549/9 1439 | f 103/7 362/8 562/9 1440 | f 79/7 355/8 488/9 1441 | f 68/7 307/8 456/9 1442 | f 87/7 373/8 514/9 1443 | f 95/7 278/8 538/9 1444 | f 80/7 242/8 493/9 1445 | f 60/7 236/8 432/9 1446 | f 90/7 248/8 522/9 1447 | f 105/7 254/8 567/9 1448 | f 110/7 260/8 583/9 1449 | f 100/7 284/8 552/9 1450 | f 77/7 343/8 485/9 1451 | f 69/7 313/8 459/9 1452 | f 89/7 385/8 519/9 1453 | f 98/7 392/8 546/9 1454 | f 76/7 320/8 481/9 1455 | f 65/7 289/8 447/9 1456 | f 86/7 326/8 510/9 1457 | f 96/7 332/8 541/9 1458 | f 101/7 338/8 557/9 1459 | f 82/7 344/8 499/9 1460 | f 111/7 314/8 586/9 1461 | f 107/7 386/8 574/9 1462 | f 93/7 391/8 532/9 1463 | f 64/7 283/8 444/9 1464 | f 121/7 246/8 601/9 1465 | f 117/7 239/8 595/9 1466 | f 123/7 251/8 598/9 1467 | f 126/7 257/8 605/9 1468 | f 129/7 264/8 608/9 1469 | f 137/7 287/8 611/9 1470 | f 164/7 346/8 645/9 1471 | f 149/7 316/8 632/9 1472 | f 170/7 389/8 652/9 1473 | f 135/7 394/8 615/9 1474 | f 155/7 324/8 634/9 1475 | f 139/7 291/8 619/9 1476 | f 147/7 328/8 624/9 1477 | f 159/7 335/8 638/9 1478 | f 162/7 342/8 641/9 1479 | f 165/7 347/8 643/9 1480 | f 152/7 317/8 626/9 1481 | f 150/7 388/8 630/9 1482 | f 171/7 395/8 653/9 1483 | f 134/7 286/8 617/9 1484 | f 119/7 244/8 421/9 1485 | f 115/7 237/8 417/9 1486 | f 116/7 249/8 423/9 1487 | f 122/7 255/8 426/9 1488 | f 125/7 262/8 429/9 1489 | f 130/7 285/8 443/9 1490 | f 166/7 348/8 500/9 1491 | f 153/7 318/8 587/9 1492 | f 174/7 390/8 575/9 1493 | f 133/7 393/8 531/9 1494 | f 154/7 323/8 466/9 1495 | f 141/7 293/8 462/9 1496 | f 142/7 327/8 468/9 1497 | f 156/7 333/8 471/9 1498 | f 158/7 340/8 474/9 1499 | f 163/7 345/8 484/9 1500 | f 143/7 315/8 458/9 1501 | f 148/7 387/8 518/9 1502 | f 173/7 396/8 547/9 1503 | f 138/7 288/8 553/9 1504 | f 128/7 263/8 582/9 1505 | f 120/7 245/8 492/9 1506 | f 118/7 240/8 433/9 1507 | f 124/7 252/8 523/9 1508 | f 127/7 258/8 568/9 1509 | f 131/7 270/8 496/9 1510 | f 168/7 372/8 592/9 1511 | f 151/7 413/8 579/9 1512 | f 172/7 401/8 534/9 1513 | f 132/7 275/8 439/9 1514 | f 161/7 341/8 556/9 1515 | f 144/7 322/8 480/9 1516 | f 140/7 292/8 448/9 1517 | f 157/7 330/8 511/9 1518 | f 160/7 336/8 542/9 1519 | f 167/7 354/8 560/9 1520 | f 145/7 300/8 478/9 1521 | f 146/7 304/8 454/9 1522 | f 169/7 383/8 517/9 1523 | f 136/7 405/8 548/9 1524 | f 121/7 369/8 503/9 1525 | f 117/7 267/8 435/9 1526 | f 123/7 274/8 525/9 1527 | f 126/7 400/8 576/9 1528 | f 129/7 412/8 593/9 1529 | f 137/7 364/8 561/9 1530 | f 164/7 359/8 489/9 1531 | f 149/7 310/8 457/9 1532 | f 170/7 376/8 515/9 1533 | f 135/7 281/8 537/9 1534 | f 155/7 351/8 486/9 1535 | f 139/7 297/8 450/9 1536 | f 147/7 305/8 507/9 1537 | f 159/7 382/8 544/9 1538 | f 162/7 408/8 564/9 1539 | f 165/7 365/8 502/9 1540 | f 152/7 358/8 589/9 1541 | f 150/7 311/8 571/9 1542 | f 171/7 377/8 529/9 1543 | f 134/7 280/8 442/9 1544 | f 119/7 261/8 602/9 1545 | f 115/7 243/8 596/9 1546 | f 116/7 238/8 597/9 1547 | f 122/7 250/8 604/9 1548 | f 125/7 256/8 607/9 1549 | f 130/7 269/8 610/9 1550 | f 166/7 371/8 648/9 1551 | f 153/7 414/8 633/9 1552 | f 174/7 402/8 654/9 1553 | f 133/7 276/8 613/9 1554 | f 154/7 339/8 635/9 1555 | f 141/7 321/8 623/9 1556 | f 142/7 294/8 621/9 1557 | f 156/7 329/8 637/9 1558 | f 158/7 334/8 640/9 1559 | f 163/7 353/8 644/9 1560 | f 143/7 298/8 625/9 1561 | f 148/7 306/8 628/9 1562 | f 173/7 384/8 650/9 1563 | f 138/7 406/8 618/9 1564 | f 59/7 428/8 419/9 1565 | f 56/7 420/8 415/9 1566 | f 55/7 418/8 416/9 1567 | f 57/7 424/8 422/9 1568 | f 58/7 427/8 425/9 1569 | f 61/7 436/8 434/9 1570 | f 84/7 504/8 498/9 1571 | f 114/7 594/8 585/9 1572 | f 108/7 577/8 573/9 1573 | f 91/7 526/8 524/9 1574 | f 74/7 473/8 464/9 1575 | f 71/7 465/8 460/9 1576 | f 70/7 463/8 461/9 1577 | f 72/7 469/8 467/9 1578 | f 73/7 472/8 470/9 1579 | f 78/7 487/8 482/9 1580 | f 66/7 451/8 449/9 1581 | f 85/7 508/8 506/9 1582 | f 97/7 545/8 543/9 1583 | f 104/7 563/8 551/9 1584 | f 113/7 591/8 580/9 1585 | f 81/7 495/8 490/9 1586 | f 62/7 438/8 431/9 1587 | f 94/7 533/8 521/9 1588 | f 109/7 578/8 566/9 1589 | f 83/7 501/8 494/9 1590 | f 112/7 590/8 588/9 1591 | f 106/7 572/8 570/9 1592 | f 92/7 530/8 528/9 1593 | f 63/7 441/8 437/9 1594 | f 102/7 559/8 554/9 1595 | f 75/7 477/8 475/9 1596 | f 67/7 453/8 446/9 1597 | f 88/7 516/8 509/9 1598 | f 99/7 549/8 540/9 1599 | f 103/7 562/8 558/9 1600 | f 79/7 488/8 476/9 1601 | f 68/7 456/8 452/9 1602 | f 87/7 514/8 512/9 1603 | f 95/7 538/8 536/9 1604 | f 80/7 493/8 491/9 1605 | f 60/7 432/8 430/9 1606 | f 90/7 522/8 520/9 1607 | f 105/7 567/8 565/9 1608 | f 110/7 583/8 581/9 1609 | f 100/7 552/8 550/9 1610 | f 77/7 485/8 483/9 1611 | f 69/7 459/8 455/9 1612 | f 89/7 519/8 513/9 1613 | f 98/7 546/8 535/9 1614 | f 76/7 481/8 479/9 1615 | f 65/7 447/8 445/9 1616 | f 86/7 510/8 505/9 1617 | f 96/7 541/8 539/9 1618 | f 101/7 557/8 555/9 1619 | f 82/7 499/8 497/9 1620 | f 111/7 586/8 584/9 1621 | f 107/7 574/8 569/9 1622 | f 93/7 532/8 527/9 1623 | f 64/7 444/8 440/9 1624 | f 121/7 601/8 603/9 1625 | f 117/7 595/8 599/9 1626 | f 123/7 598/8 600/9 1627 | f 126/7 605/8 606/9 1628 | f 129/7 608/8 609/9 1629 | f 137/7 611/8 612/9 1630 | f 164/7 645/8 646/9 1631 | f 149/7 632/8 631/9 1632 | f 170/7 652/8 651/9 1633 | f 135/7 615/8 614/9 1634 | f 155/7 634/8 636/9 1635 | f 139/7 619/8 620/9 1636 | f 147/7 624/8 622/9 1637 | f 159/7 638/8 639/9 1638 | f 162/7 641/8 642/9 1639 | f 165/7 643/8 647/9 1640 | f 152/7 626/8 627/9 1641 | f 150/7 630/8 629/9 1642 | f 171/7 653/8 649/9 1643 | f 134/7 617/8 616/9 1644 | f 419/7 176/8 179/9 1645 | f 415/7 175/8 176/9 1646 | f 416/7 177/8 175/9 1647 | f 422/7 178/8 177/9 1648 | f 425/7 179/8 178/9 1649 | f 434/7 184/8 181/9 1650 | f 498/7 202/8 204/9 1651 | f 585/7 231/8 234/9 1652 | f 573/7 227/8 228/9 1653 | f 524/7 213/8 211/9 1654 | f 464/7 191/8 194/9 1655 | f 460/7 190/8 191/9 1656 | f 461/7 192/8 190/9 1657 | f 467/7 193/8 192/9 1658 | f 470/7 194/8 193/9 1659 | f 482/7 197/8 198/9 1660 | f 449/7 189/8 186/9 1661 | f 506/7 209/8 205/9 1662 | f 543/7 218/8 217/9 1663 | f 551/7 220/8 224/9 1664 | f 580/7 230/8 233/9 1665 | f 490/7 200/8 201/9 1666 | f 431/7 180/8 182/9 1667 | f 521/7 210/8 214/9 1668 | f 566/7 225/8 229/9 1669 | f 494/7 201/8 203/9 1670 | f 588/7 233/8 232/9 1671 | f 570/7 229/8 226/9 1672 | f 528/7 214/8 212/9 1673 | f 437/7 182/8 183/9 1674 | f 554/7 221/8 222/9 1675 | f 475/7 196/8 195/9 1676 | f 446/7 185/8 187/9 1677 | f 509/7 206/8 208/9 1678 | f 540/7 216/8 219/9 1679 | f 558/7 222/8 223/9 1680 | f 476/7 195/8 199/9 1681 | f 452/7 187/8 188/9 1682 | f 512/7 208/8 207/9 1683 | f 536/7 219/8 215/9 1684 | f 491/7 204/8 200/9 1685 | f 430/7 181/8 180/9 1686 | f 520/7 211/8 210/9 1687 | f 565/7 228/8 225/9 1688 | f 581/7 234/8 230/9 1689 | f 550/7 223/8 220/9 1690 | f 483/7 199/8 197/9 1691 | f 455/7 188/8 189/9 1692 | f 513/7 207/8 209/9 1693 | f 535/7 215/8 218/9 1694 | f 479/7 198/8 196/9 1695 | f 445/7 186/8 185/9 1696 | f 505/7 205/8 206/9 1697 | f 539/7 217/8 216/9 1698 | f 555/7 224/8 221/9 1699 | f 497/7 203/8 202/9 1700 | f 584/7 232/8 231/9 1701 | f 569/7 226/8 227/9 1702 | f 527/7 212/8 213/9 1703 | f 440/7 183/8 184/9 1704 | f 603/7 370/8 369/9 1705 | f 599/7 268/8 267/9 1706 | f 600/7 273/8 274/9 1707 | f 606/7 399/8 400/9 1708 | f 609/7 411/8 412/9 1709 | f 612/7 363/8 364/9 1710 | f 646/7 360/8 359/9 1711 | f 631/7 312/8 310/9 1712 | f 651/7 378/8 376/9 1713 | f 614/7 279/8 281/9 1714 | f 636/7 352/8 351/9 1715 | f 620/7 299/8 297/9 1716 | f 622/7 303/8 305/9 1717 | f 639/7 381/8 382/9 1718 | f 642/7 407/8 408/9 1719 | f 647/7 366/8 365/9 1720 | f 627/7 357/8 358/9 1721 | f 629/7 309/8 311/9 1722 | f 649/7 375/8 377/9 1723 | f 616/7 282/8 280/9 1724 | f 428/7 259/8 261/9 1725 | f 420/7 241/8 243/9 1726 | f 418/7 235/8 238/9 1727 | f 424/7 247/8 250/9 1728 | f 427/7 253/8 256/9 1729 | f 436/7 265/8 269/9 1730 | f 504/7 367/8 371/9 1731 | f 594/7 410/8 414/9 1732 | f 577/7 398/8 402/9 1733 | f 526/7 272/8 276/9 1734 | f 473/7 337/8 339/9 1735 | f 465/7 319/8 321/9 1736 | f 463/7 290/8 294/9 1737 | f 469/7 325/8 329/9 1738 | f 472/7 331/8 334/9 1739 | f 487/7 349/8 353/9 1740 | f 451/7 295/8 298/9 1741 | f 508/7 302/8 306/9 1742 | f 545/7 380/8 384/9 1743 | f 563/7 404/8 406/9 1744 | f 591/7 368/8 370/9 1745 | f 495/7 266/8 268/9 1746 | f 438/7 271/8 273/9 1747 | f 533/7 397/8 399/9 1748 | f 578/7 409/8 411/9 1749 | f 501/7 361/8 363/9 1750 | f 590/7 356/8 360/9 1751 | f 572/7 308/8 312/9 1752 | f 530/7 374/8 378/9 1753 | f 441/7 277/8 279/9 1754 | f 559/7 350/8 352/9 1755 | f 477/7 296/8 299/9 1756 | f 453/7 301/8 303/9 1757 | f 516/7 379/8 381/9 1758 | f 549/7 403/8 407/9 1759 | f 562/7 362/8 366/9 1760 | f 488/7 355/8 357/9 1761 | f 456/7 307/8 309/9 1762 | f 514/7 373/8 375/9 1763 | f 538/7 278/8 282/9 1764 | f 493/7 242/8 246/9 1765 | f 432/7 236/8 239/9 1766 | f 522/7 248/8 251/9 1767 | f 567/7 254/8 257/9 1768 | f 583/7 260/8 264/9 1769 | f 552/7 284/8 287/9 1770 | f 485/7 343/8 346/9 1771 | f 459/7 313/8 316/9 1772 | f 519/7 385/8 389/9 1773 | f 546/7 392/8 394/9 1774 | f 481/7 320/8 324/9 1775 | f 447/7 289/8 291/9 1776 | f 510/7 326/8 328/9 1777 | f 541/7 332/8 335/9 1778 | f 557/7 338/8 342/9 1779 | f 499/7 344/8 347/9 1780 | f 586/7 314/8 317/9 1781 | f 574/7 386/8 388/9 1782 | f 532/7 391/8 395/9 1783 | f 444/7 283/8 286/9 1784 | f 601/7 246/8 244/9 1785 | f 595/7 239/8 237/9 1786 | f 598/7 251/8 249/9 1787 | f 605/7 257/8 255/9 1788 | f 608/7 264/8 262/9 1789 | f 611/7 287/8 285/9 1790 | f 645/7 346/8 348/9 1791 | f 632/7 316/8 318/9 1792 | f 652/7 389/8 390/9 1793 | f 615/7 394/8 393/9 1794 | f 634/7 324/8 323/9 1795 | f 619/7 291/8 293/9 1796 | f 624/7 328/8 327/9 1797 | f 638/7 335/8 333/9 1798 | f 641/7 342/8 340/9 1799 | f 643/7 347/8 345/9 1800 | f 626/7 317/8 315/9 1801 | f 630/7 388/8 387/9 1802 | f 653/7 395/8 396/9 1803 | f 617/7 286/8 288/9 1804 | f 421/7 244/8 241/9 1805 | f 417/7 237/8 235/9 1806 | f 423/7 249/8 247/9 1807 | f 426/7 255/8 253/9 1808 | f 429/7 262/8 259/9 1809 | f 443/7 285/8 283/9 1810 | f 500/7 348/8 344/9 1811 | f 587/7 318/8 314/9 1812 | f 575/7 390/8 386/9 1813 | f 531/7 393/8 391/9 1814 | f 466/7 323/8 319/9 1815 | f 462/7 293/8 290/9 1816 | f 468/7 327/8 325/9 1817 | f 471/7 333/8 331/9 1818 | f 474/7 340/8 337/9 1819 | f 484/7 345/8 343/9 1820 | f 458/7 315/8 313/9 1821 | f 518/7 387/8 385/9 1822 | f 547/7 396/8 392/9 1823 | f 553/7 288/8 284/9 1824 | f 582/7 263/8 260/9 1825 | f 492/7 245/8 242/9 1826 | f 433/7 240/8 236/9 1827 | f 523/7 252/8 248/9 1828 | f 568/7 258/8 254/9 1829 | f 496/7 270/8 266/9 1830 | f 592/7 372/8 368/9 1831 | f 579/7 413/8 409/9 1832 | f 534/7 401/8 397/9 1833 | f 439/7 275/8 271/9 1834 | f 556/7 341/8 338/9 1835 | f 480/7 322/8 320/9 1836 | f 448/7 292/8 289/9 1837 | f 511/7 330/8 326/9 1838 | f 542/7 336/8 332/9 1839 | f 560/7 354/8 350/9 1840 | f 478/7 300/8 296/9 1841 | f 454/7 304/8 301/9 1842 | f 517/7 383/8 379/9 1843 | f 548/7 405/8 403/9 1844 | f 503/7 369/8 367/9 1845 | f 435/7 267/8 265/9 1846 | f 525/7 274/8 272/9 1847 | f 576/7 400/8 398/9 1848 | f 593/7 412/8 410/9 1849 | f 561/7 364/8 362/9 1850 | f 489/7 359/8 355/9 1851 | f 457/7 310/8 307/9 1852 | f 515/7 376/8 373/9 1853 | f 537/7 281/8 278/9 1854 | f 486/7 351/8 349/9 1855 | f 450/7 297/8 295/9 1856 | f 507/7 305/8 302/9 1857 | f 544/7 382/8 380/9 1858 | f 564/7 408/8 404/9 1859 | f 502/7 365/8 361/9 1860 | f 589/7 358/8 356/9 1861 | f 571/7 311/8 308/9 1862 | f 529/7 377/8 374/9 1863 | f 442/7 280/8 277/9 1864 | f 602/7 261/8 263/9 1865 | f 596/7 243/8 245/9 1866 | f 597/7 238/8 240/9 1867 | f 604/7 250/8 252/9 1868 | f 607/7 256/8 258/9 1869 | f 610/7 269/8 270/9 1870 | f 648/7 371/8 372/9 1871 | f 633/7 414/8 413/9 1872 | f 654/7 402/8 401/9 1873 | f 613/7 276/8 275/9 1874 | f 635/7 339/8 341/9 1875 | f 623/7 321/8 322/9 1876 | f 621/7 294/8 292/9 1877 | f 637/7 329/8 330/9 1878 | f 640/7 334/8 336/9 1879 | f 644/7 353/8 354/9 1880 | f 625/7 298/8 300/9 1881 | f 628/7 306/8 304/9 1882 | f 650/7 384/8 383/9 1883 | f 618/7 406/8 405/9 1884 | f 419/7 428/8 421/9 1885 | f 415/7 420/8 417/9 1886 | f 416/7 418/8 423/9 1887 | f 422/7 424/8 426/9 1888 | f 425/7 427/8 429/9 1889 | f 434/7 436/8 443/9 1890 | f 498/7 504/8 500/9 1891 | f 585/7 594/8 587/9 1892 | f 573/7 577/8 575/9 1893 | f 524/7 526/8 531/9 1894 | f 464/7 473/8 466/9 1895 | f 460/7 465/8 462/9 1896 | f 461/7 463/8 468/9 1897 | f 467/7 469/8 471/9 1898 | f 470/7 472/8 474/9 1899 | f 482/7 487/8 484/9 1900 | f 449/7 451/8 458/9 1901 | f 506/7 508/8 518/9 1902 | f 543/7 545/8 547/9 1903 | f 551/7 563/8 553/9 1904 | f 580/7 591/8 582/9 1905 | f 490/7 495/8 492/9 1906 | f 431/7 438/8 433/9 1907 | f 521/7 533/8 523/9 1908 | f 566/7 578/8 568/9 1909 | f 494/7 501/8 496/9 1910 | f 588/7 590/8 592/9 1911 | f 570/7 572/8 579/9 1912 | f 528/7 530/8 534/9 1913 | f 437/7 441/8 439/9 1914 | f 554/7 559/8 556/9 1915 | f 475/7 477/8 480/9 1916 | f 446/7 453/8 448/9 1917 | f 509/7 516/8 511/9 1918 | f 540/7 549/8 542/9 1919 | f 558/7 562/8 560/9 1920 | f 476/7 488/8 478/9 1921 | f 452/7 456/8 454/9 1922 | f 512/7 514/8 517/9 1923 | f 536/7 538/8 548/9 1924 | f 491/7 493/8 503/9 1925 | f 430/7 432/8 435/9 1926 | f 520/7 522/8 525/9 1927 | f 565/7 567/8 576/9 1928 | f 581/7 583/8 593/9 1929 | f 550/7 552/8 561/9 1930 | f 483/7 485/8 489/9 1931 | f 455/7 459/8 457/9 1932 | f 513/7 519/8 515/9 1933 | f 535/7 546/8 537/9 1934 | f 479/7 481/8 486/9 1935 | f 445/7 447/8 450/9 1936 | f 505/7 510/8 507/9 1937 | f 539/7 541/8 544/9 1938 | f 555/7 557/8 564/9 1939 | f 497/7 499/8 502/9 1940 | f 584/7 586/8 589/9 1941 | f 569/7 574/8 571/9 1942 | f 527/7 532/8 529/9 1943 | f 440/7 444/8 442/9 1944 | f 603/7 601/8 602/9 1945 | f 599/7 595/8 596/9 1946 | f 600/7 598/8 597/9 1947 | f 606/7 605/8 604/9 1948 | f 609/7 608/8 607/9 1949 | f 612/7 611/8 610/9 1950 | f 646/7 645/8 648/9 1951 | f 631/7 632/8 633/9 1952 | f 651/7 652/8 654/9 1953 | f 614/7 615/8 613/9 1954 | f 636/7 634/8 635/9 1955 | f 620/7 619/8 623/9 1956 | f 622/7 624/8 621/9 1957 | f 639/7 638/8 637/9 1958 | f 642/7 641/8 640/9 1959 | f 647/7 643/8 644/9 1960 | f 627/7 626/8 625/9 1961 | f 629/7 630/8 628/9 1962 | f 649/7 653/8 650/9 1963 | f 616/7 617/8 618/9 -------------------------------------------------------------------------------- /data/joint_mesh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/joint_mesh.png -------------------------------------------------------------------------------- /data/rgbd_data.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/data/rgbd_data.pkl -------------------------------------------------------------------------------- /images/bridge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/bridge.jpg -------------------------------------------------------------------------------- /images/cow_mesh_axis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/cow_mesh_axis.png -------------------------------------------------------------------------------- /images/cow_render.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/cow_render.jpg -------------------------------------------------------------------------------- /images/cow_retextured.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/cow_retextured.jpg -------------------------------------------------------------------------------- /images/dolly.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/dolly.gif -------------------------------------------------------------------------------- /images/joint_mesh_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/joint_mesh_result.png -------------------------------------------------------------------------------- /images/plant.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/plant.jpg -------------------------------------------------------------------------------- /images/sphere_100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/sphere_100.jpg -------------------------------------------------------------------------------- /images/sphere_1000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/sphere_1000.jpg -------------------------------------------------------------------------------- /images/sphere_200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/sphere_200.jpg -------------------------------------------------------------------------------- /images/sphere_500.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/sphere_500.jpg -------------------------------------------------------------------------------- /images/sphere_mesh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/sphere_mesh.jpg -------------------------------------------------------------------------------- /images/transform1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/transform1.jpg -------------------------------------------------------------------------------- /images/transform2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/transform2.jpg -------------------------------------------------------------------------------- /images/transform3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/transform3.jpg -------------------------------------------------------------------------------- /images/transform4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/transform4.jpg -------------------------------------------------------------------------------- /images/transform_none.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/images/transform_none.jpg -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | imageio 2 | matplotlib 3 | numpy 4 | PyMCubes 5 | tqdm 6 | scipy 7 | plotly 8 | -------------------------------------------------------------------------------- /starter/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learning3d/assignment1/e3c25fbd7a6ae8d0212cf00c791f621483e51a04/starter/__init__.py -------------------------------------------------------------------------------- /starter/camera_transforms.py: -------------------------------------------------------------------------------- 1 | """ 2 | Usage: 3 | python -m starter.camera_transforms --image_size 512 4 | """ 5 | import argparse 6 | 7 | import matplotlib.pyplot as plt 8 | import pytorch3d 9 | import torch 10 | 11 | from starter.utils import get_device, get_mesh_renderer 12 | 13 | 14 | def render_textured_cow( 15 | cow_path="data/cow.obj", 16 | image_size=256, 17 | R_relative=[[1, 0, 0], [0, 1, 0], [0, 0, 1]], 18 | T_relative=[0, 0, 0], 19 | device=None, 20 | ): 21 | if device is None: 22 | device = get_device() 23 | meshes = pytorch3d.io.load_objs_as_meshes([cow_path]).to(device) 24 | R_relative = torch.tensor(R_relative).float() 25 | T_relative = torch.tensor(T_relative).float() 26 | R = R_relative @ torch.tensor([[1.0, 0, 0], [0, 1, 0], [0, 0, 1]]) 27 | T = R_relative @ torch.tensor([0.0, 0, 3]) + T_relative 28 | renderer = get_mesh_renderer(image_size=256) 29 | cameras = pytorch3d.renderer.FoVPerspectiveCameras( 30 | R=R.unsqueeze(0), T=T.unsqueeze(0), device=device, 31 | ) 32 | lights = pytorch3d.renderer.PointLights(location=[[0, 0.0, -3.0]], device=device,) 33 | rend = renderer(meshes, cameras=cameras, lights=lights) 34 | return rend[0, ..., :3].cpu().numpy() 35 | 36 | 37 | if __name__ == "__main__": 38 | parser = argparse.ArgumentParser() 39 | parser.add_argument("--cow_path", type=str, default="data/cow.obj") 40 | parser.add_argument("--image_size", type=int, default=256) 41 | parser.add_argument("--output_path", type=str, default="images/textured_cow.jpg") 42 | args = parser.parse_args() 43 | render_textured_cow(cow_path=args.cow_path, image_size=args.image_size) 44 | plt.imsave(args.output_path, render_textured_cow()) 45 | -------------------------------------------------------------------------------- /starter/dolly_zoom.py: -------------------------------------------------------------------------------- 1 | """ 2 | Usage: 3 | python -m starter.dolly_zoom --num_frames 10 4 | """ 5 | 6 | import argparse 7 | 8 | import imageio 9 | import numpy as np 10 | import pytorch3d 11 | import torch 12 | from PIL import Image, ImageDraw 13 | from tqdm.auto import tqdm 14 | 15 | from starter.utils import get_device, get_mesh_renderer 16 | 17 | 18 | def dolly_zoom( 19 | image_size=256, 20 | num_frames=10, 21 | duration=3, 22 | device=None, 23 | output_file="output/dolly.gif", 24 | ): 25 | if device is None: 26 | device = get_device() 27 | 28 | mesh = pytorch3d.io.load_objs_as_meshes(["data/cow_on_plane.obj"]) 29 | mesh = mesh.to(device) 30 | renderer = get_mesh_renderer(image_size=image_size, device=device) 31 | lights = pytorch3d.renderer.PointLights(location=[[0.0, 0.0, -3.0]], device=device) 32 | 33 | fovs = torch.linspace(5, 120, num_frames) 34 | 35 | renders = [] 36 | for fov in tqdm(fovs): 37 | distance = 3 # TODO: change this. 38 | T = [[0, 0, 3]] # TODO: Change this. 39 | cameras = pytorch3d.renderer.FoVPerspectiveCameras(fov=fov, T=T, device=device) 40 | rend = renderer(mesh, cameras=cameras, lights=lights) 41 | rend = rend[0, ..., :3].cpu().numpy() # (N, H, W, 3) 42 | renders.append(rend) 43 | 44 | images = [] 45 | for i, r in enumerate(renders): 46 | image = Image.fromarray((r * 255).astype(np.uint8)) 47 | draw = ImageDraw.Draw(image) 48 | draw.text((20, 20), f"fov: {fovs[i]:.2f}", fill=(255, 0, 0)) 49 | images.append(np.array(image)) 50 | imageio.mimsave(output_file, images, duration=duration) 51 | 52 | 53 | if __name__ == "__main__": 54 | parser = argparse.ArgumentParser() 55 | parser.add_argument("--num_frames", type=int, default=10) 56 | parser.add_argument("--duration", type=float, default=3) 57 | parser.add_argument("--output_file", type=str, default="images/dolly.gif") 58 | parser.add_argument("--image_size", type=int, default=256) 59 | args = parser.parse_args() 60 | dolly_zoom( 61 | image_size=args.image_size, 62 | num_frames=args.num_frames, 63 | duration=args.duration, 64 | output_file=args.output_file, 65 | ) 66 | -------------------------------------------------------------------------------- /starter/render_generic.py: -------------------------------------------------------------------------------- 1 | """ 2 | Sample code to render various representations. 3 | 4 | Usage: 5 | python -m starter.render_generic --render point_cloud # 5.1 6 | python -m starter.render_generic --render parametric --num_samples 100 # 5.2 7 | python -m starter.render_generic --render implicit # 5.3 8 | """ 9 | import argparse 10 | import pickle 11 | 12 | import matplotlib.pyplot as plt 13 | import mcubes 14 | import numpy as np 15 | import pytorch3d 16 | import torch 17 | 18 | from starter.utils import get_device, get_mesh_renderer, get_points_renderer 19 | 20 | 21 | def load_rgbd_data(path="data/rgbd_data.pkl"): 22 | with open(path, "rb") as f: 23 | data = pickle.load(f) 24 | return data 25 | 26 | 27 | def render_bridge( 28 | point_cloud_path="data/bridge_pointcloud.npz", 29 | image_size=256, 30 | background_color=(1, 1, 1), 31 | device=None, 32 | ): 33 | """ 34 | Renders a point cloud. 35 | """ 36 | if device is None: 37 | device = get_device() 38 | renderer = get_points_renderer( 39 | image_size=image_size, background_color=background_color 40 | ) 41 | point_cloud = np.load(point_cloud_path) 42 | verts = torch.Tensor(point_cloud["verts"][::50]).to(device).unsqueeze(0) 43 | rgb = torch.Tensor(point_cloud["rgb"][::50]).to(device).unsqueeze(0) 44 | point_cloud = pytorch3d.structures.Pointclouds(points=verts, features=rgb) 45 | R, T = pytorch3d.renderer.look_at_view_transform(4, 10, 0) 46 | cameras = pytorch3d.renderer.FoVPerspectiveCameras(R=R, T=T, device=device) 47 | rend = renderer(point_cloud, cameras=cameras) 48 | rend = rend.cpu().numpy()[0, ..., :3] # (B, H, W, 4) -> (H, W, 3) 49 | return rend 50 | 51 | 52 | def render_sphere(image_size=256, num_samples=200, device=None): 53 | """ 54 | Renders a sphere using parametric sampling. Samples num_samples ** 2 points. 55 | """ 56 | 57 | if device is None: 58 | device = get_device() 59 | 60 | phi = torch.linspace(0, 2 * np.pi, num_samples) 61 | theta = torch.linspace(0, np.pi, num_samples) 62 | # Densely sample phi and theta on a grid 63 | Phi, Theta = torch.meshgrid(phi, theta) 64 | 65 | x = torch.sin(Theta) * torch.cos(Phi) 66 | y = torch.cos(Theta) 67 | z = torch.sin(Theta) * torch.sin(Phi) 68 | 69 | points = torch.stack((x.flatten(), y.flatten(), z.flatten()), dim=1) 70 | color = (points - points.min()) / (points.max() - points.min()) 71 | 72 | sphere_point_cloud = pytorch3d.structures.Pointclouds( 73 | points=[points], features=[color], 74 | ).to(device) 75 | 76 | cameras = pytorch3d.renderer.FoVPerspectiveCameras(T=[[0, 0, 3]], device=device) 77 | renderer = get_points_renderer(image_size=image_size, device=device) 78 | rend = renderer(sphere_point_cloud, cameras=cameras) 79 | return rend[0, ..., :3].cpu().numpy() 80 | 81 | 82 | def render_sphere_mesh(image_size=256, voxel_size=64, device=None): 83 | if device is None: 84 | device = get_device() 85 | min_value = -1.1 86 | max_value = 1.1 87 | X, Y, Z = torch.meshgrid([torch.linspace(min_value, max_value, voxel_size)] * 3) 88 | voxels = X ** 2 + Y ** 2 + Z ** 2 - 1 89 | vertices, faces = mcubes.marching_cubes(mcubes.smooth(voxels), isovalue=0) 90 | vertices = torch.tensor(vertices).float() 91 | faces = torch.tensor(faces.astype(int)) 92 | # Vertex coordinates are indexed by array position, so we need to 93 | # renormalize the coordinate system. 94 | vertices = (vertices / voxel_size) * (max_value - min_value) + min_value 95 | textures = (vertices - vertices.min()) / (vertices.max() - vertices.min()) 96 | textures = pytorch3d.renderer.TexturesVertex(vertices.unsqueeze(0)) 97 | 98 | mesh = pytorch3d.structures.Meshes([vertices], [faces], textures=textures).to( 99 | device 100 | ) 101 | lights = pytorch3d.renderer.PointLights(location=[[0, 0.0, -4.0]], device=device,) 102 | renderer = get_mesh_renderer(image_size=image_size, device=device) 103 | R, T = pytorch3d.renderer.look_at_view_transform(dist=3, elev=0, azim=180) 104 | cameras = pytorch3d.renderer.FoVPerspectiveCameras(R=R, T=T, device=device) 105 | rend = renderer(mesh, cameras=cameras, lights=lights) 106 | return rend[0, ..., :3].detach().cpu().numpy().clip(0, 1) 107 | 108 | 109 | if __name__ == "__main__": 110 | parser = argparse.ArgumentParser() 111 | parser.add_argument( 112 | "--render", 113 | type=str, 114 | default="point_cloud", 115 | choices=["point_cloud", "parametric", "implicit"], 116 | ) 117 | parser.add_argument("--output_path", type=str, default="images/bridge.jpg") 118 | parser.add_argument("--image_size", type=int, default=256) 119 | parser.add_argument("--num_samples", type=int, default=100) 120 | args = parser.parse_args() 121 | if args.render == "point_cloud": 122 | image = render_bridge(image_size=args.image_size) 123 | elif args.render == "parametric": 124 | image = render_sphere(image_size=args.image_size, num_samples=args.num_samples) 125 | elif args.render == "implicit": 126 | image = render_sphere_mesh(image_size=args.image_size) 127 | else: 128 | raise Exception("Did not understand {}".format(args.render)) 129 | plt.imsave(args.output_path, image) 130 | 131 | -------------------------------------------------------------------------------- /starter/render_mesh.py: -------------------------------------------------------------------------------- 1 | """ 2 | Sample code to render a cow. 3 | 4 | Usage: 5 | python -m starter.render_mesh --image_size 256 --output_path images/cow_render.jpg 6 | """ 7 | import argparse 8 | 9 | import matplotlib.pyplot as plt 10 | import pytorch3d 11 | import torch 12 | 13 | from starter.utils import get_device, get_mesh_renderer, load_cow_mesh 14 | 15 | 16 | def render_cow( 17 | cow_path="data/cow.obj", image_size=256, color=[0.7, 0.7, 1], device=None, 18 | ): 19 | # The device tells us whether we are rendering with GPU or CPU. The rendering will 20 | # be *much* faster if you have a CUDA-enabled NVIDIA GPU. However, your code will 21 | # still run fine on a CPU. 22 | # The default is to run on CPU, so if you do not have a GPU, you do not need to 23 | # worry about specifying the device in all of these functions. 24 | if device is None: 25 | device = get_device() 26 | 27 | # Get the renderer. 28 | renderer = get_mesh_renderer(image_size=image_size) 29 | 30 | # Get the vertices, faces, and textures. 31 | vertices, faces = load_cow_mesh(cow_path) 32 | vertices = vertices.unsqueeze(0) # (N_v, 3) -> (1, N_v, 3) 33 | faces = faces.unsqueeze(0) # (N_f, 3) -> (1, N_f, 3) 34 | textures = torch.ones_like(vertices) # (1, N_v, 3) 35 | textures = textures * torch.tensor(color) # (1, N_v, 3) 36 | mesh = pytorch3d.structures.Meshes( 37 | verts=vertices, 38 | faces=faces, 39 | textures=pytorch3d.renderer.TexturesVertex(textures), 40 | ) 41 | mesh = mesh.to(device) 42 | 43 | # Prepare the camera: 44 | cameras = pytorch3d.renderer.FoVPerspectiveCameras( 45 | R=torch.eye(3).unsqueeze(0), T=torch.tensor([[0, 0, 3]]), fov=60, device=device 46 | ) 47 | 48 | # Place a point light in front of the cow. 49 | lights = pytorch3d.renderer.PointLights(location=[[0, 0, -3]], device=device) 50 | 51 | rend = renderer(mesh, cameras=cameras, lights=lights) 52 | rend = rend.cpu().numpy()[0, ..., :3] # (B, H, W, 4) -> (H, W, 3) 53 | # The .cpu moves the tensor to GPU (if needed). 54 | return rend 55 | 56 | 57 | if __name__ == "__main__": 58 | parser = argparse.ArgumentParser() 59 | parser.add_argument("--cow_path", type=str, default="data/cow.obj") 60 | parser.add_argument("--output_path", type=str, default="images/cow_render.jpg") 61 | parser.add_argument("--image_size", type=int, default=256) 62 | args = parser.parse_args() 63 | image = render_cow(cow_path=args.cow_path, image_size=args.image_size) 64 | plt.imsave(args.output_path, image) 65 | -------------------------------------------------------------------------------- /starter/utils.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from pytorch3d.renderer import ( 3 | AlphaCompositor, 4 | RasterizationSettings, 5 | MeshRenderer, 6 | MeshRasterizer, 7 | PointsRasterizationSettings, 8 | PointsRenderer, 9 | PointsRasterizer, 10 | HardPhongShader, 11 | ) 12 | from pytorch3d.io import load_obj 13 | 14 | 15 | def get_device(): 16 | """ 17 | Checks if GPU is available and returns device accordingly. 18 | """ 19 | if torch.cuda.is_available(): 20 | device = torch.device("cuda:0") 21 | else: 22 | device = torch.device("cpu") 23 | return device 24 | 25 | 26 | def get_points_renderer( 27 | image_size=512, device=None, radius=0.01, background_color=(1, 1, 1) 28 | ): 29 | """ 30 | Returns a Pytorch3D renderer for point clouds. 31 | 32 | Args: 33 | image_size (int): The rendered image size. 34 | device (torch.device): The torch device to use (CPU or GPU). If not specified, 35 | will automatically use GPU if available, otherwise CPU. 36 | radius (float): The radius of the rendered point in NDC. 37 | background_color (tuple): The background color of the rendered image. 38 | 39 | Returns: 40 | PointsRenderer. 41 | """ 42 | if device is None: 43 | if torch.cuda.is_available(): 44 | device = torch.device("cuda:0") 45 | else: 46 | device = torch.device("cpu") 47 | raster_settings = PointsRasterizationSettings(image_size=image_size, radius=radius,) 48 | renderer = PointsRenderer( 49 | rasterizer=PointsRasterizer(raster_settings=raster_settings), 50 | compositor=AlphaCompositor(background_color=background_color), 51 | ) 52 | return renderer 53 | 54 | 55 | def get_mesh_renderer(image_size=512, lights=None, device=None): 56 | """ 57 | Returns a Pytorch3D Mesh Renderer. 58 | 59 | Args: 60 | image_size (int): The rendered image size. 61 | lights: A default Pytorch3D lights object. 62 | device (torch.device): The torch device to use (CPU or GPU). If not specified, 63 | will automatically use GPU if available, otherwise CPU. 64 | """ 65 | if device is None: 66 | if torch.cuda.is_available(): 67 | device = torch.device("cuda:0") 68 | else: 69 | device = torch.device("cpu") 70 | raster_settings = RasterizationSettings( 71 | image_size=image_size, blur_radius=0.0, faces_per_pixel=1, 72 | ) 73 | renderer = MeshRenderer( 74 | rasterizer=MeshRasterizer(raster_settings=raster_settings), 75 | shader=HardPhongShader(device=device, lights=lights), 76 | ) 77 | return renderer 78 | 79 | 80 | def unproject_depth_image(image, mask, depth, camera): 81 | """ 82 | Unprojects a depth image into a 3D point cloud. 83 | 84 | Args: 85 | image (torch.Tensor): A square image to unproject (S, S, 3). 86 | mask (torch.Tensor): A binary mask for the image (S, S). 87 | depth (torch.Tensor): The depth map of the image (S, S). 88 | camera: The Pytorch3D camera to render the image. 89 | 90 | Returns: 91 | points (torch.Tensor): The 3D points of the unprojected image (N, 3). 92 | rgba (torch.Tensor): The rgba color values corresponding to the unprojected 93 | points (N, 4). 94 | """ 95 | device = camera.device 96 | assert image.shape[0] == image.shape[1], "Image must be square." 97 | image_shape = image.shape[0] 98 | ndc_pixel_coordinates = torch.linspace(1, -1, image_shape) 99 | Y, X = torch.meshgrid(ndc_pixel_coordinates, ndc_pixel_coordinates) 100 | xy_depth = torch.dstack([X, Y, depth]) 101 | points = camera.unproject_points( 102 | xy_depth.to(device), in_ndc=False, from_ndc=False, world_coordinates=True, 103 | ) 104 | points = points[mask > 0.5] 105 | rgb = image[mask > 0.5] 106 | rgb = rgb.to(device) 107 | 108 | # For some reason, the Pytorch3D compositor does not apply a background color 109 | # unless the pointcloud is RGBA. 110 | alpha = torch.ones_like(rgb)[..., :1] 111 | rgb = torch.cat([rgb, alpha], dim=1) 112 | 113 | return points, rgb 114 | 115 | 116 | def load_cow_mesh(path="data/cow_mesh.obj"): 117 | """ 118 | Loads vertices and faces from an obj file. 119 | 120 | Returns: 121 | vertices (torch.Tensor): The vertices of the mesh (N_v, 3). 122 | faces (torch.Tensor): The faces of the mesh (N_f, 3). 123 | """ 124 | vertices, faces, _ = load_obj(path) 125 | faces = faces.verts_idx 126 | return vertices, faces 127 | --------------------------------------------------------------------------------