├── .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 | 
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 | 
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 | 
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 | 
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 | 
232 | 
233 | 
234 | 
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 | 
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 | 
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 | 
325 | 
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 | 
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 |
--------------------------------------------------------------------------------