├── .gitignore
├── DATASET
└── Suzanne
│ ├── annotations
│ └── instances_default.json
│ ├── config.py
│ └── images
│ ├── 000000.jpg
│ ├── 000001.jpg
│ ├── 000002.jpg
│ ├── 000003.jpg
│ └── 000004.jpg
├── LICENSE
├── README.md
├── bg
├── pexels-pixabay-221047.jpg
├── pexels-pixabay-236709.jpg
└── pexels-pixabay-256297.jpg
├── config.py
├── distractor_textures
└── brick_floor_003_diffuse_1k.jpg
├── distractors
└── Cube
│ ├── Cube.mtl
│ └── Cube.obj
├── environment
└── machine_shop_01_2k.hdr
├── main.py
├── models
├── Suzanne.mtl
└── Suzanne.obj
├── object_textures
└── bark_brown_02_diff_1k.jpg
├── references
├── CVAT_import.jpg
├── UV_mapping.png
├── blender_render.gif
├── blender_scene.png
└── example.png
├── requirements.txt
├── show_annotations.py
├── texture_color_converter.py
└── util.py
/.gitignore:
--------------------------------------------------------------------------------
1 | **/coco/*
2 | **/images/*
3 | **/labels/*
4 |
--------------------------------------------------------------------------------
/DATASET/Suzanne/annotations/instances_default.json:
--------------------------------------------------------------------------------
1 | {
2 | "info": {
3 | "year": 2023,
4 | "version": "1.0",
5 | "description": "Synthetic Dataset created with Blender Python script",
6 | "contributor": "IGNC",
7 | "url": "https://www.ignc.tu-berlin.de",
8 | "date_created": "2023-07-24 08:28:37.776165",
9 | "camera matrix K": {
10 | "fx": -420.82135009765625,
11 | "cx": 320.0,
12 | "fy": -420.82135009765625,
13 | "cy": 180.0
14 | }
15 | },
16 | "images": [
17 | {
18 | "id": 0,
19 | "file_name": "000000.jpg",
20 | "height": 360,
21 | "width": 640
22 | },
23 | {
24 | "id": 1,
25 | "file_name": "000001.jpg",
26 | "height": 360,
27 | "width": 640
28 | },
29 | {
30 | "id": 2,
31 | "file_name": "000002.jpg",
32 | "height": 360,
33 | "width": 640
34 | },
35 | {
36 | "id": 3,
37 | "file_name": "000003.jpg",
38 | "height": 360,
39 | "width": 640
40 | },
41 | {
42 | "id": 4,
43 | "file_name": "000004.jpg",
44 | "height": 360,
45 | "width": 640
46 | }
47 | ],
48 | "annotations": [
49 | {
50 | "id": 0,
51 | "image_id": 0,
52 | "bbox": [
53 | 293.0347442626953,
54 | 137.7012848854065,
55 | 92.30541229248047,
56 | 91.91853046417236
57 | ],
58 | "category_id": 1,
59 | "segmentation": [],
60 | "iscrowd": 0,
61 | "area": 8484.577851814356,
62 | "keypoints": [
63 | [
64 | 338.38111877441406,
65 | 187.33839511871338,
66 | 2
67 | ],
68 | [
69 | 266.7498588562012,
70 | 159.97803926467896,
71 | 2
72 | ],
73 | [
74 | 325.247802734375,
75 | 175.38153648376465,
76 | 2
77 | ],
78 | [
79 | 309.5549201965332,
80 | 126.12356185913086,
81 | 2
82 | ],
83 | [
84 | 374.71439361572266,
85 | 132.54395484924316,
86 | 2
87 | ],
88 | [
89 | 310.40035247802734,
90 | 229.53632354736328,
91 | 2
92 | ],
93 | [
94 | 372.0281982421875,
95 | 258.79076957702637,
96 | 2
97 | ],
98 | [
99 | 347.46471405029297,
100 | 195.60828924179077,
101 | 2
102 | ],
103 | [
104 | 413.64917755126953,
105 | 216.0878562927246,
106 | 2
107 | ]
108 | ],
109 | "num_keypoints": 9
110 | },
111 | {
112 | "id": 1,
113 | "image_id": 1,
114 | "bbox": [
115 | 280.10717391967773,
116 | 198.74407052993774,
117 | 99.58414077758789,
118 | 121.49919748306274
119 | ],
120 | "category_id": 1,
121 | "segmentation": [],
122 | "iscrowd": 0,
123 | "area": 12099.393186517273,
124 | "keypoints": [
125 | [
126 | 328.0698776245117,
127 | 257.8946113586426,
128 | 2
129 | ],
130 | [
131 | 275.4095268249512,
132 | 214.77275848388672,
133 | 2
134 | ],
135 | [
136 | 321.17687225341797,
137 | 172.23180770874023,
138 | 2
139 | ],
140 | [
141 | 333.7149429321289,
142 | 223.6509132385254,
143 | 2
144 | ],
145 | [
146 | 392.02014923095703,
147 | 186.3644528388977,
148 | 2
149 | ],
150 | [
151 | 268.90798568725586,
152 | 324.0688920021057,
153 | 2
154 | ],
155 | [
156 | 319.26353454589844,
157 | 311.3155674934387,
158 | 2
159 | ],
160 | [
161 | 333.6661148071289,
162 | 327.44117975234985,
163 | 2
164 | ],
165 | [
166 | 399.8749542236328,
167 | 316.69341802597046,
168 | 2
169 | ]
170 | ],
171 | "num_keypoints": 9
172 | },
173 | {
174 | "id": 2,
175 | "image_id": 2,
176 | "bbox": [
177 | 157.1732997894287,
178 | 0.8004140853881836,
179 | 137.7955150604248,
180 | 132.402184009552
181 | ],
182 | "category_id": 1,
183 | "segmentation": [],
184 | "iscrowd": 0,
185 | "area": 18244.42714072136,
186 | "keypoints": [
187 | [
188 | 229.94266510009766,
189 | 69.58678007125854,
190 | 2
191 | ],
192 | [
193 | 186.08640670776367,
194 | 122.12494611740112,
195 | 2
196 | ],
197 | [
198 | 229.18004989624023,
199 | 180.0027894973755,
200 | 2
201 | ],
202 | [
203 | 127.65830039978027,
204 | 63.9898681640625,
205 | 2
206 | ],
207 | [
208 | 157.4990463256836,
209 | 111.4049506187439,
210 | 2
211 | ],
212 | [
213 | 275.8567810058594,
214 | 43.082778453826904,
215 | 2
216 | ],
217 | [
218 | 344.30233001708984,
219 | 75.84443807601929,
220 | 2
221 | ],
222 | [
223 | 230.5880355834961,
224 | -23.85385036468506,
225 | 1
226 | ],
227 | [
228 | 295.264892578125,
229 | -8.666839599609375,
230 | 1
231 | ]
232 | ],
233 | "num_keypoints": 9
234 | },
235 | {
236 | "id": 3,
237 | "image_id": 3,
238 | "bbox": [
239 | 131.47356986999512,
240 | 52.907280921936035,
241 | 157.73505210876465,
242 | 165.59864044189453
243 | ],
244 | "category_id": 1,
245 | "segmentation": [],
246 | "iscrowd": 0,
247 | "area": 26120.710179242815,
248 | "keypoints": [
249 | [
250 | 206.03565216064453,
251 | 159.5825958251953,
252 | 2
253 | ],
254 | [
255 | 122.06843376159668,
256 | 143.34055423736572,
257 | 2
258 | ],
259 | [
260 | 83.13407897949219,
261 | 44.66283559799194,
262 | 2
263 | ],
264 | [
265 | 209.66938018798828,
266 | 107.79253005981445,
267 | 2
268 | ],
269 | [
270 | 218.92555236816406,
271 | 3.604888916015625,
272 | 2
273 | ],
274 | [
275 | 196.21532440185547,
276 | 278.41582775115967,
277 | 2
278 | ],
279 | [
280 | 199.38377380371094,
281 | 254.38924312591553,
282 | 2
283 | ],
284 | [
285 | 281.1590385437012,
286 | 229.82711791992188,
287 | 2
288 | ],
289 | [
290 | 328.7124252319336,
291 | 183.3123779296875,
292 | 2
293 | ]
294 | ],
295 | "num_keypoints": 9
296 | },
297 | {
298 | "id": 4,
299 | "image_id": 4,
300 | "bbox": [
301 | 324.1050720214844,
302 | 87.31083869934082,
303 | 116.56414031982422,
304 | 110.85385322570801
305 | ],
306 | "category_id": 1,
307 | "segmentation": [],
308 | "iscrowd": 0,
309 | "area": 12921.584102394627,
310 | "keypoints": [
311 | [
312 | 375.0967025756836,
313 | 136.75459384918213,
314 | 2
315 | ],
316 | [
317 | 402.68077850341797,
318 | 48.11142683029175,
319 | 2
320 | ],
321 | [
322 | 393.7749481201172,
323 | 97.1146559715271,
324 | 2
325 | ],
326 | [
327 | 447.94830322265625,
328 | 101.60259246826172,
329 | 2
330 | ],
331 | [
332 | 453.66809844970703,
333 | 164.38402891159058,
334 | 2
335 | ],
336 | [
337 | 320.3710174560547,
338 | 117.51047372817993,
339 | 2
340 | ],
341 | [
342 | 290.1083564758301,
343 | 177.76278018951416,
344 | 2
345 | ],
346 | [
347 | 363.3353042602539,
348 | 161.71523094177246,
349 | 2
350 | ],
351 | [
352 | 345.89115142822266,
353 | 230.60856342315674,
354 | 2
355 | ]
356 | ],
357 | "num_keypoints": 9
358 | }
359 | ],
360 | "categories": [
361 | {
362 | "supercategory": "",
363 | "id": 1,
364 | "name": "Suzanne",
365 | "skeleton": [],
366 | "keypoints": []
367 | }
368 | ],
369 | "licenses": ""
370 | }
--------------------------------------------------------------------------------
/DATASET/Suzanne/config.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | """
4 | Created on Thu Jul 23 18:35:21 2020
5 |
6 | @author: leon
7 | """
8 |
9 | #from easydict import EasyDict
10 | from math import pi
11 |
12 | #self = EasyDict()
13 |
14 |
15 | class cfg:
16 | def __init__(self):
17 | self.seed = 1 # random seed for image generation. use None or an integer
18 | self.test = False
19 |
20 | # PATHS
21 | self.out_folder = 'Suzanne' # render images will be saved to DATASET/out_folder
22 | #self.bg_paths = ['./bg/real', './bg/coco/train2017', './bg/coco/train2017']
23 | self.bg_paths = ['./bg']
24 | self.environment_paths = ['./environment']
25 | # self.model_paths = ['./models/H8000.obj', './models/4000F_2.obj'] #3dbox0922marker_new.ply' # list of filepath to objects
26 | # self.model_paths = ['./models/3dbox0922marker_new.ply'] # filepath to object
27 | self.model_paths = ['./models/Suzanne.obj']
28 | self.compute_bbox = 'tight' # choose 'tight' or 'fast' (tight uses all vertices to compute a tight bbox but it is slower)
29 | #self.distractor_paths = ['./distractors/048_hammer', './distractors/035_power_drill', './distractors/037_scissors',
30 | # './distractors/043_phillips_screwdriver', './distractors/025_mug', './distractors/036_wood_block', './distractors/044_flat_screwdriver']
31 | self.distractor_paths = ['./distractors/Cube', './distractors/Cube', './distractors/Cube']
32 | self.max_distractor_objects = 3
33 |
34 | self.object_texture_path = './object_textures' #'./environment'# './textures_realistic' #'./textures'
35 | self.distractor_texture_path = './distractor_textures'#'./bg/coco/train2017'
36 |
37 | #self.NumberOfObjects = 1
38 | self.use_fps_keypoints = False # experimental feature for 6d pose estimation
39 |
40 |
41 | # DEPTH OUTPUT (not tested)
42 | self.output_depth = False
43 | self.depth_color_depth = '16'
44 |
45 | # AUGMENTATION
46 | self.use_bg_image = True # use Background Images
47 | self.use_environment_maps = True # use 360° HDRI Panoramas
48 | self.emission_min = 1 # only for environment maps
49 | self.emission_max = 8 # only for environment maps
50 | self.light_number_min = 1 # only for background images
51 | self.light_number_max = 3 # only for background images
52 | self.light_energymin = 20 # only for background images
53 | self.light_energymax = 80 # only for background images
54 | self.random_hsv_value = False # randomize the value of HSV color space of the object with p=0.5
55 | self.random_metallic_value = False # randomize the metallic object value with p=0.5
56 | self.random_roughness_value = False # randomize the roughness object value with p=0.5
57 | # self.random_projector_colors = False # random projector augmentation with p=0.5 (point light with random color)
58 |
59 | self.random_color = "None" # choose "None", "temperature", "projector"
60 |
61 | # OBJECT COLOR (for PLY Files)
62 | self.model_scale = 1 # model scale for PLY objects
63 | self.hsv_hue = 0.5 # changes hue of Hue Saturation Value Node, default 0.5
64 | self.hsv_saturation = 1 # changes saturation of Hue Saturation Value Node, default 1
65 | self.hsv_value = 1 # 0.35 # changes value of Hue Saturation Value Node, default 1
66 | # self.roughness = 0.3#0.1 # Object Material Roughness (0=Mirror, 1=No Reflections)
67 |
68 | # camera sphere coordinates
69 | self.cam_rmin = 0.3 # minimum camera distance
70 | self.cam_rmax = 1.1 # maximum camera distance
71 | self.cam_incmin = 0
72 | self.cam_incmax = pi/2 # pi*2/3
73 | self.cam_azimin = 0
74 | self.cam_azimax = 2*pi
75 |
76 |
77 | # OBJECT POSITION
78 | self.obj_location_xmin = -0.2 # translation in meters
79 | self.obj_location_xmax = 0.2
80 | self.obj_location_ymin = -0.2
81 | self.obj_location_ymax = 0.2
82 | self.obj_location_zmin = -0.2
83 | self.obj_location_zmax = 0.2
84 | self.cam_rotation_min = 0
85 | self.cam_rotation_max = 2*pi
86 |
87 |
88 |
89 | self.max_boundingbox = 0.1 # filter out objects with bbox < -x or > 1+x (a value of 0.1 means max. 10% occlusion)
90 |
91 | # Camera
92 | self.cam_lens_unit = 'FOV' # Choose 'FOV' or 'MILLIMETERS'
93 | self.cam_lens = 4.7 # Camera lens value in mm
94 | self.cam_fov = (59+90)/2 # camera field of view in degrees
95 | self.cam_sensor_height = 3.84 # mm
96 | self.cam_sensor_width = 5.11 # mm
97 |
98 | self.clip_end = 50
99 | self.clip_start = 0.01
100 |
101 | # RENDERING CONFIG
102 | self.use_GPU = True
103 | self.use_cycles = True # cycles or eevee
104 | self.use_cycles_denoising = False
105 | self.use_adaptive_sampling = True
106 | self.resolution_x = 640 # pixel resolution
107 | self.resolution_y = 360
108 | self.samples = 512 # render engine samples
109 |
110 | # OUTPUT
111 | self.numberOfRenders = 5 # how many rendered examples
112 |
113 | # temporary variables (dont change anything here)
114 | self.metallic = []
115 | self.roughness = []
116 |
--------------------------------------------------------------------------------
/DATASET/Suzanne/images/000000.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/DATASET/Suzanne/images/000000.jpg
--------------------------------------------------------------------------------
/DATASET/Suzanne/images/000001.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/DATASET/Suzanne/images/000001.jpg
--------------------------------------------------------------------------------
/DATASET/Suzanne/images/000002.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/DATASET/Suzanne/images/000002.jpg
--------------------------------------------------------------------------------
/DATASET/Suzanne/images/000003.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/DATASET/Suzanne/images/000003.jpg
--------------------------------------------------------------------------------
/DATASET/Suzanne/images/000004.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/DATASET/Suzanne/images/000004.jpg
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 ignc-research
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Generating Images with Physics-Based Rendering for an Industrial Object Detection Task
2 | This repo uses 3D-CAD models to generate synthetic training images for industrial deep-learning-based object detection tasks using Blenders ray-trace based render engine Cycles.
3 | We generate different images by randomizing object and camera poses, lighting, background images, object texture and additional foreground objects. Additionally, we generate a JSON-file containing object detection annotations (bounding boxes) in the [COCO format](https://cocodataset.org/#format-data).
4 |
5 | If you use this code, please cite our work:
6 |
7 | > Eversberg, L.; Lambrecht, J. Generating Images with Physics-Based Rendering for an Industrial Object Detection Task: Realism versus Domain Randomization. Sensors 2021, 21, 7901. https://doi.org/10.3390/s21237901
8 |
9 | or
10 |
11 | > Eversberg, L.; Lambrecht, J. Combining Synthetic Images and Deep Active Learning: Data-Efficient Training of an Industrial Object Detection Model. J. Imaging 2024, 10, 16. https://doi.org/10.3390/jimaging10010016
12 |
13 | 
14 |
15 | ## Installation
16 | Download and unpack Blender in a folder /path/to/blender/blender-2.xx.x-linux64/ from [blender.org](https://download.blender.org/release/).
17 | I recommend using Blender 2.93.18, but Blender 3.3.16 also seems to work.
18 | To bind the 'blender' command to the blender application execute the following command in the terminal:
19 | ```
20 | sudo ln -s /full/path/to/blender/blender-2.93.18-linux64/blender /usr/local/bin/blender
21 | ```
22 |
23 | ### Getting Started
24 | If you want to use the default settings that were used in the paper, you can only change the following parameters:
25 | 1. Place your 3D model (with UV map) as an *.OBJ file with the material *.mtl file in the ./models folder. Blender can be used to convert to obj-format, create a UV map and create a mtl file. Make sure the model_paths parameter in the config file points to your object file.
26 | 1. Place random background images in the ./bg folder.
27 | 1. Place random HDRI environment images in the ./environment folder.
28 | 1. Place random texture images in the ./distractor_textures and ./object_textures folders.
29 | 1. Set the test parameter in the config.py file to True, render one image and inspect the Blender scene.
30 | 1. Change the camera parameters cam_* as needed in the config.py file.
31 | 1. Set the test parameter to False and set number_of_renders to the desired number of images. Start the rendering process.
32 |
33 | ### Files
34 | If you want to use random COCO background images, download e.g. the [COCO dataset](http://images.cocodataset.org/zips/train2017.zip) and unzip the images into the folder ./bg/coco
35 |
36 | If you want to use HDRI 360° environment maps, download them (e.g. from [polyhaven.com](https://polyhaven.com/hdris)) and put them in the ./environment folder
37 |
38 | If you want to use random textures (e.g. from [polyhaven.com](https://polyhaven.com/textures) or [ambientcg.com](https://ambientcg.com/list?category=&date=&createdUsing=&basedOn=&q=&method=&type=Material&sort=Popular)), put the images in the ./distractor_textures and ./object_textures folders
39 |
40 |
41 | ### UV Maps
42 | The 3D models need to have UV maps so that Blender can change the texture. You can create UV maps in blender by going to UV editing --> select your object --> UV --> Smart UV Project or Unwrap
43 | [
](./references/UV_mapping.png)
44 |
45 |
46 | ## Usage
47 |
48 | ### Render images
49 | execute the following command in the terminal:
50 | ```
51 | blender --background --python main.py
52 | ```
53 | [
](./references/blender_render.gif)
54 |
55 | ### Show annotations (bounding box)
56 | After rendering images, execute the following command in the terminal:
57 | ```
58 | python show_annotations.py
59 | ```
60 |
61 | Annotations and images can be imported in [CVAT](https://github.com/opencv/cvat) using the COCO 1.0 format.
62 | [
](./references/CVAT_import.jpg)
63 |
64 |
65 | ### Render image and open blender scene
66 | To check the Blender scene setup, especially to configure the relationship between camera and object it is helpful to open the Blender scene after rendering.
67 | 1. set the test flag in the config.py file to True
68 | 1. start blender with the command line:
69 | ```
70 | blender --python main.py
71 | ```
72 |
73 | [
](./references/blender_scene.png)
74 |
75 | ## config.py
76 | This python file contains a simple configuration class to configure the Blender generation script. The following parameters can be adapted to your specific application.
77 |
78 | Parameter | Description
79 | --------- | -----------
80 | seed | Initialize the random number generator. Set to an integer or None.
81 | test | Boolean test flag. If you set this to True, Blender will only render one image and not delete light data and background image data. Use this together with blender _--python main.py_ to see the Blender scene setup.
82 | out_folder | Output folder. Rendered images will be saved to DATASET/out_folder
83 | bg_paths | List of paths to background images. Use multiple paths to mix different datasets in different ratios.
84 | environment_paths | List of paths to environment images (360° HDRIs). Use multiple paths to mix different datasets in different ratios.
85 | model_paths | List of paths to 3D CAD models.
86 | compute_bbox | Choose _'tight'_ or _'fast'_. _Tight_ uses all vertices to compute a tight bbox but it is slower. _Fast_ uses only the 3D Bounding Box corners.
87 | distractor_paths | List of paths to distracting foreground objects
88 | max_distractor_objects | Integer. Maximum number of distracting foreground objects
89 | distractor_texture_path | String pointing to the textures folder for distracting foreground objects
90 | object_texture_path | String pointing to the textures folder for the 3D model that we want to detect
91 | use_bg_image | Boolean. Use background images (and not HDRI images) from the bg_paths folder
92 | use_environment_maps | Boolean. Use 360° HDRI images from the environment_paths folder. If use_bg_image is also True, only the HDRI lighting will be used.
93 | emission_min | HDRI minimum emission strength
94 | emission_max | HDRI maximum emission strength
95 | light_number_min | Minimum number of Point Lights
96 | light_number_max | Maximum number of Point Lights
97 | light_energymin | Minimum Energy of Point Lights [W]
98 | light_energymax | Maximum Energy of Point Lights [W]
99 | random_color | Choose either "None" or "temperature" for Point Lights. _None_ uses only white light, where _temperature_ will use the temperature colors from _util.py_
100 | cam_rmin | minimum camera radial distance in spherical coordinate system
101 | cam_rmax | maximum camera radial distance in spherical coordinate system
102 | cam_incmin | minimum camera inclination in spherical coordinate system
103 | cam_incmax | maximum camera inclination in spherical coordinate system
104 | cam_azimin | minimum camera azimuth in spherical coordinate system
105 | cam_azimax | maximum camera azimuth in spherical coordinate system
106 | obj_location_xmin | minimum object (3D CAD model) offset in the x-axis in cartesian coordinate system
107 | obj_location_xmax | maximum object (3D CAD model) offset in the x-axis in cartesian coordinate system
108 | obj_location_ymin | minimum object (3D CAD model) offset in the y-axis in cartesian coordinate system
109 | obj_location_ymax | maximum object (3D CAD model) offset in the y-axis in cartesian coordinate system
110 | obj_location_zmin | minimum object (3D CAD model) offset in the z-axis in cartesian coordinate system
111 | obj_location_zmax | maximum object (3D CAD model) offset in the z-axis in cartesian coordinate system
112 | cam_rotation_min | minimum XYZ euler rotation angle of the constrained camera in radians
113 | cam_rotation_max | maximum XYZ euler rotation angle of the constrained camera in radians
114 | max_boundingbox | filters out blender scenes where the bbox of the 3D CAD Model is outside of the image to a certain threshold. A value of 0.1 means max. 10% occlusion
115 | cam_lens_unit | Choose either 'FOV' or 'MILLIMETERS' (https://docs.blender.org/api/current/bpy.types.Camera.html#bpy.types.Camera.lens_unit)
116 | cam_lens | Camera lens value in mm. This is used when 'MILLIMETERS' is the lens unit. https://docs.blender.org/manual/en/latest/render/cameras.html
117 | cam_fov | Camera field of view in degrees. This is used when 'FOV' is the lens unit. https://docs.blender.org/manual/en/latest/render/cameras.html
118 | cam_sensor_height | Vertical size of the image sensor area in millimeters (https://docs.blender.org/api/current/bpy.types.Camera.html)
119 | cam_sensor_width | Horizontal size of the image sensor area in millimeters (https://docs.blender.org/api/current/bpy.types.Camera.html)
120 | clip_end | Camera far clipping distance (https://docs.blender.org/api/current/bpy.types.Camera.html)
121 | clip_start | Camera near clipping distance (https://docs.blender.org/api/current/bpy.types.Camera.html)
122 | use_GPU | Boolean. If True, the GPU will be used for rendering
123 | use_cycles | Boolean. If True, cycles will be used as rendering engine. If False, Eevee will be used
124 | use_cycles_denoising | Boolean. If True, the rendered images are denoised afterwards (https://docs.blender.org/manual/en/latest/render/cycles/render_settings/sampling.html#denoising)
125 | use_adaptive_sampling | Boolean. If True, adaptive sampling is used (https://docs.blender.org/manual/en/latest/render/cycles/render_settings/sampling.html#adaptive-sampling)
126 | resolution_x | Pixel resolution of the output image (width)
127 | resolution_y | Pixel resolution of the output image (height)
128 | samples | Render engine number of samples (sets cycles.samples)
129 | number_of_renders | Number of rendered images
130 |
131 | ## Using blender-gen with PyTorch
132 | A jupyter notebook showing how to use blender-gen to train an object detection model in PyTorch can be found at https://github.com/leoneversberg/object-detection-pytorch
133 |
--------------------------------------------------------------------------------
/bg/pexels-pixabay-221047.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/bg/pexels-pixabay-221047.jpg
--------------------------------------------------------------------------------
/bg/pexels-pixabay-236709.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/bg/pexels-pixabay-236709.jpg
--------------------------------------------------------------------------------
/bg/pexels-pixabay-256297.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/bg/pexels-pixabay-256297.jpg
--------------------------------------------------------------------------------
/config.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | from math import pi
5 |
6 | class cfg:
7 | def __init__(self):
8 | self.seed = 1 # random seed for image generation. use None or an integer
9 | self.test = False
10 |
11 | # PATHS
12 | self.out_folder = 'Suzanne' # render images will be saved to DATASET/out_folder
13 | self.bg_paths = ['./bg']
14 | self.environment_paths = ['./environment']
15 | self.model_paths = ['./models/Suzanne.obj']
16 | self.compute_bbox = 'tight' # choose 'tight' or 'fast' (tight uses all vertices to compute a tight bbox but it is slower)
17 | self.distractor_paths = ['./distractors/Cube', './distractors/Cube', './distractors/Cube']
18 | self.max_distractor_objects = 3
19 |
20 | self.object_texture_path = './object_textures'
21 | self.distractor_texture_path = './distractor_textures'
22 |
23 | # DEPTH OUTPUT (not tested)
24 | self.output_depth = False
25 | self.depth_color_depth = '16'
26 |
27 | # AUGMENTATION
28 | self.use_bg_image = True # use Background Images
29 | self.use_environment_maps = True # use 360° HDRI Panoramas
30 | self.emission_min = 1 # only for environment maps
31 | self.emission_max = 5 # only for environment maps
32 | self.light_number_min = 1 # only for background images
33 | self.light_number_max = 3 # only for background images
34 | self.light_energymin = 20 # only for background images
35 | self.light_energymax = 80 # only for background images
36 | self.random_metallic_value = False # randomize the metallic object value with p=0.5
37 | self.random_roughness_value = False # randomize the roughness object value with p=0.5
38 | self.random_color = "None" # choose "None", "temperature", "projector"
39 |
40 | # OBJECT COLOR (for PLY Files)
41 | self.model_scale = 1 # model scale for PLY objects
42 | self.hsv_hue = 0.5 # changes hue of Hue Saturation Value Node, default 0.5
43 | self.hsv_saturation = 1 # changes saturation of Hue Saturation Value Node, default 1
44 | self.hsv_value = 1 # 0.35 # changes value of Hue Saturation Value Node, default 1
45 |
46 | # camera sphere coordinates
47 | self.cam_rmin = 0.3 # minimum camera distance
48 | self.cam_rmax = 1.1 # maximum camera distance
49 | self.cam_incmin = 0
50 | self.cam_incmax = pi/2
51 | self.cam_azimin = 0
52 | self.cam_azimax = 2*pi
53 |
54 | # OBJECT POSITION
55 | self.obj_location_xmin = -0.2 # translation in meters
56 | self.obj_location_xmax = 0.2
57 | self.obj_location_ymin = -0.2
58 | self.obj_location_ymax = 0.2
59 | self.obj_location_zmin = -0.2
60 | self.obj_location_zmax = 0.2
61 | self.cam_rotation_min = 0
62 | self.cam_rotation_max = 2*pi
63 | self.max_boundingbox = 0.1 # filter out objects with bbox < -x or > 1+x (a value of 0.1 means max. 10% occlusion)
64 |
65 | # Camera
66 | self.cam_lens_unit = 'FOV' # Choose 'FOV' or 'MILLIMETERS'
67 | self.cam_lens = 4.7 # Camera lens value in mm
68 | self.cam_fov = (59+90)/2 # camera field of view in degrees
69 | self.cam_sensor_height = 3.84 # mm
70 | self.cam_sensor_width = 5.11 # mm
71 |
72 | self.clip_end = 50
73 | self.clip_start = 0.01
74 |
75 | # RENDERING CONFIG
76 | self.use_GPU = True
77 | self.use_cycles = True # cycles or eevee
78 | self.use_cycles_denoising = False
79 | self.use_adaptive_sampling = True
80 | self.resolution_x = 640 # pixel resolution
81 | self.resolution_y = 360
82 | self.samples = 512 # render engine samples
83 |
84 | # OUTPUT
85 | self.number_of_renders = 10 # how many rendered examples
86 |
--------------------------------------------------------------------------------
/distractor_textures/brick_floor_003_diffuse_1k.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/distractor_textures/brick_floor_003_diffuse_1k.jpg
--------------------------------------------------------------------------------
/distractors/Cube/Cube.mtl:
--------------------------------------------------------------------------------
1 | # Blender MTL File: 'None'
2 | # Material Count: 1
3 |
4 | newmtl Material.001
5 | Ns 380.250007
6 | Ka 0.100000 0.100000 0.100000
7 | Kd 0.132868 0.132868 0.132868
8 | Ks 1.000000 1.000000 1.000000
9 | Ke 0.000000 0.000000 0.000000
10 | Ni 1.450000
11 | d 1.000000
12 | illum 3
13 |
--------------------------------------------------------------------------------
/distractors/Cube/Cube.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.93.1 OBJ File: ''
2 | # www.blender.org
3 | mtllib Cube.mtl
4 | o Cube_MetallCube_Cube.001
5 | v -0.420000 -0.100000 0.100000
6 | v -0.420000 0.100000 0.100000
7 | v -0.420000 0.100000 -0.100000
8 | v -0.420000 -0.100000 -0.100000
9 | v -0.220000 0.100000 -0.100000
10 | v -0.220000 -0.100000 -0.100000
11 | v -0.220000 0.100000 0.100000
12 | v -0.220000 -0.100000 0.100000
13 | vt 0.375000 0.000000
14 | vt 0.625000 0.000000
15 | vt 0.625000 0.250000
16 | vt 0.375000 0.250000
17 | vt 0.625000 0.500000
18 | vt 0.375000 0.500000
19 | vt 0.625000 0.750000
20 | vt 0.375000 0.750000
21 | vt 0.625000 1.000000
22 | vt 0.375000 1.000000
23 | vt 0.125000 0.500000
24 | vt 0.125000 0.750000
25 | vt 0.875000 0.500000
26 | vt 0.875000 0.750000
27 | vn -1.0000 0.0000 0.0000
28 | vn 0.0000 0.0000 -1.0000
29 | vn 1.0000 0.0000 0.0000
30 | vn 0.0000 -0.0000 1.0000
31 | vn 0.0000 -1.0000 -0.0000
32 | vn 0.0000 1.0000 0.0000
33 | usemtl Material.001
34 | s 1
35 | f 1/1/1 2/2/1 3/3/1 4/4/1
36 | f 4/4/2 3/3/2 5/5/2 6/6/2
37 | f 6/6/3 5/5/3 7/7/3 8/8/3
38 | f 8/8/4 7/7/4 2/9/4 1/10/4
39 | f 4/11/5 6/6/5 8/8/5 1/12/5
40 | f 5/5/6 3/13/6 2/14/6 7/7/6
41 |
--------------------------------------------------------------------------------
/environment/machine_shop_01_2k.hdr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/environment/machine_shop_01_2k.hdr
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | # to install packages with PIP into the blender python:
5 | # e.g. /PATH/TO/BLENDER/python/bin$ ./python3.7m -m pip install pandas
6 |
7 | import bpy
8 | import bpy_extras
9 | import os
10 | import sys
11 | import random
12 | import math
13 | import numpy as np
14 | import json
15 | import datetime
16 | import colorsys
17 | import shutil
18 | import glob
19 | from mathutils import Vector, Matrix
20 |
21 | sys.path.append(os.getcwd())
22 | import util
23 |
24 |
25 | class BlenderGen:
26 | def __init__(self, cfg):
27 | """Blender generator class used to generate synthetic images with annotations.
28 |
29 | Args:
30 | cfg: imported config.py file which is used to set parameters.
31 |
32 | """
33 | self.cfg = cfg
34 | self._roughness = [] # internal list for object roughness
35 | self._metallic = [] # internal list for object metallicness
36 |
37 | def save_coco_label(self, images, annotations, Kdict):
38 | """Write annoations in the Microsoft COCO format to disk as instances_default.json.
39 |
40 | Args:
41 | images: List of generated images.
42 | annotations: List of annotations.
43 | Kdict: Dictionary of camera matrix, generated with save_camera_matrix().
44 |
45 | """
46 | # file format: https://cocodataset.org/#format-data
47 | info = {
48 | "year": datetime.datetime.now().year,
49 | "version": "1.1",
50 | "description": "Synthetic Dataset created with Blender Python script",
51 | "contributor": "IGNC",
52 | "url": "https://www.ignc.tu-berlin.de",
53 | "date_created": str(datetime.datetime.now()),
54 | "camera matrix K": Kdict,
55 | }
56 |
57 | coco = {
58 | "info": info,
59 | "images": images,
60 | "annotations": annotations,
61 | "categories": [
62 | {
63 | "supercategory": "",
64 | "id": 1,
65 | "name": self.cfg.out_folder,
66 | "skeleton": [],
67 | "keypoints": [],
68 | }
69 | ],
70 | "licenses": "",
71 | }
72 |
73 | filename = (
74 | "DATASET/" + self.cfg.out_folder + "/annotations/instances_default.json"
75 | )
76 | os.makedirs(os.path.dirname(filename), exist_ok=True)
77 | with open(filename, "w") as write_file:
78 | json.dump(coco, write_file, indent=2)
79 |
80 | def import_ply_object(self, filepath, scale):
81 | """Import PLY object from path to the Blender scene and scale it.
82 |
83 | Args:
84 | filepath: Path to PLY object.
85 | scale: Desired object scale.
86 |
87 | """
88 | bpy.ops.import_mesh.ply(filepath=filepath)
89 | obj_list = bpy.context.selected_objects[:]
90 | obj_list[0].name = "Object"
91 | obj = bpy.context.selected_objects[0]
92 | obj.scale = (scale, scale, scale) # scale PLY object
93 |
94 | # add vertex color to PLY object
95 | obj.select_set(True)
96 | mat = bpy.data.materials.new("Material.001")
97 | obj.active_material = mat
98 | mat.use_nodes = True
99 | nodes = mat.node_tree.nodes
100 | mat_links = mat.node_tree.links
101 | bsdf = nodes.get("Principled BSDF")
102 |
103 | vcol = nodes.new(type="ShaderNodeVertexColor")
104 | vcol.layer_name = "Col"
105 |
106 | mat_links.new(vcol.outputs["Color"], bsdf.inputs["Base Color"])
107 |
108 | # save object material inputs
109 | self._metallic.append(bsdf.inputs["Metallic"].default_value)
110 | self._roughness.append(bsdf.inputs["Roughness"].default_value)
111 |
112 | return obj
113 |
114 | def import_obj_object(self, filepath, distractor=False):
115 | """Import an *.OBJ file to the Blender scene.
116 |
117 | Args:
118 | filepath: Path to OBJ file.
119 | distractor: True if it is a distractor object, False if it is the object of interest.
120 |
121 | """
122 | name = "Object"
123 | file_path = filepath
124 | if distractor == True:
125 | name = "Distractor"
126 | file_path = glob.glob(filepath + "/*.obj")[0]
127 | texture_path = glob.glob(filepath + "/*.png")
128 | if texture_path:
129 | texture_path = glob.glob(filepath + "/*.png")[0]
130 |
131 | if bpy.app.version[0] >= 4:
132 | bpy.ops.wm.obj_import(filepath=file_path, forward_axis="Y", up_axis="Z")
133 | else:
134 | bpy.ops.import_scene.obj(filepath=file_path, axis_forward="Y", axis_up="Z")
135 | print("importing model with axis_forward=Y, axis_up=Z")
136 |
137 | obj_objects = bpy.context.selected_objects[:]
138 | obj_objects[0].name = name # set object name
139 |
140 | # get BSDF material node
141 | obj = obj_objects[0]
142 | mat = obj.active_material
143 | nodes = mat.node_tree.nodes
144 | mat_links = mat.node_tree.links
145 | bsdf = nodes.get("Principled BSDF")
146 |
147 | if (
148 | distractor == True and len(self.cfg.distractor_texture_path) > 0
149 | ): # distractor with random texture
150 | texture = nodes.new(type="ShaderNodeTexImage") # new node
151 | mat_links.new(
152 | texture.outputs["Color"], bsdf.inputs["Base Color"]
153 | ) # link texture node to bsdf node
154 |
155 | if (
156 | len(self.cfg.object_texture_path) > 0 and distractor == False
157 | ): # use random image texture on object
158 | texture = nodes.new(type="ShaderNodeTexImage") # new node
159 | mat_links.new(
160 | texture.outputs["Color"], bsdf.inputs["Base Color"]
161 | ) # link texture node to bsdf node
162 |
163 | # save object material inputs
164 | self._metallic.append(bsdf.inputs["Metallic"].default_value)
165 | self._roughness.append(bsdf.inputs["Roughness"].default_value)
166 |
167 | return obj
168 |
169 | def project_by_object_utils(self, cam, point):
170 | """Returns normalized (x, y) image coordinates in OpenCV frame for a given Blender world point.
171 |
172 | Args:
173 | cam: Blender camera object.
174 | point: 3D world point that must be projected to 2D.
175 |
176 | Returns:
177 | Vector of normalized (x, y) coordinates.
178 |
179 | """
180 |
181 | scene = bpy.context.scene
182 | co_2d = bpy_extras.object_utils.world_to_camera_view(scene, cam, point)
183 | # convert y coordinate to opencv coordinate system!
184 | return Vector((co_2d.x, 1 - co_2d.y)) # normalized
185 |
186 | def setup_bg_image_nodes(self, rl):
187 | """Setup all compositor nodes to render background images.
188 |
189 | Args:
190 | rl: Blender CompositorNodeRLayers.
191 |
192 | """
193 | # https://henryegloff.com/how-to-render-a-background-image-in-blender-2-8/
194 |
195 | bpy.context.scene.render.film_transparent = True
196 |
197 | # create nodes
198 | tree = bpy.context.scene.node_tree
199 | links = tree.links
200 | alpha_node = tree.nodes.new(type="CompositorNodeAlphaOver")
201 | composite_node = tree.nodes.new(type="CompositorNodeComposite")
202 | scale_node = tree.nodes.new(type="CompositorNodeScale")
203 | image_node = tree.nodes.new(type="CompositorNodeImage")
204 |
205 | scale_node.space = "RENDER_SIZE"
206 | scale_node.frame_method = "CROP"
207 |
208 | # link nodes
209 | links.new(rl.outputs["Image"], alpha_node.inputs[2])
210 | links.new(image_node.outputs["Image"], scale_node.inputs["Image"])
211 | links.new(scale_node.outputs["Image"], alpha_node.inputs[1])
212 | links.new(alpha_node.outputs["Image"], composite_node.inputs["Image"])
213 |
214 | def setup_camera(self):
215 | """Set camera config."""
216 | camera = bpy.data.objects["Camera"]
217 |
218 | # camera config
219 | bpy.data.cameras["Camera"].clip_start = self.cfg.clip_start
220 | bpy.data.cameras["Camera"].clip_end = self.cfg.clip_end
221 |
222 | # CAMERA CONFIG
223 | camera.data.sensor_height = self.cfg.cam_sensor_height
224 | camera.data.sensor_width = self.cfg.cam_sensor_width
225 | if self.cfg.cam_lens_unit == "FOV":
226 | camera.data.lens_unit = "FOV"
227 | camera.data.angle = (self.cfg.cam_fov / 360) * 2 * math.pi
228 | else:
229 | camera.data.lens_unit = "MILLIMETERS"
230 | camera.data.lens = self.cfg.cam_lens
231 |
232 | return camera
233 |
234 | def get_camera_KRT(self, camera):
235 | """return 3x3 camera matrix K and 4x4 rotation, translation matrix RT.
236 | Experimental feature, the matrix might be wrong!"""
237 |
238 | # https://www.blender.org/forum/viewtopic.php?t=20231
239 | # Extrinsic and Intrinsic Camera Matrices
240 | scn = bpy.data.scenes["Scene"]
241 | w = scn.render.resolution_x * scn.render.resolution_percentage / 100.0
242 | h = scn.render.resolution_y * scn.render.resolution_percentage / 100.0
243 | # Extrinsic
244 | RT = camera.matrix_world.inverted()
245 | # Intrinsic
246 | K = Matrix().to_3x3()
247 | K[0][0] = -w / 2 / math.tan(camera.data.angle / 2)
248 | ratio = w / h
249 | K[1][1] = -h / 2.0 / math.tan(camera.data.angle / 2) * ratio
250 | K[0][2] = w / 2.0
251 | K[1][2] = h / 2.0
252 | K[2][2] = 1.0
253 | return K, RT
254 |
255 | @staticmethod
256 | def save_camera_matrix(K):
257 | """Save blenders camera matrix K to a file.
258 |
259 | Args:
260 | K: 3x3 Camera matrix. Can be retrieved with get_camera_KRT().
261 |
262 | """
263 | # https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
264 |
265 | Kdict = {
266 | "fx": K[0][0],
267 | "cx": K[0][2],
268 | "fy": K[1][1],
269 | "cy": K[1][2],
270 | }
271 |
272 | with open("camera_intrinsic.json", "w") as write_file:
273 | json.dump(Kdict, write_file)
274 | # save as json for better readability
275 | np.savetxt("K.txt", K)
276 | return Kdict
277 |
278 | @staticmethod
279 | def get_sphere_coordinates(radius, inclination, azimuth):
280 | """Convert sphere to cartesian coordinates.
281 |
282 | Args:
283 | radius: Sphere coordinate radius.
284 | inclination: Sphere coordinate inclination θ [0, pi].
285 | azimuth: Sphere coordinate azimuth φ [0, 2pi]
286 |
287 | Returns:
288 | Cartesian 3D-point (x, y, z).
289 |
290 | """
291 | # https://de.m.wikipedia.org/wiki/Kugelkoordinaten
292 |
293 | x = radius * math.sin(inclination) * math.cos(azimuth)
294 | y = radius * math.sin(inclination) * math.sin(azimuth)
295 | z = radius * math.cos(inclination)
296 | return (x, y, z)
297 |
298 | def place_camera(self, camera, radius, inclination, azimuth):
299 | """Sample x,y,z on sphere and place camera (looking at the origin).
300 |
301 | Args:
302 | camera: Blender camera object.
303 | radius: Sphere coordinate radius.
304 | inclination: Sphere coordinate inclination θ [0, pi].
305 | azimuth: Sphere coordinate azimuth φ [0, 2pi]
306 |
307 | Returns:
308 | Blender camera object with new location.
309 |
310 | """
311 | x, y, z = BlenderGen.get_sphere_coordinates(radius, inclination, azimuth)
312 | camera.location.x = x
313 | camera.location.y = y
314 | camera.location.z = z
315 |
316 | bpy.context.view_layer.update()
317 | return camera
318 |
319 | def setup_light(self, scene, light_number=1, random_color=None):
320 | """Create a random point light source.
321 |
322 | Args:
323 | scene: Blender scene.
324 | light_number (int): Number of desired point lights.
325 | random_color: Can be projector, temperature, or None.
326 |
327 | """
328 |
329 | if random_color == "temperature":
330 | light_color = util.get_random_temperature_color()
331 | for i in range(light_number):
332 | # place new random light in cartesian coordinates
333 | x, y, z = BlenderGen.get_sphere_coordinates(
334 | random.uniform(self.cfg.cam_rmin, self.cfg.cam_rmax),
335 | inclination=random.uniform(self.cfg.cam_incmin, self.cfg.cam_incmax),
336 | azimuth=random.uniform(self.cfg.cam_azimin, self.cfg.cam_azimax),
337 | )
338 | light_data = bpy.data.lights.new(name="my-light-data", type="POINT")
339 | light_data.energy = random.uniform(
340 | self.cfg.light_energymin, self.cfg.light_energymax
341 | ) # random energy in Watt
342 | if random_color == "projector":
343 | light_data.color = colorsys.hsv_to_rgb(random.random(), 1, 1)
344 | elif random_color == "temperature":
345 | light_data.color = light_color # util.get_random_temperature_color()
346 | light_object = bpy.data.objects.new(name="my-light", object_data=light_data)
347 | bpy.context.collection.objects.link(light_object)
348 | light_object.location = (x, y, z)
349 |
350 | def get_bg_image(self, bg_path):
351 | """Get list of all background images in folder 'bg_path' then choose random image.
352 |
353 | Args:
354 | bg_path: Path to folder with background images.
355 |
356 | Returns:
357 | Background image, background image path.
358 |
359 | """
360 |
361 | idx = random.randint(0, len(bg_path) - 1)
362 |
363 | img_list = os.listdir(bg_path[idx])
364 | randomImgNumber = random.randint(0, len(img_list) - 1)
365 | bg_img = img_list[randomImgNumber]
366 | bg_img_path = os.path.join(bg_path[idx], bg_img)
367 | return bg_img, os.path.abspath(bg_img_path)
368 |
369 | def add_shader_on_world(self):
370 | """Needed for Environment Map Background."""
371 |
372 | bpy.data.worlds["World"].use_nodes = True
373 | env_node = bpy.data.worlds["World"].node_tree.nodes.new(
374 | type="ShaderNodeTexEnvironment"
375 | )
376 | emission_node = bpy.data.worlds["World"].node_tree.nodes.new(
377 | type="ShaderNodeEmission"
378 | )
379 | world_node = bpy.data.worlds["World"].node_tree.nodes["World Output"]
380 |
381 | # connect env node with emission node
382 | bpy.data.worlds["World"].node_tree.links.new(
383 | env_node.outputs["Color"], emission_node.inputs["Color"]
384 | )
385 | # connect emission node with world node
386 | bpy.data.worlds["World"].node_tree.links.new(
387 | emission_node.outputs["Emission"], world_node.inputs["Surface"]
388 | )
389 |
390 | def scene_cfg(self, camera, i):
391 | """Configure the blender scene with random distributions.
392 |
393 | Args:
394 | camera: Blender camera object.
395 | i: ID of generated image and annotation.
396 |
397 | Returns:
398 | background image, image (for annotation), annotation.
399 |
400 | """
401 |
402 | scene = bpy.data.scenes["Scene"]
403 | if not self.cfg.use_environment_maps:
404 | light_nr = random.randint(
405 | self.cfg.light_number_min, self.cfg.light_number_max
406 | ) # sample number n of Point Lights
407 | self.setup_light(
408 | scene, light_number=light_nr, random_color=self.cfg.random_color
409 | )
410 |
411 | # background
412 | if self.cfg.use_environment_maps:
413 | # set HDRI Environment texture
414 | bg_img, bg_img_path = self.get_bg_image(self.cfg.environment_paths)
415 | bpy.data.images.load(bg_img_path)
416 | bpy.data.worlds["World"].node_tree.nodes["Environment Texture"].image = (
417 | bpy.data.images[bg_img]
418 | )
419 |
420 | # set Emission Node Strength E
421 | bpy.data.worlds["World"].node_tree.nodes["Emission"].inputs[
422 | 1
423 | ].default_value = random.uniform(
424 | self.cfg.emission_min, self.cfg.emission_max
425 | )
426 |
427 | if self.cfg.use_bg_image:
428 | bg_img, bg_img_path = self.get_bg_image(self.cfg.bg_paths)
429 | # set camera background image
430 | img = bpy.data.images.load(bg_img_path)
431 | tree = bpy.context.scene.node_tree
432 | image_node = tree.nodes.get("Image")
433 | image_node.image = img
434 |
435 | obj_list = bpy.context.selectable_objects # camera, objects
436 | mesh_list_objects = []
437 | mesh_list_distractors = []
438 |
439 | # hide all objects
440 | for o in obj_list:
441 | if o.type == "MESH":
442 | if o.name.find("Distractor") != -1:
443 | o.hide_render = True
444 | mesh_list_distractors.append(o)
445 | elif o.name.find("Object") != -1:
446 | o.hide_render = True
447 | mesh_list_objects.append(o)
448 |
449 | x = random.randint(
450 | 0, len(self.cfg.model_paths) - 1
451 | ) # select random number of objects to render, hide the rest
452 | obj = mesh_list_objects[x]
453 | obj.hide_render = False
454 | # mat = obj.active_material # access material
455 |
456 | # change distractor object texture
457 | if len(self.cfg.distractor_texture_path) > 0:
458 | for distractor in mesh_list_distractors:
459 | mat = distractor.active_material
460 | nodes = mat.node_tree.nodes
461 | texture = nodes.get("Image Texture")
462 | texture_list = os.listdir(self.cfg.distractor_texture_path)
463 | texture_path = texture_list[random.randint(0, len(texture_list) - 1)]
464 | bpy.data.images.load(
465 | os.path.abspath(
466 | os.path.join(self.cfg.distractor_texture_path, texture_path)
467 | )
468 | )
469 | texture.image = bpy.data.images[texture_path]
470 |
471 | # change object texture
472 | if len(self.cfg.object_texture_path) > 0:
473 | mat = obj.active_material
474 | nodes = mat.node_tree.nodes
475 | texture = nodes.get("Image Texture")
476 | texture_list = os.listdir(self.cfg.object_texture_path)
477 | texture_path = texture_list[random.randint(0, len(texture_list) - 1)]
478 | # load object textures
479 | bpy.data.images.load(
480 | os.path.abspath(
481 | os.path.join(self.cfg.object_texture_path, texture_path)
482 | )
483 | )
484 | texture.image = bpy.data.images[texture_path]
485 |
486 | if not self.cfg.distractor_paths: # an empty list is False
487 | n = 0
488 | else:
489 | n = random.randint(0, self.cfg.max_distractor_objects)
490 | for j in range(n):
491 | # select random object to render, hide the rest
492 | y = random.randint(0, len(self.cfg.distractor_paths) - 1)
493 | dis_obj = mesh_list_distractors[y]
494 | dis_obj.hide_render = False
495 |
496 | # position distractor objects
497 | dis_obj.location.x = random.uniform(
498 | self.cfg.obj_location_xmin, self.cfg.obj_location_xmax
499 | )
500 | dis_obj.location.y = random.uniform(
501 | self.cfg.obj_location_ymin, self.cfg.obj_location_ymax
502 | )
503 | dis_obj.location.z = random.uniform(
504 | self.cfg.obj_location_zmin, self.cfg.obj_location_zmax
505 | )
506 | rot_angle1 = random.uniform(
507 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
508 | )
509 | rot_angle2 = random.uniform(
510 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
511 | )
512 | rot_angle3 = random.uniform(
513 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
514 | )
515 | dis_obj.rotation_euler = (rot_angle1, rot_angle2, rot_angle3)
516 |
517 | # random metallic material
518 | if self.cfg.random_metallic_value:
519 | mat = obj.active_material
520 | if random.random() >= 0.5:
521 | mat.node_tree.nodes["Principled BSDF"].inputs[
522 | "Metallic"
523 | ].default_value = random.random()
524 | else:
525 | mat.node_tree.nodes["Principled BSDF"].inputs[
526 | "Metallic"
527 | ].default_value = self._metallic[x - 1]
528 |
529 | # random roughness material
530 | if self.cfg.random_roughness_value:
531 | mat = obj.active_material
532 | if random.random() >= 0.5:
533 | mat.node_tree.nodes["Principled BSDF"].inputs[
534 | "Roughness"
535 | ].default_value = random.random()
536 | else:
537 | mat.node_tree.nodes["Principled BSDF"].inputs[
538 | "Roughness"
539 | ].default_value = self._roughness[x - 1]
540 |
541 | # random projector augmentation (point light with random color)
542 | if self.cfg.random_color == "projector":
543 | if random.random() >= 0.5:
544 | self.setup_light(scene, light_number=1, random_color="projector")
545 |
546 | repeat = True
547 | while repeat:
548 | # random camera position x_c, y_c, z_c
549 | camera = self.place_camera(
550 | camera,
551 | radius=random.uniform(self.cfg.cam_rmin, self.cfg.cam_rmax),
552 | inclination=random.uniform(self.cfg.cam_incmin, self.cfg.cam_incmax),
553 | azimuth=random.uniform(self.cfg.cam_azimin, self.cfg.cam_azimax),
554 | )
555 |
556 | empty_obj = bpy.data.objects["empty"]
557 |
558 | # random object pose
559 | obj.location.x = random.uniform(
560 | self.cfg.obj_location_xmin, self.cfg.obj_location_xmax
561 | ) # x_o
562 | obj.location.y = random.uniform(
563 | self.cfg.obj_location_ymin, self.cfg.obj_location_ymax
564 | ) # y_o
565 | obj.location.z = random.uniform(
566 | self.cfg.obj_location_zmin, self.cfg.obj_location_zmax
567 | ) # z_o
568 |
569 | rot_angle1 = random.uniform(
570 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
571 | ) # alpha 1
572 | rot_angle2 = random.uniform(
573 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
574 | ) # alpha 2
575 | rot_angle3 = random.uniform(
576 | self.cfg.cam_rotation_min, self.cfg.cam_rotation_max
577 | ) # alpha 3
578 | empty_obj.rotation_euler = (
579 | rot_angle1,
580 | rot_angle2,
581 | rot_angle3,
582 | ) # XYZ euler rotation on the empty object
583 |
584 | # update blender object world_matrices!
585 | bpy.context.view_layer.update()
586 |
587 | # Some point in 3D you want to project
588 | # v = obj.location
589 | # Projecting v with the camera
590 | # K, RT = get_camera_KRT(camera)
591 | # p = K @ (RT @ v)
592 | # p /= p[2]
593 | # p[1] = 512 - p[1] # openCV frame
594 |
595 | center = self.project_by_object_utils(
596 | camera, obj.location
597 | ) # object 2D center
598 |
599 | class_ = 0 # class label for object
600 | labels = [class_]
601 | labels.append(center[0]) # center x coordinate in image space
602 | labels.append(center[1]) # center y coordinate in image space
603 | corners = util.orderCorners(
604 | obj.bound_box
605 | ) # change order from blender to SSD paper
606 |
607 | repeat = False
608 | for corner in corners:
609 | p = obj.matrix_world @ Vector(corner) # object space to world space
610 | p = self.project_by_object_utils(
611 | camera, p
612 | ) # world space to image space
613 | labels.append(p[0])
614 | labels.append(p[1])
615 | if p[0] < 0 or p[0] > 1 or p[1] < 0 or p[1] > 1:
616 | v = 1 # v=1: labeled but not visible
617 | else:
618 | v = 2 # v=2: labeled and visible
619 |
620 | # filter out objects outside of the image view
621 | if (
622 | p[0] < -self.cfg.max_boundingbox
623 | or p[0] > (1 + self.cfg.max_boundingbox)
624 | or p[1] < -self.cfg.max_boundingbox
625 | or p[1] > (1 + self.cfg.max_boundingbox)
626 | ):
627 | repeat = True
628 |
629 | # check if object is occluded from a distractor
630 | location = scene.ray_cast(
631 | bpy.context.evaluated_depsgraph_get(),
632 | camera.location,
633 | (obj.location - camera.location).normalized(),
634 | )
635 | try:
636 | # ray hit something
637 | if "Object" not in location[4].name:
638 | repeat = True
639 | except:
640 | # ray hit nothing --> repeat the scene
641 | repeat = True
642 |
643 | P = camera.matrix_world.inverted() @ obj.matrix_world
644 |
645 | # compute bounding box either with 3D bbox or by going through vertices
646 | if (
647 | self.cfg.compute_bbox == "tight"
648 | ): # loop through all vertices and transform to image coordinates
649 | min_x, max_x, min_y, max_y = 1, 0, 1, 0
650 | vertices = obj.data.vertices
651 | for v in vertices:
652 | vec = self.project_by_object_utils(
653 | camera, obj.matrix_world @ Vector(v.co)
654 | )
655 | x = vec[0]
656 | y = vec[1]
657 | if x > max_x:
658 | max_x = x
659 | if x < min_x:
660 | min_x = x
661 | if y > max_y:
662 | max_y = y
663 | if y < min_y:
664 | min_y = y
665 | else: # use blenders 3D bbox (simple but fast)
666 | min_x = np.min(
667 | [
668 | labels[3],
669 | labels[5],
670 | labels[7],
671 | labels[9],
672 | labels[11],
673 | labels[13],
674 | labels[15],
675 | labels[17],
676 | ]
677 | )
678 | max_x = np.max(
679 | [
680 | labels[3],
681 | labels[5],
682 | labels[7],
683 | labels[9],
684 | labels[11],
685 | labels[13],
686 | labels[15],
687 | labels[17],
688 | ]
689 | )
690 |
691 | min_y = np.min(
692 | [
693 | labels[4],
694 | labels[6],
695 | labels[8],
696 | labels[10],
697 | labels[12],
698 | labels[14],
699 | labels[16],
700 | labels[18],
701 | ]
702 | )
703 | max_y = np.max(
704 | [
705 | labels[4],
706 | labels[6],
707 | labels[8],
708 | labels[10],
709 | labels[12],
710 | labels[14],
711 | labels[16],
712 | labels[18],
713 | ]
714 | )
715 |
716 | # save labels in txt file (deprecated)
717 | x_range = max_x - min_x
718 | y_range = max_y - min_y
719 | labels.append(x_range)
720 | labels.append(y_range)
721 |
722 | # fix center point
723 | labels[1] = (max_x + min_x) / 2
724 | labels[2] = (max_y + min_y) / 2
725 |
726 | if not repeat:
727 | # save COCO label
728 | image = {
729 | "id": i,
730 | "file_name": "{:06}".format(i) + ".jpg",
731 | "height": self.cfg.resolution_y,
732 | "width": self.cfg.resolution_x,
733 | }
734 | annotation = {
735 | "id": i,
736 | "image_id": i,
737 | "bbox": [
738 | round(min_x * self.cfg.resolution_x, 2),
739 | round(min_y * self.cfg.resolution_y, 2),
740 | round(x_range * self.cfg.resolution_x, 2),
741 | round(y_range * self.cfg.resolution_y, 2),
742 | ],
743 | "category_id": 1,
744 | "segmentation": [],
745 | "iscrowd": 0,
746 | "area": round(
747 | x_range
748 | * self.cfg.resolution_x
749 | * y_range
750 | * self.cfg.resolution_y,
751 | 2,
752 | ),
753 | "keypoints": [],
754 | "num_keypoints": 0,
755 | }
756 |
757 | return bg_img, image, annotation
758 |
759 | def setup(self):
760 | """one time config setup for blender."""
761 |
762 | bpy.ops.object.select_all(action="TOGGLE")
763 | camera = self.setup_camera()
764 |
765 | # delete Light
766 | bpy.ops.object.select_by_type(type="LIGHT")
767 | bpy.ops.object.delete(use_global=False)
768 |
769 | # configure rendered image's parameters
770 | bpy.context.scene.render.resolution_percentage = 100
771 | bpy.context.scene.render.image_settings.color_mode = "RGB"
772 | bpy.context.scene.render.image_settings.color_depth = (
773 | "8" # Bit depth per channel [8,16,32]
774 | )
775 | bpy.context.scene.render.image_settings.file_format = "JPEG" # 'PNG'
776 | bpy.context.scene.render.image_settings.compression = 0 # JPEG compression
777 | bpy.context.scene.render.image_settings.quality = 100
778 |
779 | # constrain camera to look at blenders (0,0,0) scene origin (empty_object)
780 | cam_constraint = camera.constraints.new(type="TRACK_TO")
781 | cam_constraint.track_axis = "TRACK_NEGATIVE_Z"
782 | cam_constraint.up_axis = "UP_Y"
783 | cam_constraint.use_target_z = True
784 | empty_obj = bpy.data.objects.new("empty", None)
785 | cam_constraint.target = empty_obj
786 |
787 | # composite node
788 | bpy.context.scene.use_nodes = True
789 | tree = bpy.context.scene.node_tree
790 | links = tree.links
791 | for n in tree.nodes:
792 | tree.nodes.remove(n)
793 | rl = tree.nodes.new(type="CompositorNodeRLayers")
794 |
795 | if self.cfg.use_bg_image:
796 | self.setup_bg_image_nodes(rl)
797 |
798 | # save depth output file? not tested!
799 | if self.cfg.output_depth:
800 | depth_file_output = tree.nodes.new(type="CompositorNodeOutputFile")
801 | depth_file_output.base_path = ""
802 | depth_file_output.format.file_format = "PNG" # 'OPEN_EXR'
803 | depth_file_output.format.color_depth = "16" # self.cfg.depth_color_depth
804 | depth_file_output.format.color_mode = "BW"
805 |
806 | map_node = tree.nodes.new(type="CompositorNodeMapRange")
807 | map_node.inputs[1].default_value = 0 # From Min
808 | map_node.inputs[2].default_value = 20 # From Max
809 | map_node.inputs[3].default_value = 0 # To Min
810 | map_node.inputs[4].default_value = 1 # To Max
811 | links.new(rl.outputs["Depth"], map_node.inputs[0])
812 | links.new(map_node.outputs[0], depth_file_output.inputs[0])
813 | else:
814 | depth_file_output = None
815 |
816 | # delete cube from default blender scene
817 | bpy.data.objects["Cube"].select_set(True)
818 | bpy.ops.object.delete()
819 |
820 | # import model object
821 | number_of_objects = len(self.cfg.model_paths)
822 | for i in range(number_of_objects):
823 | if (
824 | self.cfg.model_paths[i][-4:] == ".obj"
825 | or self.cfg.model_paths[i][-4:] == ".OBJ"
826 | ):
827 | obj = self.import_obj_object(filepath=self.cfg.model_paths[i])
828 | elif (
829 | self.cfg.model_paths[i][-4:] == ".ply"
830 | or self.cfg.model_paths[i][-4:] == ".PLY"
831 | ):
832 | obj = self.import_ply_object(
833 | filepath=self.cfg.model_paths[i], scale=self.cfg.model_scale
834 | )
835 |
836 | # import distractor objects
837 | number_of_objects = len(self.cfg.distractor_paths)
838 | for i in range(number_of_objects):
839 | obj = self.import_obj_object(
840 | filepath=self.cfg.distractor_paths[i], distractor=True
841 | )
842 |
843 | if self.cfg.use_environment_maps:
844 | self.add_shader_on_world() # used for HDR background image
845 |
846 | return camera, depth_file_output
847 |
848 | def render_cfg(self):
849 | """setup Blenders render engine (EEVEE or CYCLES) once"""
850 |
851 | # refresh the list of devices
852 | devices = bpy.context.preferences.addons["cycles"].preferences.get_devices()
853 | try:
854 | # try to activate all available devices
855 | devices = devices[0]
856 | for d in devices:
857 | d["use"] = 1 # activate all devices
858 | print("activating device: " + str(d["name"]))
859 | except Exception as e:
860 | print(e)
861 |
862 | if self.cfg.use_cycles:
863 | bpy.context.scene.render.engine = "CYCLES"
864 | bpy.context.scene.cycles.samples = self.cfg.samples
865 | bpy.context.scene.cycles.max_bounces = 8
866 | bpy.context.scene.cycles.use_denoising = self.cfg.use_cycles_denoising
867 | bpy.context.scene.cycles.use_adaptive_sampling = (
868 | self.cfg.use_adaptive_sampling
869 | )
870 | bpy.context.scene.cycles.adaptive_min_samples = 50
871 | bpy.context.scene.cycles.adaptive_threshold = 0.001
872 | bpy.context.scene.cycles.denoiser = (
873 | "OPENIMAGEDENOISE" # Intel OpenImage AI denoiser on CPU
874 | )
875 | else:
876 | bpy.context.scene.render.engine = "BLENDER_EEVEE"
877 | bpy.context.scene.eevee.taa_render_samples = self.cfg.samples
878 | if self.cfg.use_GPU:
879 | bpy.context.preferences.addons["cycles"].preferences.compute_device_type = (
880 | "CUDA"
881 | )
882 | bpy.context.scene.cycles.device = "GPU"
883 |
884 | # https://docs.blender.org/manual/en/latest/files/media/image_formats.html
885 | # set image width and height
886 | bpy.context.scene.render.resolution_x = self.cfg.resolution_x
887 | bpy.context.scene.render.resolution_y = self.cfg.resolution_y
888 |
889 | def render(self, camera, depth_file_output):
890 | """Main loop to render images.
891 |
892 | Args:
893 | camera: Blender camera object.
894 | depth_file_output: depth file from setup().
895 |
896 | Returns:
897 | images, annotations.
898 |
899 | """
900 |
901 | self.render_cfg() # setup render config once
902 | annotations = []
903 | images = []
904 |
905 | start_time = datetime.datetime.now()
906 |
907 | # render loop
908 | if self.cfg.test:
909 | self.cfg.number_of_renders = 1
910 | for i in range(self.cfg.number_of_renders):
911 | bpy.context.scene.render.filepath = os.path.abspath(
912 | os.path.join(
913 | "DATASET", self.cfg.out_folder, "images/{:06}.jpg".format(i)
914 | )
915 | )
916 | bg_img, image, annotation = self.scene_cfg(camera, i)
917 | images.append(image)
918 | annotations.append(annotation)
919 |
920 | if self.cfg.output_depth:
921 | depth_file_output.file_slots[0].path = (
922 | bpy.context.scene.render.filepath + "_depth"
923 | )
924 | bpy.ops.render.render(
925 | write_still=True, use_viewport=False
926 | ) # render current scene
927 |
928 | for block in bpy.data.lights: # delete lights
929 | if not self.cfg.test:
930 | bpy.data.lights.remove(block)
931 |
932 | end_time = datetime.datetime.now()
933 | dt = end_time - start_time
934 | seconds_per_render = dt.seconds / self.cfg.number_of_renders
935 | print("---------------")
936 | print("finished rendering")
937 | print("total render time (hh:mm:ss): " + str(dt))
938 | print("average seconds per image: " + str(seconds_per_render))
939 |
940 | return images, annotations
941 |
942 | def run(self):
943 | """
944 | Call this script with 'blender --background --python main.py'.
945 |
946 | Edit the config.py file to change configuration parameters
947 |
948 | """
949 |
950 | random.seed(self.cfg.seed)
951 | camera, depth_file_output = self.setup() # setup once
952 |
953 | images, annotations = self.render(camera, depth_file_output) # render loop
954 | K, RT = self.get_camera_KRT(bpy.data.objects["Camera"])
955 | Kdict = BlenderGen.save_camera_matrix(K) # save camera matrix to K.txt
956 | bpy.ops.wm.save_as_mainfile(
957 | filepath=os.path.join(os.getcwd(), "scene.blend"), check_existing=False
958 | ) # save current scene as .blend file
959 | shutil.copy2(
960 | "config.py", os.path.join("DATASET", self.cfg.out_folder)
961 | ) # save config.py file
962 | self.save_coco_label(
963 | images, annotations, Kdict
964 | ) # save COCO annotation file at the end
965 |
966 | return True
967 |
968 |
969 | if __name__ == "__main__":
970 | import config
971 |
972 | Generator = BlenderGen(cfg=config.cfg())
973 | Generator.run()
974 |
--------------------------------------------------------------------------------
/models/Suzanne.mtl:
--------------------------------------------------------------------------------
1 | # Blender MTL File: 'None'
2 | # Material Count: 1
3 |
4 | newmtl Material.002
5 | Ns 380.250007
6 | Ka 0.100000 0.100000 0.100000
7 | Kd 0.132868 0.132868 0.132868
8 | Ks 1.000000 1.000000 1.000000
9 | Ke 0.000000 0.000000 0.000000
10 | Ni 1.450000
11 | d 1.000000
12 | illum 3
13 |
--------------------------------------------------------------------------------
/models/Suzanne.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.92.0 OBJ File: ''
2 | # www.blender.org
3 | mtllib H8000.mtl
4 | o Suzanne
5 | v 0.043750 -0.076563 0.024609
6 | v -0.043750 -0.076563 0.024609
7 | v 0.050000 -0.068750 0.014062
8 | v -0.050000 -0.068750 0.014062
9 | v 0.054688 -0.057813 0.008203
10 | v -0.054688 -0.057813 0.008203
11 | v 0.035156 -0.061719 -0.003516
12 | v -0.035156 -0.061719 -0.003516
13 | v 0.035156 -0.071875 0.004687
14 | v -0.035156 -0.071875 0.004687
15 | v 0.035156 -0.078125 0.019922
16 | v -0.035156 -0.078125 0.019922
17 | v 0.027344 -0.079687 0.024609
18 | v -0.027344 -0.079687 0.024609
19 | v 0.020313 -0.074219 0.014062
20 | v -0.020313 -0.074219 0.014062
21 | v 0.015625 -0.064844 0.008203
22 | v -0.015625 -0.064844 0.008203
23 | v 0.007812 -0.065625 0.036328
24 | v -0.007812 -0.065625 0.036328
25 | v 0.014063 -0.074219 0.036328
26 | v -0.014063 -0.074219 0.036328
27 | v 0.024219 -0.079687 0.036328
28 | v -0.024219 -0.079687 0.036328
29 | v 0.027344 -0.079687 0.049219
30 | v -0.027344 -0.079687 0.049219
31 | v 0.020313 -0.074219 0.058594
32 | v -0.020313 -0.074219 0.058594
33 | v 0.015625 -0.064844 0.065625
34 | v -0.015625 -0.064844 0.065625
35 | v 0.035156 -0.061719 0.077344
36 | v -0.035156 -0.061719 0.077344
37 | v 0.035156 -0.071875 0.067969
38 | v -0.035156 -0.071875 0.067969
39 | v 0.035156 -0.078125 0.053906
40 | v -0.035156 -0.078125 0.053906
41 | v 0.043750 -0.076563 0.049219
42 | v -0.043750 -0.076563 0.049219
43 | v 0.050000 -0.068750 0.058594
44 | v -0.050000 -0.068750 0.058594
45 | v 0.054688 -0.057813 0.065625
46 | v -0.054688 -0.057813 0.065625
47 | v 0.062500 -0.056250 0.036328
48 | v -0.062500 -0.056250 0.036328
49 | v 0.056250 -0.067188 0.036328
50 | v -0.056250 -0.067188 0.036328
51 | v 0.046875 -0.075781 0.036328
52 | v -0.046875 -0.075781 0.036328
53 | v 0.047656 -0.077344 0.036328
54 | v -0.047656 -0.077344 0.036328
55 | v 0.044531 -0.078125 0.050391
56 | v -0.044531 -0.078125 0.050391
57 | v 0.035156 -0.080469 0.056250
58 | v -0.035156 -0.080469 0.056250
59 | v 0.026563 -0.082031 0.050391
60 | v -0.026563 -0.082031 0.050391
61 | v 0.022656 -0.082031 0.036328
62 | v -0.022656 -0.082031 0.036328
63 | v 0.026563 -0.082031 0.023437
64 | v -0.026563 -0.082031 0.023437
65 | v 0.035156 -0.082813 0.036328
66 | v -0.035156 -0.082813 0.036328
67 | v 0.035156 -0.080469 0.017578
68 | v -0.035156 -0.080469 0.017578
69 | v 0.044531 -0.078125 0.023437
70 | v -0.044531 -0.078125 0.023437
71 | v 0.000000 -0.074219 0.064453
72 | v 0.000000 -0.082031 0.052734
73 | v 0.000000 -0.073437 -0.101953
74 | v 0.000000 -0.078125 -0.048047
75 | v 0.000000 -0.079687 -0.028125
76 | v 0.000000 -0.071875 -0.116016
77 | v 0.000000 -0.060156 0.060937
78 | v 0.000000 -0.057031 0.085547
79 | v 0.000000 0.054687 0.134766
80 | v 0.000000 0.085156 0.084375
81 | v 0.000000 0.082813 0.010547
82 | v 0.000000 0.035156 -0.057422
83 | v 0.020313 -0.056250 -0.028125
84 | v -0.020313 -0.056250 -0.028125
85 | v 0.031250 -0.057031 -0.065625
86 | v -0.031250 -0.057031 -0.065625
87 | v 0.035156 -0.057031 -0.104297
88 | v -0.035156 -0.057031 -0.104297
89 | v 0.036719 -0.053125 -0.133594
90 | v -0.036719 -0.053125 -0.133594
91 | v 0.032813 -0.052344 -0.141797
92 | v -0.032813 -0.052344 -0.141797
93 | v 0.017969 -0.055469 -0.145313
94 | v -0.017969 -0.055469 -0.145313
95 | v 0.000000 -0.057812 -0.147656
96 | v 0.043750 -0.053125 -0.021094
97 | v -0.043750 -0.053125 -0.021094
98 | v 0.063281 -0.053906 -0.005859
99 | v -0.063281 -0.053906 -0.005859
100 | v 0.082813 -0.044531 0.022266
101 | v -0.082813 -0.044531 0.022266
102 | v 0.085938 -0.059375 0.064453
103 | v -0.085938 -0.059375 0.064453
104 | v 0.071094 -0.062500 0.072656
105 | v -0.071094 -0.062500 0.072656
106 | v 0.049219 -0.068750 0.090234
107 | v -0.049219 -0.068750 0.090234
108 | v 0.032031 -0.073438 0.113672
109 | v -0.032031 -0.073438 0.113672
110 | v 0.015625 -0.075781 0.107813
111 | v -0.015625 -0.075781 0.107813
112 | v 0.006250 -0.075000 0.073828
113 | v -0.006250 -0.075000 0.073828
114 | v 0.016406 -0.077344 0.062109
115 | v -0.016406 -0.077344 0.062109
116 | v 0.012500 -0.076563 0.045703
117 | v -0.012500 -0.076563 0.045703
118 | v 0.020313 -0.074219 0.014062
119 | v -0.020313 -0.074219 0.014062
120 | v 0.037500 -0.070312 0.002344
121 | v -0.037500 -0.070312 0.002344
122 | v 0.049219 -0.067188 0.009375
123 | v -0.049219 -0.067188 0.009375
124 | v 0.062500 -0.064844 0.028125
125 | v -0.062500 -0.064844 0.028125
126 | v 0.064062 -0.064844 0.044531
127 | v -0.064062 -0.064844 0.044531
128 | v 0.060156 -0.066406 0.056250
129 | v -0.060156 -0.066406 0.056250
130 | v 0.042969 -0.071875 0.065625
131 | v -0.042969 -0.071875 0.065625
132 | v 0.025000 -0.075781 0.070312
133 | v -0.025000 -0.075781 0.070312
134 | v 0.000000 -0.073437 -0.114844
135 | v 0.010937 -0.073437 -0.107813
136 | v -0.010937 -0.073437 -0.107813
137 | v 0.011719 -0.071094 -0.125391
138 | v -0.011719 -0.071094 -0.125391
139 | v 0.006250 -0.069531 -0.132422
140 | v -0.006250 -0.069531 -0.132422
141 | v 0.000000 -0.068750 -0.133594
142 | v 0.000000 -0.075000 -0.029297
143 | v 0.000000 -0.074219 -0.021094
144 | v 0.010156 -0.074219 -0.022266
145 | v -0.010156 -0.074219 -0.022266
146 | v 0.012500 -0.075000 -0.033984
147 | v -0.012500 -0.075000 -0.033984
148 | v 0.008594 -0.074219 -0.043359
149 | v -0.008594 -0.074219 -0.043359
150 | v 0.039844 -0.067188 -0.007031
151 | v -0.039844 -0.067188 -0.007031
152 | v 0.061719 -0.062500 0.008203
153 | v -0.061719 -0.062500 0.008203
154 | v 0.072656 -0.060156 0.030469
155 | v -0.072656 -0.060156 0.030469
156 | v 0.074219 -0.065625 0.056250
157 | v -0.074219 -0.065625 0.056250
158 | v 0.068750 -0.072656 0.062109
159 | v -0.068750 -0.072656 0.062109
160 | v 0.043750 -0.079687 0.082031
161 | v -0.043750 -0.079687 0.082031
162 | v 0.031250 -0.083594 0.096094
163 | v -0.031250 -0.083594 0.096094
164 | v 0.020313 -0.085156 0.092578
165 | v -0.020313 -0.085156 0.092578
166 | v 0.010156 -0.084375 0.064453
167 | v -0.010156 -0.084375 0.064453
168 | v 0.012500 -0.081250 -0.015234
169 | v -0.012500 -0.081250 -0.015234
170 | v 0.021094 -0.071094 -0.066797
171 | v -0.021094 -0.071094 -0.066797
172 | v 0.025000 -0.068750 -0.105469
173 | v -0.025000 -0.068750 -0.105469
174 | v 0.026563 -0.066406 -0.123047
175 | v -0.026563 -0.066406 -0.123047
176 | v 0.023438 -0.063281 -0.137109
177 | v -0.023438 -0.063281 -0.137109
178 | v 0.016406 -0.063281 -0.139453
179 | v -0.016406 -0.063281 -0.139453
180 | v 0.000000 -0.064062 -0.141797
181 | v 0.000000 -0.072656 0.007031
182 | v 0.000000 -0.076563 0.031641
183 | v 0.032813 -0.074219 0.071484
184 | v -0.032813 -0.074219 0.071484
185 | v 0.016406 -0.075000 0.021094
186 | v -0.016406 -0.075000 0.021094
187 | v 0.013281 -0.075781 0.031641
188 | v -0.013281 -0.075781 0.031641
189 | v 0.011719 -0.073437 -0.103125
190 | v -0.011719 -0.073437 -0.103125
191 | v 0.007812 -0.075000 -0.066797
192 | v -0.007812 -0.075000 -0.066797
193 | v 0.000000 -0.075000 -0.066797
194 | v 0.000000 -0.074219 -0.049219
195 | v 0.009375 -0.078125 -0.041016
196 | v -0.009375 -0.078125 -0.041016
197 | v 0.013281 -0.079687 -0.033984
198 | v -0.013281 -0.079687 -0.033984
199 | v 0.010937 -0.078125 -0.019922
200 | v -0.010937 -0.078125 -0.019922
201 | v 0.003906 -0.078125 -0.018750
202 | v -0.003906 -0.078125 -0.018750
203 | v 0.000000 -0.082813 -0.030469
204 | v 0.004688 -0.081250 -0.022266
205 | v -0.004688 -0.081250 -0.022266
206 | v 0.009375 -0.081250 -0.023438
207 | v -0.009375 -0.081250 -0.023438
208 | v 0.010937 -0.082813 -0.033984
209 | v -0.010937 -0.082813 -0.033984
210 | v 0.007812 -0.080469 -0.037500
211 | v -0.007812 -0.080469 -0.037500
212 | v 0.000000 -0.080469 -0.043359
213 | v 0.025781 -0.055469 -0.046875
214 | v -0.025781 -0.055469 -0.046875
215 | v 0.016406 -0.071094 -0.036328
216 | v -0.016406 -0.071094 -0.036328
217 | v 0.017969 -0.071094 -0.046875
218 | v -0.017969 -0.071094 -0.046875
219 | v 0.023438 -0.055469 -0.037500
220 | v -0.023438 -0.055469 -0.037500
221 | v 0.000000 -0.068750 -0.131250
222 | v 0.004688 -0.068750 -0.130078
223 | v -0.004688 -0.068750 -0.130078
224 | v 0.009375 -0.071094 -0.123047
225 | v -0.009375 -0.071094 -0.123047
226 | v 0.009375 -0.072656 -0.111328
227 | v -0.009375 -0.072656 -0.111328
228 | v 0.000000 -0.065625 -0.117188
229 | v 0.009375 -0.066406 -0.112500
230 | v -0.009375 -0.066406 -0.112500
231 | v 0.009375 -0.064062 -0.121875
232 | v -0.009375 -0.064062 -0.121875
233 | v 0.004688 -0.063281 -0.127734
234 | v -0.004688 -0.063281 -0.127734
235 | v 0.000000 -0.063281 -0.128906
236 | v 0.017188 -0.078125 0.032812
237 | v -0.017188 -0.078125 0.032812
238 | v 0.018750 -0.077344 0.023437
239 | v -0.018750 -0.077344 0.023437
240 | v 0.033594 -0.075781 0.064453
241 | v -0.033594 -0.075781 0.064453
242 | v 0.027344 -0.077344 0.063281
243 | v -0.027344 -0.077344 0.063281
244 | v 0.042188 -0.077344 0.059766
245 | v -0.042188 -0.077344 0.059766
246 | v 0.056250 -0.069531 0.052734
247 | v -0.056250 -0.069531 0.052734
248 | v 0.058594 -0.068750 0.043359
249 | v -0.058594 -0.068750 0.043359
250 | v 0.057813 -0.067969 0.029297
251 | v -0.057813 -0.067969 0.029297
252 | v 0.047656 -0.071875 0.015234
253 | v -0.047656 -0.071875 0.015234
254 | v 0.037500 -0.074219 0.009375
255 | v -0.037500 -0.074219 0.009375
256 | v 0.022656 -0.078125 0.016406
257 | v -0.022656 -0.078125 0.016406
258 | v 0.017969 -0.078125 0.044531
259 | v -0.017969 -0.078125 0.044531
260 | v 0.021094 -0.078125 0.056250
261 | v -0.021094 -0.078125 0.056250
262 | v 0.023438 -0.075781 0.053906
263 | v -0.023438 -0.075781 0.053906
264 | v 0.019531 -0.075781 0.044531
265 | v -0.019531 -0.075781 0.044531
266 | v 0.024219 -0.075781 0.018750
267 | v -0.024219 -0.075781 0.018750
268 | v 0.037500 -0.072656 0.012891
269 | v -0.037500 -0.072656 0.012891
270 | v 0.046094 -0.070312 0.017578
271 | v -0.046094 -0.070312 0.017578
272 | v 0.054688 -0.067188 0.031641
273 | v -0.054688 -0.067188 0.031641
274 | v 0.055469 -0.067188 0.042187
275 | v -0.055469 -0.067188 0.042187
276 | v 0.053125 -0.067969 0.050391
277 | v -0.053125 -0.067969 0.050391
278 | v 0.041406 -0.075000 0.058594
279 | v -0.041406 -0.075000 0.058594
280 | v 0.028125 -0.076563 0.059766
281 | v -0.028125 -0.076563 0.059766
282 | v 0.033594 -0.075000 0.060937
283 | v -0.033594 -0.075000 0.060937
284 | v 0.020313 -0.075000 0.025781
285 | v -0.020313 -0.075000 0.025781
286 | v 0.019531 -0.075000 0.033984
287 | v -0.019531 -0.075000 0.033984
288 | v 0.010937 -0.060938 0.069141
289 | v -0.010937 -0.060938 0.069141
290 | v 0.019531 -0.061719 0.099609
291 | v -0.019531 -0.061719 0.099609
292 | v 0.033594 -0.059375 0.103125
293 | v -0.033594 -0.059375 0.103125
294 | v 0.048438 -0.055469 0.083203
295 | v -0.048438 -0.055469 0.083203
296 | v 0.067969 -0.049219 0.067969
297 | v -0.067969 -0.049219 0.067969
298 | v 0.079687 -0.046094 0.060937
299 | v -0.079687 -0.046094 0.060937
300 | v 0.077344 -0.037500 0.024609
301 | v -0.077344 -0.037500 0.024609
302 | v 0.060156 -0.041406 -0.000000
303 | v -0.060156 -0.041406 -0.000000
304 | v 0.043750 -0.046875 -0.014063
305 | v -0.043750 -0.046875 -0.014063
306 | v 0.000000 -0.028906 0.134766
307 | v 0.000000 0.007812 0.147656
308 | v 0.000000 0.067188 -0.029297
309 | v 0.000000 -0.018750 -0.069141
310 | v 0.000000 -0.046094 -0.146484
311 | v 0.000000 -0.034375 -0.120703
312 | v 0.000000 -0.032031 -0.085547
313 | v 0.000000 -0.028125 -0.072656
314 | v 0.085156 -0.005469 0.035156
315 | v -0.085156 -0.005469 0.035156
316 | v 0.085938 0.004687 0.048047
317 | v -0.085938 0.004687 0.048047
318 | v 0.077344 0.043750 0.039844
319 | v -0.077344 0.043750 0.039844
320 | v 0.046094 0.070312 0.065625
321 | v -0.046094 0.070312 0.065625
322 | v 0.073438 -0.007031 -0.007031
323 | v -0.073438 -0.007031 -0.007031
324 | v 0.059375 0.016406 -0.018750
325 | v -0.059375 0.016406 -0.018750
326 | v 0.064062 0.042969 -0.001172
327 | v -0.064062 0.042969 -0.001172
328 | v 0.033594 0.066406 0.008203
329 | v -0.033594 0.066406 0.008203
330 | v 0.023438 -0.040625 -0.052734
331 | v -0.023438 -0.040625 -0.052734
332 | v 0.017969 -0.025781 -0.062109
333 | v -0.017969 -0.025781 -0.062109
334 | v 0.028906 -0.038281 -0.106641
335 | v -0.028906 -0.038281 -0.106641
336 | v 0.025000 -0.039062 -0.075000
337 | v -0.025000 -0.039062 -0.075000
338 | v 0.032813 -0.039844 -0.137109
339 | v -0.032813 -0.039844 -0.137109
340 | v 0.014063 -0.036719 -0.113672
341 | v -0.014063 -0.036719 -0.113672
342 | v 0.012500 -0.035937 -0.080859
343 | v -0.012500 -0.035937 -0.080859
344 | v 0.016406 -0.043750 -0.141797
345 | v -0.016406 -0.043750 -0.141797
346 | v 0.021875 -0.042969 -0.042188
347 | v -0.021875 -0.042969 -0.042188
348 | v 0.021094 -0.046875 -0.033984
349 | v -0.021094 -0.046875 -0.033984
350 | v 0.020313 -0.050000 -0.025781
351 | v -0.020313 -0.050000 -0.025781
352 | v 0.021094 -0.016406 -0.058594
353 | v -0.021094 -0.016406 -0.058594
354 | v 0.029687 0.026563 -0.046875
355 | v -0.029687 0.026563 -0.046875
356 | v 0.034375 0.053906 -0.022266
357 | v -0.034375 0.053906 -0.022266
358 | v 0.045313 0.038281 0.130078
359 | v -0.045313 0.038281 0.130078
360 | v 0.045313 0.007031 0.139453
361 | v -0.045313 0.007031 0.139453
362 | v 0.045313 -0.023438 0.127734
363 | v -0.045313 -0.023438 0.127734
364 | v 0.046094 -0.042969 0.078516
365 | v -0.046094 -0.042969 0.078516
366 | v 0.072656 -0.033594 0.060938
367 | v -0.072656 -0.033594 0.060938
368 | v 0.063281 -0.028125 0.067969
369 | v -0.063281 -0.028125 0.067969
370 | v 0.064062 -0.005469 0.105469
371 | v -0.064062 -0.005469 0.105469
372 | v 0.079687 -0.012500 0.084375
373 | v -0.079687 -0.012500 0.084375
374 | v 0.079687 0.011719 0.092578
375 | v -0.079687 0.011719 0.092578
376 | v 0.064062 0.019531 0.112500
377 | v -0.064062 0.019531 0.112500
378 | v 0.064062 0.044531 0.101953
379 | v -0.064062 0.044531 0.101953
380 | v 0.079687 0.035937 0.080859
381 | v -0.079687 0.035937 0.080859
382 | v 0.061719 0.058594 0.049219
383 | v -0.061719 0.058594 0.049219
384 | v 0.048438 0.054688 0.003516
385 | v -0.048438 0.054688 0.003516
386 | v 0.082031 0.020312 0.049219
387 | v -0.082031 0.020312 0.049219
388 | v 0.040625 -0.014844 -0.025781
389 | v -0.040625 -0.014844 -0.025781
390 | v 0.042969 0.021094 -0.029297
391 | v -0.042969 0.021094 -0.029297
392 | v 0.089063 0.023437 0.060938
393 | v -0.089063 0.023437 0.060938
394 | v 0.077344 0.012500 -0.021094
395 | v -0.077344 0.012500 -0.021094
396 | v 0.103906 0.032813 -0.015234
397 | v -0.103906 0.032813 -0.015234
398 | v 0.128125 0.042969 0.008203
399 | v -0.128125 0.042969 0.008203
400 | v 0.135156 0.042187 0.048047
401 | v -0.135156 0.042187 0.048047
402 | v 0.123438 0.042187 0.076172
403 | v -0.123438 0.042187 0.076172
404 | v 0.102344 0.031250 0.071484
405 | v -0.102344 0.031250 0.071484
406 | v 0.101562 0.028906 0.062109
407 | v -0.101562 0.028906 0.062109
408 | v 0.118750 0.039062 0.065625
409 | v -0.118750 0.039062 0.065625
410 | v 0.126563 0.040625 0.043359
411 | v -0.126563 0.040625 0.043359
412 | v 0.121094 0.040625 0.011719
413 | v -0.121094 0.040625 0.011719
414 | v 0.103125 0.030469 -0.005859
415 | v -0.103125 0.030469 -0.005859
416 | v 0.082813 0.013281 -0.010547
417 | v -0.082813 0.013281 -0.010547
418 | v 0.092188 0.021875 0.053906
419 | v -0.092188 0.021875 0.053906
420 | v 0.094531 0.028906 0.045703
421 | v -0.094531 0.028906 0.045703
422 | v 0.088281 0.021094 -0.003516
423 | v -0.088281 0.021094 -0.003516
424 | v 0.103906 0.036719 0.000000
425 | v -0.103906 0.036719 0.000000
426 | v 0.118750 0.044531 0.014063
427 | v -0.118750 0.044531 0.014063
428 | v 0.123438 0.044531 0.037500
429 | v -0.123438 0.044531 0.037500
430 | v 0.117188 0.043750 0.053906
431 | v -0.117188 0.043750 0.053906
432 | v 0.102344 0.035937 0.051563
433 | v -0.102344 0.035937 0.051563
434 | v 0.084375 0.021094 0.043359
435 | v -0.084375 0.021094 0.043359
436 | v 0.083594 0.027344 0.025781
437 | v -0.083594 0.027344 0.025781
438 | v 0.075781 0.027344 0.014063
439 | v -0.075781 0.027344 0.014063
440 | v 0.082031 0.027344 0.012891
441 | v -0.082031 0.027344 0.012891
442 | v 0.084375 0.027344 0.002344
443 | v -0.084375 0.027344 0.002344
444 | v 0.081250 0.027344 -0.002344
445 | v -0.081250 0.027344 -0.002344
446 | v 0.072656 0.007031 0.000000
447 | v -0.072656 0.007031 0.000000
448 | v 0.071875 0.017188 -0.003516
449 | v -0.071875 0.017188 -0.003516
450 | v 0.071875 0.018750 0.005859
451 | v -0.071875 0.018750 0.005859
452 | v 0.079687 0.021094 0.030469
453 | v -0.079687 0.021094 0.030469
454 | v 0.089063 0.026562 0.036328
455 | v -0.089063 0.026562 0.036328
456 | v 0.089063 0.032031 0.035156
457 | v -0.089063 0.032031 0.035156
458 | v 0.081250 0.032031 -0.002344
459 | v -0.081250 0.032031 -0.002344
460 | v 0.085156 0.032031 0.002344
461 | v -0.085156 0.032031 0.002344
462 | v 0.082813 0.032031 0.011719
463 | v -0.082813 0.032031 0.011719
464 | v 0.076563 0.032031 0.014063
465 | v -0.076563 0.032031 0.014063
466 | v 0.084375 0.032031 0.025781
467 | v -0.084375 0.032031 0.025781
468 | v 0.103906 0.041406 0.049219
469 | v -0.103906 0.041406 0.049219
470 | v 0.118750 0.048437 0.051563
471 | v -0.118750 0.048437 0.051563
472 | v 0.125781 0.049219 0.036328
473 | v -0.125781 0.049219 0.036328
474 | v 0.121094 0.048438 0.012891
475 | v -0.121094 0.048438 0.012891
476 | v 0.104688 0.042188 0.000000
477 | v -0.104688 0.042188 0.000000
478 | v 0.088281 0.026563 -0.002344
479 | v -0.088281 0.026563 -0.002344
480 | v 0.095312 0.034375 0.043359
481 | v -0.095312 0.034375 0.043359
482 | v 0.089063 0.032813 0.016406
483 | v -0.089063 0.032813 0.016406
484 | v 0.093750 0.033594 0.009375
485 | v -0.093750 0.033594 0.009375
486 | v 0.100000 0.036719 0.018750
487 | v -0.100000 0.036719 0.018750
488 | v 0.096094 0.035156 0.025781
489 | v -0.096094 0.035156 0.025781
490 | v 0.101562 0.037500 0.035156
491 | v -0.101562 0.037500 0.035156
492 | v 0.105469 0.038281 0.028125
493 | v -0.105469 0.038281 0.028125
494 | v 0.110937 0.039062 0.031641
495 | v -0.110937 0.039062 0.031641
496 | v 0.108594 0.039062 0.041016
497 | v -0.108594 0.039062 0.041016
498 | v 0.102344 0.048437 0.065625
499 | v -0.102344 0.048437 0.065625
500 | v 0.125000 0.054687 0.070312
501 | v -0.125000 0.054687 0.070312
502 | v 0.136719 0.050000 0.044531
503 | v -0.136719 0.050000 0.044531
504 | v 0.131250 0.053125 0.008203
505 | v -0.131250 0.053125 0.008203
506 | v 0.103906 0.049219 -0.012891
507 | v -0.103906 0.049219 -0.012891
508 | v 0.078906 0.032813 -0.018750
509 | v -0.078906 0.032813 -0.018750
510 | v 0.085938 0.038281 0.057422
511 | v -0.085938 0.038281 0.057422
512 | vt 0.890955 0.590063
513 | vt 0.870622 0.589649
514 | vt 0.860081 0.560115
515 | vt 0.904571 0.559404
516 | vt 0.856226 0.850547
517 | vt 0.868067 0.821510
518 | vt 0.888398 0.821999
519 | vt 0.900640 0.853232
520 | vt 0.853018 0.521562
521 | vt 0.920166 0.524546
522 | vt 0.847458 0.888748
523 | vt 0.914672 0.888748
524 | vt 0.828900 0.590771
525 | vt 0.798481 0.569535
526 | vt 0.795104 0.838402
527 | vt 0.826436 0.818537
528 | vt 0.854402 0.604754
529 | vt 0.852534 0.805700
530 | vt 0.854107 0.625459
531 | vt 0.828171 0.633354
532 | vt 0.827598 0.775964
533 | vt 0.853157 0.785002
534 | vt 0.791018 0.645443
535 | vt 0.791018 0.762238
536 | vt 0.855181 0.668527
537 | vt 0.842358 0.702491
538 | vt 0.844839 0.707525
539 | vt 0.856142 0.742025
540 | vt 0.867508 0.642291
541 | vt 0.867293 0.768782
542 | vt 0.890474 0.641909
543 | vt 0.900375 0.666964
544 | vt 0.901223 0.745592
545 | vt 0.890219 0.770183
546 | vt 0.918898 0.699697
547 | vt 0.921180 0.713713
548 | vt 0.931889 0.636832
549 | vt 0.968392 0.645333
550 | vt 0.968213 0.770220
551 | vt 0.931368 0.777093
552 | vt 0.905882 0.627902
553 | vt 0.904990 0.784860
554 | vt 0.906232 0.605742
555 | vt 0.933717 0.593037
556 | vt 0.931250 0.820926
557 | vt 0.904357 0.807013
558 | vt 0.968392 0.573812
559 | vt 0.965038 0.841671
560 | vt 0.902359 0.607909
561 | vt 0.889591 0.593275
562 | vt 0.900583 0.804677
563 | vt 0.887178 0.818729
564 | vt 0.899781 0.626257
565 | vt 0.898822 0.786233
566 | vt 0.887842 0.636527
567 | vt 0.887351 0.775442
568 | vt 0.870908 0.635245
569 | vt 0.870376 0.775972
570 | vt 0.859881 0.623942
571 | vt 0.858859 0.786774
572 | vt 0.859664 0.608186
573 | vt 0.857942 0.802505
574 | vt 0.871664 0.593961
575 | vt 0.869299 0.817249
576 | vt 0.879400 0.616512
577 | vt 0.878029 0.795063
578 | vt 0.540260 0.053805
579 | vt 0.536419 0.062072
580 | vt 0.518925 0.059681
581 | vt 0.518916 0.050294
582 | vt 0.501452 0.062043
583 | vt 0.497626 0.053770
584 | vt 0.551930 0.058338
585 | vt 0.542788 0.064089
586 | vt 0.495083 0.064047
587 | vt 0.485955 0.058273
588 | vt 0.555073 0.061900
589 | vt 0.546290 0.072669
590 | vt 0.491565 0.072625
591 | vt 0.482805 0.061829
592 | vt 0.563812 0.076586
593 | vt 0.548333 0.084893
594 | vt 0.489507 0.084858
595 | vt 0.474014 0.076511
596 | vt 0.583135 0.108495
597 | vt 0.555621 0.121749
598 | vt 0.482177 0.121781
599 | vt 0.454527 0.108481
600 | vt 0.605512 0.165134
601 | vt 0.647395 0.200502
602 | vt 0.621513 0.227818
603 | vt 0.553118 0.209599
604 | vt 0.416514 0.229490
605 | vt 0.389677 0.201890
606 | vt 0.432024 0.165644
607 | vt 0.485339 0.210053
608 | vt 0.676379 0.233241
609 | vt 0.664761 0.253225
610 | vt 0.372747 0.256357
611 | vt 0.360308 0.235899
612 | vt 0.715342 0.265392
613 | vt 0.683908 0.279995
614 | vt 0.353696 0.284606
615 | vt 0.320452 0.270303
616 | vt 0.707254 0.310054
617 | vt 0.687515 0.311539
618 | vt 0.351187 0.317440
619 | vt 0.330721 0.316853
620 | vt 0.697446 0.332673
621 | vt 0.676824 0.323937
622 | vt 0.362723 0.329722
623 | vt 0.341964 0.339667
624 | vt 0.662817 0.372521
625 | vt 0.639050 0.357330
626 | vt 0.402772 0.362131
627 | vt 0.379297 0.378686
628 | vt 0.626842 0.395792
629 | vt 0.618316 0.375151
630 | vt 0.424583 0.379267
631 | vt 0.416915 0.400552
632 | vt 0.604826 0.397804
633 | vt 0.600808 0.377857
634 | vt 0.442396 0.381222
635 | vt 0.439252 0.401540
636 | vt 0.553095 0.390512
637 | vt 0.559674 0.357011
638 | vt 0.482938 0.358497
639 | vt 0.490934 0.391862
640 | vt 0.521923 0.386009
641 | vt 0.521086 0.343868
642 | vt 0.577279 0.340156
643 | vt 0.599845 0.344815
644 | vt 0.441977 0.347815
645 | vt 0.464579 0.342230
646 | vt 0.615546 0.342005
647 | vt 0.425972 0.345582
648 | vt 0.634472 0.332311
649 | vt 0.406362 0.336480
650 | vt 0.662406 0.312804
651 | vt 0.377061 0.317685
652 | vt 0.668440 0.297958
653 | vt 0.370304 0.302644
654 | vt 0.664101 0.277872
655 | vt 0.374100 0.281778
656 | vt 0.639236 0.253047
657 | vt 0.398938 0.255633
658 | vt 0.613992 0.242662
659 | vt 0.424464 0.244473
660 | vt 0.572941 0.258564
661 | vt 0.466409 0.259709
662 | vt 0.563905 0.272007
663 | vt 0.519760 0.248864
664 | vt 0.475886 0.273078
665 | vt 0.558527 0.316594
666 | vt 0.482619 0.317843
667 | vt 0.520277 0.294764
668 | vt 0.556923 0.291214
669 | vt 0.483433 0.292249
670 | vt 0.525483 0.068967
671 | vt 0.518928 0.067899
672 | vt 0.512375 0.068956
673 | vt 0.531231 0.073829
674 | vt 0.506626 0.073811
675 | vt 0.531019 0.087431
676 | vt 0.506827 0.087416
677 | vt 0.532042 0.127713
678 | vt 0.532669 0.090920
679 | vt 0.505177 0.090908
680 | vt 0.505828 0.127728
681 | vt 0.538112 0.158382
682 | vt 0.518981 0.151749
683 | vt 0.518941 0.128358
684 | vt 0.499851 0.158434
685 | vt 0.518925 0.093952
686 | vt 0.518927 0.085180
687 | vt 0.548362 0.173560
688 | vt 0.537959 0.175966
689 | vt 0.535214 0.166808
690 | vt 0.502799 0.166857
691 | vt 0.500100 0.176033
692 | vt 0.489683 0.173693
693 | vt 0.544281 0.193366
694 | vt 0.537248 0.187577
695 | vt 0.500890 0.187571
696 | vt 0.493996 0.193428
697 | vt 0.519841 0.200843
698 | vt 0.528757 0.191785
699 | vt 0.509219 0.191626
700 | vt 0.517577 0.190607
701 | vt 0.519132 0.185382
702 | vt 0.518998 0.159028
703 | vt 0.531131 0.171631
704 | vt 0.519016 0.165599
705 | vt 0.506910 0.171667
706 | vt 0.519099 0.179457
707 | vt 0.528222 0.186316
708 | vt 0.509787 0.186260
709 | vt 0.533528 0.184215
710 | vt 0.504547 0.184206
711 | vt 0.533449 0.176739
712 | vt 0.504604 0.176791
713 | vt 0.561572 0.167779
714 | vt 0.476363 0.167996
715 | vt 0.559475 0.149319
716 | vt 0.478371 0.149447
717 | vt 0.596138 0.133426
718 | vt 0.441395 0.133592
719 | vt 0.601169 0.147885
720 | vt 0.436337 0.148194
721 | vt 0.518925 0.083865
722 | vt 0.528933 0.084957
723 | vt 0.508915 0.084945
724 | vt 0.529036 0.075429
725 | vt 0.508820 0.075415
726 | vt 0.523751 0.070508
727 | vt 0.514106 0.070501
728 | vt 0.518929 0.069468
729 | vt 0.521560 0.074970
730 | vt 0.518928 0.074259
731 | vt 0.516297 0.074966
732 | vt 0.524236 0.076691
733 | vt 0.513619 0.076684
734 | vt 0.524601 0.079886
735 | vt 0.513252 0.079879
736 | vt 0.518926 0.079331
737 | vt 0.571787 0.277295
738 | vt 0.568351 0.292904
739 | vt 0.468070 0.278617
740 | vt 0.471978 0.294282
741 | vt 0.573085 0.311386
742 | vt 0.467790 0.313081
743 | vt 0.584855 0.327708
744 | vt 0.456477 0.329961
745 | vt 0.580734 0.266620
746 | vt 0.458737 0.268049
747 | vt 0.611720 0.255725
748 | vt 0.427062 0.257728
749 | vt 0.632494 0.262853
750 | vt 0.406068 0.265508
751 | vt 0.653658 0.279971
752 | vt 0.384904 0.283634
753 | vt 0.656064 0.297636
754 | vt 0.383015 0.301864
755 | vt 0.652752 0.310186
756 | vt 0.386858 0.314615
757 | vt 0.629040 0.323864
758 | vt 0.411556 0.327673
759 | vt 0.614408 0.331972
760 | vt 0.426727 0.335361
761 | vt 0.601033 0.333624
762 | vt 0.440344 0.336537
763 | vt 0.590644 0.321516
764 | vt 0.601799 0.328453
765 | vt 0.450408 0.323919
766 | vt 0.439372 0.331331
767 | vt 0.613335 0.327083
768 | vt 0.427623 0.330358
769 | vt 0.626851 0.320513
770 | vt 0.413648 0.324175
771 | vt 0.646248 0.306421
772 | vt 0.393381 0.310510
773 | vt 0.649541 0.296225
774 | vt 0.389662 0.300183
775 | vt 0.647785 0.283486
776 | vt 0.391040 0.287071
777 | vt 0.629829 0.267263
778 | vt 0.408893 0.269959
779 | vt 0.612641 0.261560
780 | vt 0.426254 0.263693
781 | vt 0.585166 0.270991
782 | vt 0.454369 0.272583
783 | vt 0.578124 0.281900
784 | vt 0.461798 0.283441
785 | vt 0.579548 0.309340
786 | vt 0.461204 0.311233
787 | vt 0.577524 0.293776
788 | vt 0.462754 0.295432
789 | vt 0.553209 0.433063
790 | vt 0.523031 0.433628
791 | vt 0.492809 0.434538
792 | vt 0.609819 0.431516
793 | vt 0.435860 0.435740
794 | vt 0.648174 0.419316
795 | vt 0.396518 0.425416
796 | vt 0.692106 0.388274
797 | vt 0.350292 0.396229
798 | vt 0.726332 0.341754
799 | vt 0.312756 0.350588
800 | vt 0.735879 0.312112
801 | vt 0.301067 0.320593
802 | vt 0.729900 0.256393
803 | vt 0.304876 0.261087
804 | vt 0.698172 0.216906
805 | vt 0.337414 0.219179
806 | vt 0.663103 0.190671
807 | vt 0.373474 0.191872
808 | vt 0.626908 0.015608
809 | vt 0.649444 0.022378
810 | vt 0.660451 0.076084
811 | vt 0.621440 0.048089
812 | vt 0.376796 0.075296
813 | vt 0.388827 0.021586
814 | vt 0.411318 0.015131
815 | vt 0.416419 0.047631
816 | vt 0.567460 0.000144
817 | vt 0.577206 0.032801
818 | vt 0.470636 0.000144
819 | vt 0.460782 0.032656
820 | vt 0.518922 0.024886
821 | vt 0.547413 0.041724
822 | vt 0.490511 0.041669
823 | vt 0.558059 0.053871
824 | vt 0.479842 0.053785
825 | vt 0.576951 0.057998
826 | vt 0.460920 0.057845
827 | vt 0.611687 0.078268
828 | vt 0.425932 0.077985
829 | vt 0.626663 0.111357
830 | vt 0.410618 0.111244
831 | vt 0.629482 0.130456
832 | vt 0.623495 0.146796
833 | vt 0.413741 0.147158
834 | vt 0.407648 0.130594
835 | vt 0.619303 0.159841
836 | vt 0.418035 0.160361
837 | vt 0.945900 0.079569
838 | vt 0.886245 0.121777
839 | vt 0.849114 0.099732
840 | vt 0.891780 0.036916
841 | vt 0.183115 0.092127
842 | vt 0.141314 0.112482
843 | vt 0.078961 0.060719
844 | vt 0.142277 0.021467
845 | vt 0.788458 0.080826
846 | vt 0.805584 0.010786
847 | vt 0.246353 0.076510
848 | vt 0.232648 0.003484
849 | vt 0.687018 0.077204
850 | vt 0.672384 0.022201
851 | vt 0.349875 0.075955
852 | vt 0.365979 0.020991
853 | vt 0.760215 0.193244
854 | vt 0.789046 0.233323
855 | vt 0.271553 0.193871
856 | vt 0.241255 0.236977
857 | vt 0.994525 0.167705
858 | vt 0.909112 0.183261
859 | vt 0.107928 0.179083
860 | vt 0.011829 0.155367
861 | vt 0.911671 0.402429
862 | vt 0.862868 0.338556
863 | vt 0.894128 0.301884
864 | vt 0.962901 0.344752
865 | vt 0.123776 0.315519
866 | vt 0.160557 0.356821
867 | vt 0.106400 0.432652
868 | vt 0.043968 0.367038
869 | vt 0.915360 0.259804
870 | vt 0.999856 0.254640
871 | vt 0.098965 0.266968
872 | vt 0.000144 0.259113
873 | vt 0.749542 0.334683
874 | vt 0.766337 0.300809
875 | vt 0.789162 0.313727
876 | vt 0.267408 0.310142
877 | vt 0.288183 0.346496
878 | vt 0.242992 0.325552
879 | vt 0.815314 0.276388
880 | vt 0.846174 0.293397
881 | vt 0.213065 0.285164
882 | vt 0.178537 0.304983
883 | vt 0.845007 0.256352
884 | vt 0.873517 0.265922
885 | vt 0.179662 0.263312
886 | vt 0.147089 0.274284
887 | vt 0.859075 0.228168
888 | vt 0.886999 0.233769
889 | vt 0.162803 0.231720
890 | vt 0.131514 0.237587
891 | vt 0.842355 0.195160
892 | vt 0.875030 0.184705
893 | vt 0.145224 0.182749
894 | vt 0.176788 0.196179
895 | vt 0.794286 0.364062
896 | vt 0.239776 0.382592
897 | vt 0.770185 0.379538
898 | vt 0.268122 0.398737
899 | vt 0.845499 0.449967
900 | vt 0.185281 0.484099
901 | vt 0.815858 0.445381
902 | vt 0.770572 0.444261
903 | vt 0.755700 0.418603
904 | vt 0.287033 0.442912
905 | vt 0.271364 0.473316
906 | vt 0.219260 0.477186
907 | vt 0.819845 0.468071
908 | vt 0.215894 0.503605
909 | vt 0.809631 0.233887
910 | vt 0.219168 0.237388
911 | vt 0.829287 0.219562
912 | vt 0.199067 0.222464
913 | vt 0.786480 0.117591
914 | vt 0.715482 0.139727
915 | vt 0.246666 0.114850
916 | vt 0.319538 0.139409
917 | vt 0.785486 0.152330
918 | vt 0.245969 0.151002
919 | vt 0.837382 0.156361
920 | vt 0.858171 0.137775
921 | vt 0.171653 0.132294
922 | vt 0.196622 0.155241
923 | vt 0.506166 0.904851
924 | vt 0.432388 0.894943
925 | vt 0.438797 0.870229
926 | vt 0.491058 0.881714
927 | vt 0.315867 0.868209
928 | vt 0.321637 0.893225
929 | vt 0.247207 0.901159
930 | vt 0.263032 0.878321
931 | vt 0.572792 0.860484
932 | vt 0.604825 0.879946
933 | vt 0.181486 0.854693
934 | vt 0.148729 0.873349
935 | vt 0.586396 0.793977
936 | vt 0.619962 0.791615
937 | vt 0.169745 0.787474
938 | vt 0.136063 0.784093
939 | vt 0.549027 0.746412
940 | vt 0.563786 0.739211
941 | vt 0.208656 0.740879
942 | vt 0.194086 0.733241
943 | vt 0.500314 0.711729
944 | vt 0.508270 0.697693
945 | vt 0.258399 0.707497
946 | vt 0.250811 0.693249
947 | vt 0.438641 0.680683
948 | vt 0.434803 0.658882
949 | vt 0.320962 0.677959
950 | vt 0.325318 0.656224
951 | vt 0.505666 0.730944
952 | vt 0.452955 0.700023
953 | vt 0.306136 0.696976
954 | vt 0.252524 0.726592
955 | vt 0.542850 0.755753
956 | vt 0.214575 0.750414
957 | vt 0.568148 0.787367
958 | vt 0.188269 0.781375
959 | vt 0.555495 0.826352
960 | vt 0.199850 0.820889
961 | vt 0.501231 0.844356
962 | vt 0.253846 0.840502
963 | vt 0.457832 0.840040
964 | vt 0.297562 0.837358
965 | vt 0.796021 0.176969
966 | vt 0.783193 0.187449
967 | vt 0.233625 0.175620
968 | vt 0.246955 0.187075
969 | vt 0.391039 0.611891
970 | vt 0.394766 0.686125
971 | vt 0.369913 0.610196
972 | vt 0.364838 0.684445
973 | vt 0.391747 0.862097
974 | vt 0.401605 0.841460
975 | vt 0.354026 0.840297
976 | vt 0.363377 0.861308
977 | vt 0.435018 0.718280
978 | vt 0.323658 0.715731
979 | vt 0.433669 0.729661
980 | vt 0.384658 0.710299
981 | vt 0.374400 0.708969
982 | vt 0.324726 0.727177
983 | vt 0.410995 0.747662
984 | vt 0.427812 0.742828
985 | vt 0.347028 0.745816
986 | vt 0.330270 0.740536
987 | vt 0.418086 0.784946
988 | vt 0.384657 0.795423
989 | vt 0.372270 0.794472
990 | vt 0.338952 0.783073
991 | vt 0.431333 0.817535
992 | vt 0.324790 0.815460
993 | vt 0.816266 0.203086
994 | vt 0.825107 0.209762
995 | vt 0.199767 0.214827
996 | vt 0.209828 0.206161
997 | vt 0.802192 0.184609
998 | vt 0.226485 0.183086
999 | vt 0.448505 0.804621
1000 | vt 0.473386 0.824700
1001 | vt 0.307886 0.802031
1002 | vt 0.282357 0.821525
1003 | vt 0.435868 0.779569
1004 | vt 0.321237 0.777208
1005 | vt 0.423718 0.754191
1006 | vt 0.334089 0.752045
1007 | vt 0.437950 0.749777
1008 | vt 0.319919 0.747250
1009 | vt 0.445392 0.731997
1010 | vt 0.312907 0.729222
1011 | vt 0.440995 0.724383
1012 | vt 0.317510 0.721697
1013 | vt 0.455277 0.713731
1014 | vt 0.303460 0.710657
1015 | vt 0.512485 0.828811
1016 | vt 0.242975 0.824574
1017 | vt 0.550942 0.811814
1018 | vt 0.204839 0.806417
1019 | vt 0.552139 0.787682
1020 | vt 0.204331 0.782156
1021 | vt 0.539407 0.764539
1022 | vt 0.217774 0.759319
1023 | vt 0.508439 0.743135
1024 | vt 0.249419 0.738732
1025 | vt 0.470841 0.748408
1026 | vt 0.454776 0.761665
1027 | vt 0.286960 0.745020
1028 | vt 0.302729 0.758742
1029 | vt 0.488870 0.770464
1030 | vt 0.475403 0.783904
1031 | vt 0.268291 0.766661
1032 | vt 0.281439 0.780511
1033 | vt 0.503673 0.787562
1034 | vt 0.494476 0.802470
1035 | vt 0.252972 0.783410
1036 | vt 0.261790 0.798626
1037 | vt 0.518562 0.791602
1038 | vt 0.516802 0.807339
1039 | vt 0.237920 0.787045
1040 | vt 0.239243 0.802891
1041 | vt 0.484068 0.628776
1042 | vt 0.543385 0.683538
1043 | vt 0.276936 0.625067
1044 | vt 0.216123 0.678120
1045 | vt 0.581052 0.726933
1046 | vt 0.177176 0.720426
1047 | vt 0.616701 0.759965
1048 | vt 0.140379 0.752377
1049 | vt 0.707492 0.759884
1050 | vt 0.660647 0.741167
1051 | vt 0.049526 0.748824
1052 | vt 0.097038 0.732052
1053 | vt 0.745511 0.652100
1054 | vt 0.677256 0.670436
1055 | vt 0.019409 0.639749
1056 | vt 0.083564 0.662038
1057 | vt 0.740843 0.572428
1058 | vt 0.671403 0.592656
1059 | vt 0.033664 0.564403
1060 | vt 0.092820 0.589862
1061 | vt 0.834578 0.206879
1062 | vt 0.834705 0.206959
1063 | vt 0.051216 0.522659
1064 | vt 0.145041 0.562595
1065 | vt 0.620420 0.565675
1066 | vt 0.498072 0.552315
1067 | vt 0.264218 0.550140
1068 | vn 0.6726 -0.7276 -0.1354
1069 | vn -0.6726 -0.7276 -0.1354
1070 | vn 0.8515 -0.4814 -0.2078
1071 | vn -0.8515 -0.4814 -0.2078
1072 | vn 0.5153 -0.5517 -0.6558
1073 | vn -0.5153 -0.5517 -0.6558
1074 | vn 0.3890 -0.8451 -0.3667
1075 | vn -0.3890 -0.8451 -0.3667
1076 | vn -0.0859 -0.9156 -0.3928
1077 | vn 0.0859 -0.9156 -0.3928
1078 | vn -0.3461 -0.6015 -0.7200
1079 | vn 0.3461 -0.6015 -0.7200
1080 | vn -0.7959 -0.5597 -0.2308
1081 | vn 0.7959 -0.5597 -0.2308
1082 | vn -0.4739 -0.8708 -0.1307
1083 | vn 0.4739 -0.8708 -0.1307
1084 | vn -0.4816 -0.8669 0.1284
1085 | vn 0.4816 -0.8669 0.1284
1086 | vn -0.7910 -0.5692 0.2243
1087 | vn 0.7910 -0.5692 0.2243
1088 | vn -0.3177 -0.6534 0.6871
1089 | vn 0.3177 -0.6534 0.6871
1090 | vn -0.1049 -0.9017 0.4194
1091 | vn 0.1049 -0.9017 0.4194
1092 | vn 0.4002 -0.8290 0.3907
1093 | vn -0.4002 -0.8290 0.3907
1094 | vn 0.5047 -0.5971 0.6235
1095 | vn -0.5047 -0.5971 0.6235
1096 | vn 0.8485 -0.4891 0.2018
1097 | vn -0.8485 -0.4891 0.2018
1098 | vn 0.6787 -0.7223 0.1328
1099 | vn -0.6787 -0.7223 0.1328
1100 | vn 0.8359 0.5015 0.2229
1101 | vn -0.8359 0.5015 0.2229
1102 | vn 0.2593 0.6742 0.6915
1103 | vn -0.2593 0.6742 0.6915
1104 | vn -0.5193 0.5665 0.6399
1105 | vn 0.5193 0.5665 0.6399
1106 | vn -0.8489 0.4798 0.2215
1107 | vn 0.8489 0.4798 0.2215
1108 | vn -0.8427 0.4815 -0.2408
1109 | vn 0.8427 0.4815 -0.2408
1110 | vn -0.5193 0.5665 -0.6399
1111 | vn 0.5193 0.5665 -0.6399
1112 | vn 0.2593 0.6742 -0.6915
1113 | vn -0.2593 0.6742 -0.6915
1114 | vn 0.8283 0.5051 -0.2424
1115 | vn -0.8283 0.5051 -0.2424
1116 | vn 0.4005 -0.9154 -0.0416
1117 | vn -0.4005 -0.9154 -0.0416
1118 | vn 0.3096 -0.9435 -0.1179
1119 | vn -0.3096 -0.9435 -0.1179
1120 | vn 0.0954 -0.9878 -0.1235
1121 | vn -0.0954 -0.9878 -0.1235
1122 | vn -0.0624 -0.9979 -0.0189
1123 | vn 0.0624 -0.9979 -0.0189
1124 | vn -0.0624 -0.9979 0.0173
1125 | vn 0.0624 -0.9979 0.0173
1126 | vn 0.1004 -0.9881 0.1163
1127 | vn -0.1004 -0.9881 0.1163
1128 | vn 0.3059 -0.9455 0.1112
1129 | vn -0.3059 -0.9455 0.1112
1130 | vn 0.4005 -0.9155 0.0381
1131 | vn -0.4005 -0.9155 0.0381
1132 | vn 0.1606 -0.6423 -0.7494
1133 | vn -0.1606 -0.6423 -0.7494
1134 | vn 0.2864 -0.5912 -0.7540
1135 | vn -0.2864 -0.5912 -0.7540
1136 | vn 0.6274 -0.7088 -0.3225
1137 | vn -0.6274 -0.7088 -0.3225
1138 | vn 0.7694 -0.6378 -0.0337
1139 | vn -0.7694 -0.6378 -0.0337
1140 | vn 0.7814 -0.6211 0.0601
1141 | vn -0.7814 -0.6211 0.0601
1142 | vn 0.4092 -0.5982 -0.6890
1143 | vn -0.4092 -0.5982 -0.6890
1144 | vn 0.4437 -0.7381 -0.5083
1145 | vn -0.4437 -0.7381 -0.5083
1146 | vn 0.7258 -0.6218 -0.2943
1147 | vn -0.7258 -0.6218 -0.2943
1148 | vn 0.6843 -0.6843 -0.2517
1149 | vn -0.6843 -0.6843 -0.2517
1150 | vn 0.5687 -0.7813 0.2571
1151 | vn -0.5687 -0.7813 0.2571
1152 | vn 0.5780 -0.6512 0.4918
1153 | vn -0.5780 -0.6512 0.4918
1154 | vn 0.6602 -0.6518 0.3733
1155 | vn -0.6602 -0.6518 0.3733
1156 | vn -0.0506 -0.8608 0.5064
1157 | vn 0.0506 -0.8608 0.5064
1158 | vn -0.7460 -0.6290 0.2188
1159 | vn 0.7460 -0.6290 0.2188
1160 | vn -0.6460 -0.6460 0.4067
1161 | vn 0.6460 -0.6460 0.4067
1162 | vn 0.5604 -0.7822 -0.2724
1163 | vn -0.5604 -0.7822 -0.2724
1164 | vn 0.2356 -0.9128 -0.3337
1165 | vn -0.2356 -0.9128 -0.3337
1166 | vn -0.0865 -0.9183 -0.3864
1167 | vn 0.0865 -0.9183 -0.3864
1168 | vn -0.0946 -0.8592 -0.5028
1169 | vn 0.0946 -0.8592 -0.5028
1170 | vn 0.0504 -0.9076 -0.4168
1171 | vn -0.0504 -0.9076 -0.4168
1172 | vn 0.2820 -0.9486 -0.1439
1173 | vn -0.2820 -0.9486 -0.1439
1174 | vn 0.3849 -0.9148 -0.1227
1175 | vn -0.3849 -0.9148 -0.1227
1176 | vn 0.3437 -0.9183 -0.1964
1177 | vn -0.3437 -0.9183 -0.1964
1178 | vn 0.3766 -0.9255 0.0402
1179 | vn -0.3766 -0.9255 0.0402
1180 | vn -0.1380 -0.9735 0.1823
1181 | vn 0.1380 -0.9735 0.1823
1182 | vn 0.4184 -0.8558 -0.3043
1183 | vn -0.4184 -0.8558 -0.3043
1184 | vn 0.1888 -0.9676 -0.1678
1185 | vn -0.1888 -0.9676 -0.1678
1186 | vn 0.0100 -0.9913 -0.1313
1187 | vn -0.0100 -0.9913 -0.1313
1188 | vn 0.0843 -0.8352 -0.5434
1189 | vn -0.0843 -0.8352 -0.5434
1190 | vn 0.2060 -0.8829 -0.4219
1191 | vn -0.2060 -0.8829 -0.4219
1192 | vn 0.3223 -0.9285 -0.1844
1193 | vn -0.3223 -0.9285 -0.1844
1194 | vn 0.3064 -0.9518 -0.0177
1195 | vn -0.3064 -0.9518 -0.0177
1196 | vn 0.3281 -0.9406 -0.0875
1197 | vn -0.3281 -0.9406 -0.0875
1198 | vn -0.0137 -0.9992 0.0383
1199 | vn 0.0137 -0.9992 0.0383
1200 | vn -0.0026 -0.9990 -0.0438
1201 | vn 0.0026 -0.9990 -0.0438
1202 | vn 0.0000 -1.0000 0.0000
1203 | vn 0.9045 0.0489 -0.4237
1204 | vn -0.9045 0.0489 -0.4237
1205 | vn 0.9636 0.2176 0.1554
1206 | vn -0.9636 0.2176 0.1554
1207 | vn 0.1120 0.5598 0.8210
1208 | vn -0.1120 0.5598 0.8210
1209 | vn -0.9164 -0.3160 0.2458
1210 | vn 0.9164 -0.3160 0.2458
1211 | vn 0.5572 -0.2938 -0.7767
1212 | vn -0.5572 -0.2938 -0.7767
1213 | vn 0.3180 -0.8480 -0.4240
1214 | vn -0.3180 -0.8480 -0.4240
1215 | vn -0.7320 -0.5124 0.4490
1216 | vn 0.7320 -0.5124 0.4490
1217 | vn 0.1301 -0.7482 0.6506
1218 | vn -0.1301 -0.7482 0.6506
1219 | vn 0.7767 -0.5975 0.1992
1220 | vn -0.7767 -0.5975 0.1992
1221 | vn 0.4591 -0.6887 -0.5612
1222 | vn -0.4591 -0.6887 -0.5612
1223 | vn 0.0470 -0.9865 0.1566
1224 | vn -0.0470 -0.9865 0.1566
1225 | vn 0.0351 -0.9591 -0.2807
1226 | vn -0.0351 -0.9591 -0.2807
1227 | vn -0.4484 -0.8873 -0.1081
1228 | vn 0.4484 -0.8873 -0.1081
1229 | vn -0.2308 -0.9231 -0.3077
1230 | vn 0.2308 -0.9231 -0.3077
1231 | vn 0.4361 -0.8957 -0.0864
1232 | vn -0.4361 -0.8957 -0.0864
1233 | vn 0.3010 -0.9530 0.0334
1234 | vn -0.3010 -0.9530 0.0334
1235 | vn 0.8335 -0.5126 0.2059
1236 | vn -0.8335 -0.5126 0.2059
1237 | vn 0.8919 -0.4171 0.1749
1238 | vn -0.8919 -0.4171 0.1749
1239 | vn 0.9452 -0.3082 0.1075
1240 | vn -0.9452 -0.3082 0.1075
1241 | vn 0.2562 -0.8277 -0.4993
1242 | vn -0.2562 -0.8277 -0.4993
1243 | vn -0.1553 -0.9786 -0.1346
1244 | vn 0.1553 -0.9786 -0.1346
1245 | vn -0.2741 -0.9593 -0.0685
1246 | vn 0.2741 -0.9593 -0.0685
1247 | vn -0.0986 -0.9864 0.1315
1248 | vn 0.0986 -0.9864 0.1315
1249 | vn -0.2240 -0.3839 0.8958
1250 | vn 0.2240 -0.3839 0.8958
1251 | vn -0.8164 -0.1563 0.5559
1252 | vn 0.8164 -0.1563 0.5559
1253 | vn -1.0000 0.0000 0.0000
1254 | vn 1.0000 0.0000 0.0000
1255 | vn 0.4299 -0.1664 -0.8874
1256 | vn -0.4299 -0.1664 -0.8874
1257 | vn 0.0306 -0.9785 -0.2039
1258 | vn -0.0306 -0.9785 -0.2039
1259 | vn 0.1401 -0.9606 -0.2401
1260 | vn -0.1401 -0.9606 -0.2401
1261 | vn -0.5196 -0.8335 -0.1876
1262 | vn 0.5196 -0.8335 -0.1876
1263 | vn -0.3845 -0.9227 -0.0280
1264 | vn 0.3845 -0.9227 -0.0280
1265 | vn -0.2084 -0.9777 0.0249
1266 | vn 0.2084 -0.9777 0.0249
1267 | vn -0.6120 -0.7140 -0.3400
1268 | vn 0.6120 -0.7140 -0.3400
1269 | vn -0.1654 -0.7776 -0.6066
1270 | vn 0.1654 -0.7776 -0.6066
1271 | vn 0.4585 -0.7641 -0.4538
1272 | vn -0.4585 -0.7641 -0.4538
1273 | vn 0.6033 -0.7431 -0.2894
1274 | vn -0.6033 -0.7431 -0.2894
1275 | vn 0.5680 -0.8205 -0.0647
1276 | vn -0.5680 -0.8205 -0.0647
1277 | vn 0.5726 -0.8161 0.0790
1278 | vn -0.5726 -0.8161 0.0790
1279 | vn 0.5312 -0.7400 0.4127
1280 | vn -0.5312 -0.7400 0.4127
1281 | vn 0.2925 -0.8395 0.4579
1282 | vn -0.2925 -0.8395 0.4579
1283 | vn 0.1702 -0.9533 0.2497
1284 | vn -0.1702 -0.9533 0.2497
1285 | vn -0.0181 -0.9854 0.1693
1286 | vn 0.0181 -0.9854 0.1693
1287 | vn 0.3444 -0.8922 -0.2922
1288 | vn -0.3444 -0.8922 -0.2922
1289 | vn 0.2865 -0.9415 -0.1774
1290 | vn -0.2865 -0.9415 -0.1774
1291 | vn -0.2908 -0.8178 -0.4967
1292 | vn 0.2908 -0.8178 -0.4967
1293 | vn -0.0335 -0.6869 -0.7260
1294 | vn 0.0335 -0.6869 -0.7260
1295 | vn -0.3586 -0.9165 -0.1771
1296 | vn 0.3586 -0.9165 -0.1771
1297 | vn -0.3523 -0.9359 -0.0073
1298 | vn 0.3523 -0.9359 -0.0073
1299 | vn -0.1402 -0.9345 0.3271
1300 | vn 0.1402 -0.9345 0.3271
1301 | vn -0.0385 -0.8859 0.4622
1302 | vn 0.0385 -0.8859 0.4622
1303 | vn 0.4001 -0.8082 0.4321
1304 | vn -0.4001 -0.8082 0.4321
1305 | vn 0.5429 -0.7465 0.3846
1306 | vn -0.5429 -0.7465 0.3846
1307 | vn 0.6882 -0.6882 -0.2294
1308 | vn -0.6882 -0.6882 -0.2294
1309 | vn 0.8177 -0.5736 -0.0488
1310 | vn -0.8177 -0.5736 -0.0488
1311 | vn 0.7870 -0.6121 0.0777
1312 | vn -0.7870 -0.6121 0.0777
1313 | vn -0.6661 0.3090 0.6788
1314 | vn 0.6661 0.3090 0.6788
1315 | vn -0.8853 0.3880 0.2562
1316 | vn 0.8853 0.3880 0.2562
1317 | vn -0.3206 0.5678 0.7582
1318 | vn 0.3206 0.5678 0.7582
1319 | vn 0.7129 0.3647 0.5989
1320 | vn -0.7129 0.3647 0.5989
1321 | vn 0.4865 0.4116 0.7707
1322 | vn -0.4865 0.4116 0.7707
1323 | vn 0.3858 0.3938 0.8343
1324 | vn -0.3858 0.3938 0.8343
1325 | vn 0.8604 0.5016 0.0898
1326 | vn -0.8604 0.5016 0.0898
1327 | vn 0.6343 0.5195 -0.5725
1328 | vn -0.6343 0.5195 -0.5725
1329 | vn 0.4839 0.5491 -0.6814
1330 | vn -0.4839 0.5491 -0.6814
1331 | vn 0.2590 0.8652 -0.4293
1332 | vn -0.2590 0.8652 -0.4293
1333 | vn 0.2451 0.9687 -0.0389
1334 | vn -0.2451 0.9687 -0.0389
1335 | vn 0.1235 0.9389 -0.3212
1336 | vn -0.1235 0.9389 -0.3212
1337 | vn 0.1694 0.2041 -0.9642
1338 | vn -0.1694 0.2041 -0.9642
1339 | vn 0.1707 0.3260 -0.9298
1340 | vn -0.1707 0.3260 -0.9298
1341 | vn 0.9598 0.2808 -0.0057
1342 | vn -0.9598 0.2808 -0.0057
1343 | vn 0.9388 0.3266 0.1094
1344 | vn -0.9388 0.3266 0.1094
1345 | vn 0.1626 0.9866 0.0138
1346 | vn -0.1626 0.9866 0.0138
1347 | vn -0.0190 0.9889 -0.1471
1348 | vn 0.0190 0.9889 -0.1471
1349 | vn 0.7724 0.6029 -0.1999
1350 | vn -0.7724 0.6029 -0.1999
1351 | vn 0.9245 0.3698 0.0925
1352 | vn -0.9245 0.3698 0.0925
1353 | vn 0.9561 0.1999 0.2144
1354 | vn -0.9561 0.1999 0.2144
1355 | vn 0.9423 0.2406 0.2326
1356 | vn -0.9423 0.2406 0.2326
1357 | vn 0.9712 0.0627 0.2298
1358 | vn -0.9712 0.0627 0.2298
1359 | vn 0.2334 0.5834 -0.7779
1360 | vn -0.2334 0.5834 -0.7779
1361 | vn 0.3963 0.8540 -0.3372
1362 | vn -0.3963 0.8540 -0.3372
1363 | vn 0.3950 0.5924 -0.7022
1364 | vn -0.3950 0.5924 -0.7022
1365 | vn 0.3962 0.1825 -0.8998
1366 | vn -0.3962 0.1825 -0.8998
1367 | vn 0.4364 0.2513 -0.8640
1368 | vn -0.4364 0.2513 -0.8640
1369 | vn 0.9881 0.0616 -0.1406
1370 | vn -0.9881 0.0616 -0.1406
1371 | vn 0.8928 -0.2643 -0.3647
1372 | vn -0.8928 -0.2643 -0.3647
1373 | vn 0.3461 0.9350 -0.0775
1374 | vn -0.3461 0.9350 -0.0775
1375 | vn 0.1730 -0.3387 0.9248
1376 | vn -0.1730 -0.3387 0.9248
1377 | vn 0.1855 0.2693 0.9450
1378 | vn -0.1855 0.2693 0.9450
1379 | vn 0.3896 0.8078 0.4423
1380 | vn -0.3896 0.8078 0.4423
1381 | vn 0.5590 0.1950 0.8059
1382 | vn -0.5590 0.1950 0.8059
1383 | vn 0.2167 -0.8060 0.5509
1384 | vn -0.2167 -0.8060 0.5509
1385 | vn 0.7440 -0.1976 0.6383
1386 | vn -0.7440 -0.1976 0.6383
1387 | vn 0.8161 0.2382 0.5265
1388 | vn -0.8161 0.2382 0.5265
1389 | vn 0.6755 0.7248 0.1353
1390 | vn -0.6755 0.7248 0.1353
1391 | vn 0.5229 0.7956 0.3060
1392 | vn -0.5229 0.7956 0.3060
1393 | vn 0.7728 0.2119 0.5983
1394 | vn -0.7728 0.2119 0.5983
1395 | vn 0.8327 -0.1773 0.5246
1396 | vn -0.8327 -0.1773 0.5246
1397 | vn 0.7735 -0.5699 0.2773
1398 | vn -0.7735 -0.5699 0.2773
1399 | vn 0.4737 0.2182 0.8532
1400 | vn -0.4737 0.2182 0.8532
1401 | vn 0.2511 -0.8704 0.4234
1402 | vn -0.2511 -0.8704 0.4234
1403 | vn -0.1727 0.9825 0.0700
1404 | vn 0.1727 0.9825 0.0700
1405 | vn 0.0581 -0.5487 0.8340
1406 | vn -0.0581 -0.5487 0.8340
1407 | vn -0.1631 -0.9787 0.1243
1408 | vn 0.1631 -0.9787 0.1243
1409 | vn 0.9899 -0.0489 0.1330
1410 | vn -0.9899 -0.0489 0.1330
1411 | vn 0.9492 -0.3086 0.0614
1412 | vn -0.9492 -0.3086 0.0614
1413 | vn 0.9895 0.0668 0.1283
1414 | vn -0.9895 0.0668 0.1283
1415 | vn 0.9940 0.1070 0.0208
1416 | vn -0.9940 0.1070 0.0208
1417 | vn 0.8345 -0.0587 -0.5479
1418 | vn -0.8345 -0.0587 -0.5479
1419 | vn 0.5134 -0.1168 -0.8501
1420 | vn -0.5134 -0.1168 -0.8501
1421 | vn 0.5839 -0.3021 -0.7536
1422 | vn -0.5839 -0.3021 -0.7536
1423 | vn 0.7351 -0.2914 -0.6122
1424 | vn -0.7351 -0.2914 -0.6122
1425 | vn 0.8322 -0.2734 -0.4823
1426 | vn -0.8322 -0.2734 -0.4823
1427 | vn 0.2799 -0.9057 -0.3184
1428 | vn -0.2799 -0.9057 -0.3184
1429 | vn 0.5732 0.7898 -0.2183
1430 | vn -0.5732 0.7898 -0.2183
1431 | vn 0.5118 0.8375 -0.1914
1432 | vn -0.5118 0.8375 -0.1914
1433 | vn 0.4120 0.5432 -0.7315
1434 | vn -0.4120 0.5432 -0.7315
1435 | vn 0.8173 0.3171 -0.4811
1436 | vn -0.8173 0.3171 -0.4811
1437 | vn 0.5264 0.7913 -0.3111
1438 | vn -0.5264 0.7913 -0.3111
1439 | vn 0.3656 -0.8923 0.2647
1440 | vn -0.3656 -0.8923 0.2647
1441 | vn 0.4603 -0.8802 0.1153
1442 | vn -0.4603 -0.8802 0.1153
1443 | vn 0.2591 -0.9633 0.0705
1444 | vn -0.2591 -0.9633 0.0705
1445 | vn 0.2460 -0.9678 -0.0536
1446 | vn -0.2460 -0.9678 -0.0536
1447 | vn 0.4648 -0.8845 -0.0400
1448 | vn -0.4648 -0.8845 -0.0400
1449 | vn 0.6391 -0.7403 -0.2084
1450 | vn -0.6391 -0.7403 -0.2084
1451 | vn 0.5166 -0.6919 0.5043
1452 | vn -0.5166 -0.6919 0.5043
1453 | vn -0.3396 -0.6221 0.7055
1454 | vn 0.3396 -0.6221 0.7055
1455 | vn -0.8407 -0.5188 0.1550
1456 | vn 0.8407 -0.5188 0.1550
1457 | vn -0.5447 -0.8016 -0.2466
1458 | vn 0.5447 -0.8016 -0.2466
1459 | vn 0.5015 -0.7582 -0.4166
1460 | vn -0.5015 -0.7582 -0.4166
1461 | vn 0.7426 -0.5893 -0.3182
1462 | vn -0.7426 -0.5893 -0.3182
1463 | vn 0.8387 0.1308 -0.5287
1464 | vn -0.8387 0.1308 -0.5287
1465 | vn -0.1964 -0.9609 0.1951
1466 | vn 0.1964 -0.9609 0.1951
1467 | vn 0.9420 0.2132 -0.2591
1468 | vn -0.9420 0.2132 -0.2591
1469 | vn 0.1041 -0.9891 0.1041
1470 | vn -0.1041 -0.9891 0.1041
1471 | vn 0.1168 -0.4907 0.8635
1472 | vn -0.1168 -0.4907 0.8635
1473 | vn 0.6460 -0.7610 -0.0590
1474 | vn -0.6460 -0.7610 -0.0590
1475 | vn 0.4606 -0.8208 0.3378
1476 | vn -0.4606 -0.8208 0.3378
1477 | vn 0.8614 -0.3713 -0.3465
1478 | vn -0.8614 -0.3713 -0.3465
1479 | vn 0.6107 -0.7371 -0.2892
1480 | vn -0.6107 -0.7371 -0.2892
1481 | vn 0.6240 -0.7203 -0.3030
1482 | vn -0.6240 -0.7203 -0.3030
1483 | vn 0.9908 0.0597 -0.1214
1484 | vn -0.9908 0.0597 -0.1214
1485 | vn 0.9531 0.1230 -0.2767
1486 | vn -0.9531 0.1230 -0.2767
1487 | vn 0.9973 0.0725 -0.0121
1488 | vn -0.9973 0.0725 -0.0121
1489 | vn 0.8377 -0.2204 -0.4997
1490 | vn -0.8377 -0.2204 -0.4997
1491 | vn 0.8825 -0.1203 -0.4546
1492 | vn -0.8825 -0.1203 -0.4546
1493 | vn 0.8242 -0.1374 -0.5494
1494 | vn -0.8242 -0.1374 -0.5494
1495 | vn 0.2700 0.0750 0.9599
1496 | vn -0.2700 0.0750 0.9599
1497 | vn 0.9648 -0.1324 0.2270
1498 | vn -0.9648 -0.1324 0.2270
1499 | vn 0.7982 -0.0665 -0.5987
1500 | vn -0.7982 -0.0665 -0.5987
1501 | vn -0.0127 -0.1146 0.9933
1502 | vn 0.0127 -0.1146 0.9933
1503 | vn 0.7335 -0.3944 -0.5536
1504 | vn -0.7335 -0.3944 -0.5536
1505 | vn 0.3661 -0.4805 -0.7970
1506 | vn -0.3661 -0.4805 -0.7970
1507 | vn -0.8998 0.2377 -0.3659
1508 | vn 0.8998 0.2377 -0.3659
1509 | vn -0.8473 0.5061 0.1610
1510 | vn 0.8473 0.5061 0.1610
1511 | vn -0.6972 0.3130 0.6450
1512 | vn 0.6972 0.3130 0.6450
1513 | vn -0.0835 -0.1003 0.9914
1514 | vn 0.0835 -0.1003 0.9914
1515 | vn 0.1445 -0.9894 0.0148
1516 | vn -0.1445 -0.9894 0.0148
1517 | vn 0.3278 -0.9438 0.0430
1518 | vn -0.3278 -0.9438 0.0430
1519 | vn 0.3127 -0.9497 0.0154
1520 | vn -0.3127 -0.9497 0.0154
1521 | vn 0.1710 -0.9851 0.0182
1522 | vn -0.1710 -0.9851 0.0182
1523 | vn 0.3568 -0.9137 0.1944
1524 | vn -0.3568 -0.9137 0.1944
1525 | vn 0.4007 -0.9159 -0.0229
1526 | vn -0.4007 -0.9159 -0.0229
1527 | vn 0.2575 -0.9655 -0.0402
1528 | vn -0.2575 -0.9655 -0.0402
1529 | vn 0.0637 -0.9979 -0.0071
1530 | vn -0.0637 -0.9979 -0.0071
1531 | vn -0.4272 -0.7166 0.5513
1532 | vn 0.4272 -0.7166 0.5513
1533 | vn 0.6301 -0.7762 0.0236
1534 | vn -0.6301 -0.7762 0.0236
1535 | vn 0.4523 -0.8816 -0.1350
1536 | vn -0.4523 -0.8816 -0.1350
1537 | vn 0.5137 -0.8457 -0.1446
1538 | vn -0.5137 -0.8457 -0.1446
1539 | vn 0.5361 -0.8251 0.1780
1540 | vn -0.5361 -0.8251 0.1780
1541 | vn 0.3305 -0.8407 0.4290
1542 | vn -0.3305 -0.8407 0.4290
1543 | vn 0.1383 0.1196 -0.9831
1544 | vn -0.1383 0.1196 -0.9831
1545 | vn 0.6552 -0.0104 -0.7554
1546 | vn -0.6552 -0.0104 -0.7554
1547 | vn 0.9450 -0.2797 -0.1694
1548 | vn -0.9450 -0.2797 -0.1694
1549 | vn 0.9176 0.0413 0.3954
1550 | vn -0.9176 0.0413 0.3954
1551 | vn -0.3290 0.3617 0.8723
1552 | vn 0.3290 0.3617 0.8723
1553 | vn -0.5980 0.1709 0.7831
1554 | vn 0.5980 0.1709 0.7831
1555 | vn -0.5384 0.8427 -0.0065
1556 | vn 0.5384 0.8427 -0.0065
1557 | vn -0.1911 0.9814 -0.0161
1558 | vn 0.1911 0.9814 -0.0161
1559 | vn 0.4047 0.9143 0.0177
1560 | vn -0.4047 0.9143 0.0177
1561 | vn -0.8829 -0.0222 0.4691
1562 | vn 0.8829 -0.0222 0.4691
1563 | vn 0.5493 0.8240 -0.1392
1564 | vn -0.5493 0.8240 -0.1392
1565 | vn -0.3409 0.4058 -0.8480
1566 | vn 0.3409 0.4058 -0.8480
1567 | usemtl Material.002
1568 | s off
1569 | f 47/1/1 1/2/1 3/3/1 45/4/1
1570 | f 4/5/2 2/6/2 48/7/2 46/8/2
1571 | f 45/4/3 3/3/3 5/9/3 43/10/3
1572 | f 6/11/4 4/5/4 46/8/4 44/12/4
1573 | f 3/3/5 9/13/5 7/14/5 5/9/5
1574 | f 8/15/6 10/16/6 4/5/6 6/11/6
1575 | f 1/2/7 11/17/7 9/13/7 3/3/7
1576 | f 10/16/8 12/18/8 2/6/8 4/5/8
1577 | f 11/17/9 13/19/9 15/20/9 9/13/9
1578 | f 16/21/10 14/22/10 12/18/10 10/16/10
1579 | f 9/13/11 15/20/11 17/23/11 7/14/11
1580 | f 18/24/12 16/21/12 10/16/12 8/15/12
1581 | f 15/20/13 21/25/13 19/26/13 17/23/13
1582 | f 20/27/14 22/28/14 16/21/14 18/24/14
1583 | f 13/19/15 23/29/15 21/25/15 15/20/15
1584 | f 22/28/16 24/30/16 14/22/16 16/21/16
1585 | f 23/29/17 25/31/17 27/32/17 21/25/17
1586 | f 28/33/18 26/34/18 24/30/18 22/28/18
1587 | f 21/25/19 27/32/19 29/35/19 19/26/19
1588 | f 30/36/20 28/33/20 22/28/20 20/27/20
1589 | f 27/32/21 33/37/21 31/38/21 29/35/21
1590 | f 32/39/22 34/40/22 28/33/22 30/36/22
1591 | f 25/31/23 35/41/23 33/37/23 27/32/23
1592 | f 34/40/24 36/42/24 26/34/24 28/33/24
1593 | f 35/41/25 37/43/25 39/44/25 33/37/25
1594 | f 40/45/26 38/46/26 36/42/26 34/40/26
1595 | f 33/37/27 39/44/27 41/47/27 31/38/27
1596 | f 42/48/28 40/45/28 34/40/28 32/39/28
1597 | f 39/44/29 45/4/29 43/10/29 41/47/29
1598 | f 44/12/30 46/8/30 40/45/30 42/48/30
1599 | f 37/43/31 47/1/31 45/4/31 39/44/31
1600 | f 46/8/32 48/7/32 38/46/32 40/45/32
1601 | f 47/1/33 37/43/33 51/49/33 49/50/33
1602 | f 52/51/34 38/46/34 48/7/34 50/52/34
1603 | f 37/43/35 35/41/35 53/53/35 51/49/35
1604 | f 54/54/36 36/42/36 38/46/36 52/51/36
1605 | f 35/41/37 25/31/37 55/55/37 53/53/37
1606 | f 56/56/38 26/34/38 36/42/38 54/54/38
1607 | f 25/31/39 23/29/39 57/57/39 55/55/39
1608 | f 58/58/40 24/30/40 26/34/40 56/56/40
1609 | f 23/29/41 13/19/41 59/59/41 57/57/41
1610 | f 60/60/42 14/22/42 24/30/42 58/58/42
1611 | f 13/19/43 11/17/43 63/61/43 59/59/43
1612 | f 64/62/44 12/18/44 14/22/44 60/60/44
1613 | f 11/17/45 1/2/45 65/63/45 63/61/45
1614 | f 66/64/46 2/6/46 12/18/46 64/62/46
1615 | f 1/2/47 47/1/47 49/50/47 65/63/47
1616 | f 50/52/48 48/7/48 2/6/48 66/64/48
1617 | f 61/65/49 65/63/49 49/50/49
1618 | f 50/52/50 66/64/50 62/66/50
1619 | f 63/61/51 65/63/51 61/65/51
1620 | f 62/66/52 66/64/52 64/62/52
1621 | f 61/65/53 59/59/53 63/61/53
1622 | f 64/62/54 60/60/54 62/66/54
1623 | f 61/65/55 57/57/55 59/59/55
1624 | f 60/60/56 58/58/56 62/66/56
1625 | f 61/65/57 55/55/57 57/57/57
1626 | f 58/58/58 56/56/58 62/66/58
1627 | f 61/65/59 53/53/59 55/55/59
1628 | f 56/56/60 54/54/60 62/66/60
1629 | f 61/65/61 51/49/61 53/53/61
1630 | f 54/54/62 52/51/62 62/66/62
1631 | f 61/65/63 49/50/63 51/49/63
1632 | f 52/51/64 50/52/64 62/66/64
1633 | f 89/67/65 174/68/65 176/69/65 91/70/65
1634 | f 176/69/66 175/71/66 90/72/66 91/70/66
1635 | f 87/73/67 172/74/67 174/68/67 89/67/67
1636 | f 175/71/68 173/75/68 88/76/68 90/72/68
1637 | f 85/77/69 170/78/69 172/74/69 87/73/69
1638 | f 173/75/70 171/79/70 86/80/70 88/76/70
1639 | f 83/81/71 168/82/71 170/78/71 85/77/71
1640 | f 171/79/72 169/83/72 84/84/72 86/80/72
1641 | f 81/85/73 166/86/73 168/82/73 83/81/73
1642 | f 169/83/74 167/87/74 82/88/74 84/84/74
1643 | f 79/89/75 92/90/75 146/91/75 164/92/75
1644 | f 147/93/76 93/94/76 80/95/76 165/96/76
1645 | f 92/90/77 94/97/77 148/98/77 146/91/77
1646 | f 149/99/78 95/100/78 93/94/78 147/93/78
1647 | f 94/97/79 96/101/79 150/102/79 148/98/79
1648 | f 151/103/80 97/104/80 95/100/80 149/99/80
1649 | f 96/101/81 98/105/81 152/106/81 150/102/81
1650 | f 153/107/82 99/108/82 97/104/82 151/103/82
1651 | f 98/105/83 100/109/83 154/110/83 152/106/83
1652 | f 155/111/84 101/112/84 99/108/84 153/107/84
1653 | f 100/109/85 102/113/85 156/114/85 154/110/85
1654 | f 157/115/86 103/116/86 101/112/86 155/111/86
1655 | f 102/113/87 104/117/87 158/118/87 156/114/87
1656 | f 159/119/88 105/120/88 103/116/88 157/115/88
1657 | f 104/117/89 106/121/89 160/122/89 158/118/89
1658 | f 161/123/90 107/124/90 105/120/90 159/119/90
1659 | f 106/121/91 108/125/91 162/126/91 160/122/91
1660 | f 163/127/92 109/128/92 107/124/92 161/123/92
1661 | f 108/125/93 67/129/93 68/130/93 162/126/93
1662 | f 68/130/94 67/129/94 109/128/94 163/127/94
1663 | f 110/131/95 128/132/95 160/122/95 162/126/95
1664 | f 161/123/96 129/133/96 111/134/96 163/127/96
1665 | f 128/132/97 179/135/97 158/118/97 160/122/97
1666 | f 159/119/98 180/136/98 129/133/98 161/123/98
1667 | f 126/137/99 156/114/99 158/118/99 179/135/99
1668 | f 159/119/100 157/115/100 127/138/100 180/136/100
1669 | f 124/139/101 154/110/101 156/114/101 126/137/101
1670 | f 157/115/102 155/111/102 125/140/102 127/138/102
1671 | f 122/141/103 152/106/103 154/110/103 124/139/103
1672 | f 155/111/104 153/107/104 123/142/104 125/140/104
1673 | f 120/143/105 150/102/105 152/106/105 122/141/105
1674 | f 153/107/106 151/103/106 121/144/106 123/142/106
1675 | f 118/145/107 148/98/107 150/102/107 120/143/107
1676 | f 151/103/108 149/99/108 119/146/108 121/144/108
1677 | f 116/147/109 146/91/109 148/98/109 118/145/109
1678 | f 149/99/110 147/93/110 117/148/110 119/146/110
1679 | f 114/149/111 164/92/111 146/91/111 116/147/111
1680 | f 147/93/112 165/96/112 115/150/112 117/148/112
1681 | f 114/149/113 181/151/113 177/152/113 164/92/113
1682 | f 177/152/114 182/153/114 115/150/114 165/96/114
1683 | f 110/131/115 162/126/115 68/130/115 112/154/115
1684 | f 68/130/116 163/127/116 111/134/116 113/155/116
1685 | f 112/154/117 68/130/117 178/156/117 183/157/117
1686 | f 178/156/118 68/130/118 113/155/118 184/158/118
1687 | f 177/152/119 181/151/119 183/157/119 178/156/119
1688 | f 184/158/120 182/153/120 177/152/120 178/156/120
1689 | f 135/159/121 137/160/121 176/69/121 174/68/121
1690 | f 176/69/122 137/160/122 136/161/122 175/71/122
1691 | f 133/162/123 135/159/123 174/68/123 172/74/123
1692 | f 175/71/124 136/161/124 134/163/124 173/75/124
1693 | f 131/164/125 133/162/125 172/74/125 170/78/125
1694 | f 173/75/126 134/163/126 132/165/126 171/79/126
1695 | f 166/86/127 187/166/127 185/167/127 168/82/127
1696 | f 186/168/128 188/169/128 167/87/128 169/83/128
1697 | f 131/164/129 170/78/129 168/82/129 185/167/129
1698 | f 169/83/130 171/79/130 132/165/130 186/168/130
1699 | f 144/170/131 190/171/131 189/172/131 187/166/131
1700 | f 189/172/132 190/171/132 145/173/132 188/169/132
1701 | f 185/167/133 187/166/133 189/172/133 69/174/133
1702 | f 189/172/134 188/169/134 186/168/134 69/174/134
1703 | f 130/175/135 131/164/135 185/167/135 69/174/135
1704 | f 186/168/135 132/165/135 130/175/135 69/174/135
1705 | f 142/176/136 193/177/136 191/178/136 144/170/136
1706 | f 192/179/137 194/180/137 143/181/137 145/173/137
1707 | f 140/182/138 195/183/138 193/177/138 142/176/138
1708 | f 194/180/139 196/184/139 141/185/139 143/181/139
1709 | f 139/186/140 197/187/140 195/183/140 140/182/140
1710 | f 196/184/141 198/188/141 139/186/141 141/185/141
1711 | f 138/189/142 71/190/142 197/187/142 139/186/142
1712 | f 198/188/143 71/190/143 138/189/143 139/186/143
1713 | f 190/171/144 144/170/144 191/178/144 70/191/144
1714 | f 192/179/145 145/173/145 190/171/145 70/191/145
1715 | f 70/191/146 191/178/146 206/192/146 208/193/146
1716 | f 207/194/147 192/179/147 70/191/147 208/193/147
1717 | f 71/190/148 199/195/148 200/196/148 197/187/148
1718 | f 201/197/149 199/195/149 71/190/149 198/188/149
1719 | f 197/187/150 200/196/150 202/198/150 195/183/150
1720 | f 203/199/151 201/197/151 198/188/151 196/184/151
1721 | f 195/183/152 202/198/152 204/200/152 193/177/152
1722 | f 205/201/153 203/199/153 196/184/153 194/180/153
1723 | f 193/177/154 204/200/154 206/192/154 191/178/154
1724 | f 207/194/155 205/201/155 194/180/155 192/179/155
1725 | f 199/195/156 204/200/156 202/198/156 200/196/156
1726 | f 203/199/157 205/201/157 199/195/157 201/197/157
1727 | f 199/195/158 208/193/158 206/192/158 204/200/158
1728 | f 207/194/159 208/193/159 199/195/159 205/201/159
1729 | f 139/186/160 140/182/160 164/92/160 177/152/160
1730 | f 165/96/161 141/185/161 139/186/161 177/152/161
1731 | f 140/182/162 142/176/162 211/202/162 164/92/162
1732 | f 212/203/163 143/181/163 141/185/163 165/96/163
1733 | f 142/176/164 144/170/164 213/204/164 211/202/164
1734 | f 214/205/165 145/173/165 143/181/165 212/203/165
1735 | f 144/170/166 187/166/166 166/86/166 213/204/166
1736 | f 167/87/167 188/169/167 145/173/167 214/205/167
1737 | f 81/85/168 209/206/168 213/204/168 166/86/168
1738 | f 214/205/169 210/207/169 82/88/169 167/87/169
1739 | f 209/206/170 215/208/170 211/202/170 213/204/170
1740 | f 212/203/171 216/209/171 210/207/171 214/205/171
1741 | f 79/89/172 164/92/172 211/202/172 215/208/172
1742 | f 212/203/173 165/96/173 80/95/173 216/209/173
1743 | f 131/164/174 130/175/174 72/210/174 222/211/174
1744 | f 72/210/175 130/175/175 132/165/175 223/212/175
1745 | f 133/162/176 131/164/176 222/211/176 220/213/176
1746 | f 223/212/177 132/165/177 134/163/177 221/214/177
1747 | f 135/159/178 133/162/178 220/213/178 218/215/178
1748 | f 221/214/179 134/163/179 136/161/179 219/216/179
1749 | f 137/160/180 135/159/180 218/215/180 217/217/180
1750 | f 219/216/181 136/161/181 137/160/181 217/217/181
1751 | f 217/217/182 218/215/182 229/218/182 231/219/182
1752 | f 230/220/183 219/216/183 217/217/183 231/219/183
1753 | f 218/215/184 220/213/184 227/221/184 229/218/184
1754 | f 228/222/185 221/214/185 219/216/185 230/220/185
1755 | f 220/213/186 222/211/186 225/223/186 227/221/186
1756 | f 226/224/187 223/212/187 221/214/187 228/222/187
1757 | f 222/211/188 72/210/188 224/225/188 225/223/188
1758 | f 224/225/189 72/210/189 223/212/189 226/224/189
1759 | f 224/225/190 231/219/190 229/218/190 225/223/190
1760 | f 230/220/191 231/219/191 224/225/191 226/224/191
1761 | f 225/223/192 229/218/192 227/221/192
1762 | f 228/222/193 230/220/193 226/224/193
1763 | f 183/157/194 181/151/194 234/226/194 232/227/194
1764 | f 235/228/195 182/153/195 184/158/195 233/229/195
1765 | f 112/154/196 183/157/196 232/227/196 254/230/196
1766 | f 233/229/197 184/158/197 113/155/197 255/231/197
1767 | f 110/131/198 112/154/198 254/230/198 256/232/198
1768 | f 255/231/199 113/155/199 111/134/199 257/233/199
1769 | f 181/151/200 114/149/200 252/234/200 234/226/200
1770 | f 253/235/201 115/150/201 182/153/201 235/228/201
1771 | f 114/149/202 116/147/202 250/236/202 252/234/202
1772 | f 251/237/203 117/148/203 115/150/203 253/235/203
1773 | f 116/147/204 118/145/204 248/238/204 250/236/204
1774 | f 249/239/205 119/146/205 117/148/205 251/237/205
1775 | f 118/145/206 120/143/206 246/240/206 248/238/206
1776 | f 247/241/207 121/144/207 119/146/207 249/239/207
1777 | f 120/143/208 122/141/208 244/242/208 246/240/208
1778 | f 245/243/209 123/142/209 121/144/209 247/241/209
1779 | f 122/141/210 124/139/210 242/244/210 244/242/210
1780 | f 243/245/211 125/140/211 123/142/211 245/243/211
1781 | f 124/139/212 126/137/212 240/246/212 242/244/212
1782 | f 241/247/213 127/138/213 125/140/213 243/245/213
1783 | f 126/137/214 179/135/214 236/248/214 240/246/214
1784 | f 237/249/215 180/136/215 127/138/215 241/247/215
1785 | f 179/135/216 128/132/216 238/250/216 236/248/216
1786 | f 239/251/217 129/133/217 180/136/217 237/249/217
1787 | f 128/132/218 110/131/218 256/232/218 238/250/218
1788 | f 257/233/219 111/134/219 129/133/219 239/251/219
1789 | f 238/250/220 256/232/220 258/252/220 276/253/220
1790 | f 259/254/221 257/233/221 239/251/221 277/255/221
1791 | f 236/248/222 238/250/222 276/253/222 278/256/222
1792 | f 277/255/223 239/251/223 237/249/223 279/257/223
1793 | f 240/246/224 236/248/224 278/256/224 274/258/224
1794 | f 279/257/225 237/249/225 241/247/225 275/259/225
1795 | f 242/244/226 240/246/226 274/258/226 272/260/226
1796 | f 275/259/227 241/247/227 243/245/227 273/261/227
1797 | f 244/242/228 242/244/228 272/260/228 270/262/228
1798 | f 273/261/229 243/245/229 245/243/229 271/263/229
1799 | f 246/240/230 244/242/230 270/262/230 268/264/230
1800 | f 271/263/231 245/243/231 247/241/231 269/265/231
1801 | f 248/238/232 246/240/232 268/264/232 266/266/232
1802 | f 269/265/233 247/241/233 249/239/233 267/267/233
1803 | f 250/236/234 248/238/234 266/266/234 264/268/234
1804 | f 267/267/235 249/239/235 251/237/235 265/269/235
1805 | f 252/234/236 250/236/236 264/268/236 262/270/236
1806 | f 265/269/237 251/237/237 253/235/237 263/271/237
1807 | f 234/226/238 252/234/238 262/270/238 280/272/238
1808 | f 263/271/239 253/235/239 235/228/239 281/273/239
1809 | f 256/232/240 254/230/240 260/274/240 258/252/240
1810 | f 261/275/241 255/231/241 257/233/241 259/254/241
1811 | f 254/230/242 232/227/242 282/276/242 260/274/242
1812 | f 283/277/243 233/229/243 255/231/243 261/275/243
1813 | f 232/227/244 234/226/244 280/272/244 282/276/244
1814 | f 281/273/245 235/228/245 233/229/245 283/277/245
1815 | f 67/129/246 108/125/246 284/278/246 73/279/246
1816 | f 285/280/247 109/128/247 67/129/247 73/279/247
1817 | f 108/125/248 106/121/248 286/281/248 284/278/248
1818 | f 287/282/249 107/124/249 109/128/249 285/280/249
1819 | f 106/121/250 104/117/250 288/283/250 286/281/250
1820 | f 289/284/251 105/120/251 107/124/251 287/282/251
1821 | f 104/117/252 102/113/252 290/285/252 288/283/252
1822 | f 291/286/253 103/116/253 105/120/253 289/284/253
1823 | f 102/113/254 100/109/254 292/287/254 290/285/254
1824 | f 293/288/255 101/112/255 103/116/255 291/286/255
1825 | f 100/109/256 98/105/256 294/289/256 292/287/256
1826 | f 295/290/257 99/108/257 101/112/257 293/288/257
1827 | f 98/105/258 96/101/258 296/291/258 294/289/258
1828 | f 297/292/259 97/104/259 99/108/259 295/290/259
1829 | f 96/101/260 94/97/260 298/293/260 296/291/260
1830 | f 299/294/261 95/100/261 97/104/261 297/292/261
1831 | f 94/97/262 92/90/262 300/295/262 298/293/262
1832 | f 301/296/263 93/94/263 95/100/263 299/294/263
1833 | f 308/297/264 309/298/264 328/299/264 338/300/264
1834 | f 329/301/265 309/302/265 308/303/265 339/304/265
1835 | f 307/305/266 308/297/266 338/300/266 336/306/266
1836 | f 339/304/267 308/303/267 307/307/267 337/308/267
1837 | f 306/309/268 307/305/268 336/306/268 340/310/268
1838 | f 337/308/269 307/307/269 306/309/269 341/311/269
1839 | f 89/67/270 91/70/270 306/309/270 340/310/270
1840 | f 306/309/271 91/70/271 90/72/271 341/311/271
1841 | f 87/73/272 89/67/272 340/310/272 334/312/272
1842 | f 341/311/273 90/72/273 88/76/273 335/313/273
1843 | f 85/77/274 87/73/274 334/312/274 330/314/274
1844 | f 335/313/275 88/76/275 86/80/275 331/315/275
1845 | f 83/81/276 85/77/276 330/314/276 332/316/276
1846 | f 331/315/277 86/80/277 84/84/277 333/317/277
1847 | f 330/314/278 336/306/278 338/300/278 332/316/278
1848 | f 339/304/279 337/308/279 331/315/279 333/317/279
1849 | f 330/314/280 334/312/280 340/310/280 336/306/280
1850 | f 341/311/281 335/313/281 331/315/281 337/308/281
1851 | f 326/318/282 332/316/282 338/300/282 328/299/282
1852 | f 339/304/283 333/317/283 327/319/283 329/301/283
1853 | f 81/85/284 83/81/284 332/316/284 326/318/284
1854 | f 333/317/285 84/84/285 82/88/285 327/319/285
1855 | f 209/206/286 342/320/286 344/321/286 215/208/286
1856 | f 345/322/287 343/323/287 210/207/287 216/209/287
1857 | f 81/85/288 326/318/288 342/320/288 209/206/288
1858 | f 343/323/289 327/319/289 82/88/289 210/207/289
1859 | f 79/89/290 215/208/290 344/321/290 346/324/290
1860 | f 345/322/291 216/209/291 80/95/291 347/325/291
1861 | f 79/89/292 346/324/292 300/295/292 92/90/292
1862 | f 301/296/293 347/325/293 80/95/293 93/94/293
1863 | f 77/326/294 324/327/294 352/328/294 304/329/294
1864 | f 353/330/295 325/331/295 77/332/295 304/333/295
1865 | f 304/329/296 352/328/296 350/334/296 78/335/296
1866 | f 351/336/297 353/330/297 304/333/297 78/337/297
1867 | f 78/335/298 350/334/298 348/338/298 305/339/298
1868 | f 349/340/299 351/336/299 78/337/299 305/341/299
1869 | f 305/339/300 348/338/300 328/299/300 309/298/300
1870 | f 329/301/301 349/340/301 305/341/301 309/302/301
1871 | f 326/318/302 328/299/302 348/338/302 342/320/302
1872 | f 349/340/303 329/301/303 327/319/303 343/323/303
1873 | f 296/291/304 298/293/304 318/342/304 310/343/304
1874 | f 319/344/305 299/294/305 297/292/305 311/345/305
1875 | f 76/346/306 316/347/306 324/327/306 77/326/306
1876 | f 325/331/307 317/348/307 76/349/307 77/332/307
1877 | f 302/350/308 358/351/308 356/352/308 303/353/308
1878 | f 357/354/309 359/355/309 302/356/309 303/357/309
1879 | f 303/353/310 356/352/310 354/358/310 75/359/310
1880 | f 355/360/311 357/354/311 303/357/311 75/361/311
1881 | f 75/359/312 354/358/312 316/347/312 76/346/312
1882 | f 317/348/313 355/360/313 75/361/313 76/349/313
1883 | f 292/362/314 294/289/314 362/363/314 364/364/314
1884 | f 363/365/315 295/290/315 293/366/315 365/367/315
1885 | f 364/364/316 362/363/316 368/368/316 366/369/316
1886 | f 369/370/317 363/365/317 365/367/317 367/371/317
1887 | f 366/369/318 368/368/318 370/372/318 372/373/318
1888 | f 371/374/319 369/370/319 367/371/319 373/375/319
1889 | f 372/373/320 370/372/320 376/376/320 374/377/320
1890 | f 377/378/321 371/374/321 373/375/321 375/379/321
1891 | f 314/380/322 378/381/322 374/377/322 376/376/322
1892 | f 375/379/323 379/382/323 315/383/323 377/378/323
1893 | f 316/347/324 354/358/324 374/377/324 378/381/324
1894 | f 375/379/325 355/360/325 317/348/325 379/382/325
1895 | f 354/358/326 356/352/326 372/373/326 374/377/326
1896 | f 373/375/327 357/354/327 355/360/327 375/379/327
1897 | f 356/352/328 358/351/328 366/369/328 372/373/328
1898 | f 367/371/329 359/355/329 357/354/329 373/375/329
1899 | f 358/351/330 360/384/330 364/364/330 366/369/330
1900 | f 365/367/331 361/385/331 359/355/331 367/371/331
1901 | f 290/386/332 292/362/332 364/364/332 360/384/332
1902 | f 365/367/333 293/366/333 291/387/333 361/385/333
1903 | f 74/388/334 360/384/334 358/351/334 302/350/334
1904 | f 359/355/335 361/385/335 74/389/335 302/356/335
1905 | f 284/390/336 286/391/336 288/392/336 290/386/336
1906 | f 289/393/337 287/394/337 285/395/337 291/387/337
1907 | f 284/390/338 290/386/338 360/384/338 74/388/338
1908 | f 361/385/339 291/387/339 285/395/339 74/389/339
1909 | f 73/396/340 284/390/340 74/388/340
1910 | f 74/389/341 285/395/341 73/397/341
1911 | f 294/289/342 296/291/342 310/343/342 362/363/342
1912 | f 311/345/343 297/292/343 295/290/343 363/365/343
1913 | f 310/343/344 312/398/344 368/368/344 362/363/344
1914 | f 369/370/345 313/399/345 311/345/345 363/365/345
1915 | f 312/398/346 382/400/346 370/372/346 368/368/346
1916 | f 371/374/347 383/401/347 313/399/347 369/370/347
1917 | f 314/380/348 376/376/348 370/372/348 382/400/348
1918 | f 371/374/349 377/378/349 315/383/349 383/401/349
1919 | f 348/338/350 350/334/350 386/402/350 384/403/350
1920 | f 387/404/351 351/336/351 349/340/351 385/405/351
1921 | f 318/342/352 384/403/352 386/402/352 320/406/352
1922 | f 387/404/353 385/405/353 319/344/353 321/407/353
1923 | f 298/293/354 300/295/354 384/403/354 318/342/354
1924 | f 385/405/355 301/296/355 299/294/355 319/344/355
1925 | f 300/295/356 344/321/356 342/320/356 384/403/356
1926 | f 343/323/357 345/322/357 301/296/357 385/405/357
1927 | f 342/320/358 348/338/358 384/403/358
1928 | f 385/405/359 349/340/359 343/323/359
1929 | f 300/295/360 346/324/360 344/321/360
1930 | f 345/322/361 347/325/361 301/296/361
1931 | f 314/380/362 322/408/362 380/409/362 378/381/362
1932 | f 381/410/363 323/411/363 315/383/363 379/382/363
1933 | f 316/347/364 378/381/364 380/409/364 324/327/364
1934 | f 381/410/365 379/382/365 317/348/365 325/331/365
1935 | f 320/406/366 386/402/366 380/409/366 322/408/366
1936 | f 381/410/367 387/404/367 321/407/367 323/411/367
1937 | f 350/334/368 352/328/368 380/409/368 386/402/368
1938 | f 381/410/369 353/330/369 351/336/369 387/404/369
1939 | f 324/327/370 380/409/370 352/328/370
1940 | f 353/330/371 381/410/371 325/331/371
1941 | f 400/412/372 388/413/372 414/414/372 402/415/372
1942 | f 415/416/373 389/417/373 401/418/373 403/419/373
1943 | f 400/412/374 402/415/374 404/420/374 398/421/374
1944 | f 405/422/375 403/419/375 401/418/375 399/423/375
1945 | f 398/421/376 404/420/376 406/424/376 396/425/376
1946 | f 407/426/377 405/422/377 399/423/377 397/427/377
1947 | f 396/425/378 406/424/378 408/428/378 394/429/378
1948 | f 409/430/379 407/426/379 397/427/379 395/431/379
1949 | f 394/429/380 408/428/380 410/432/380 392/433/380
1950 | f 411/434/381 409/430/381 395/431/381 393/435/381
1951 | f 392/433/382 410/432/382 412/436/382 390/437/382
1952 | f 413/438/383 411/434/383 393/435/383 391/439/383
1953 | f 410/432/384 420/440/384 418/441/384 412/436/384
1954 | f 419/442/385 421/443/385 411/434/385 413/438/385
1955 | f 408/428/386 422/444/386 420/440/386 410/432/386
1956 | f 421/443/387 423/445/387 409/430/387 411/434/387
1957 | f 406/424/388 424/446/388 422/444/388 408/428/388
1958 | f 423/445/389 425/447/389 407/426/389 409/430/389
1959 | f 404/420/390 426/448/390 424/446/390 406/424/390
1960 | f 425/447/391 427/449/391 405/422/391 407/426/391
1961 | f 402/415/392 428/450/392 426/448/392 404/420/392
1962 | f 427/449/393 429/451/393 403/419/393 405/422/393
1963 | f 402/415/394 414/414/394 416/452/394 428/450/394
1964 | f 417/453/395 415/416/395 403/419/395 429/451/395
1965 | f 318/342/396 320/406/396 444/454/396 442/455/396
1966 | f 445/456/397 321/407/397 319/344/397 443/457/397
1967 | f 320/458/398 390/437/398 412/436/398 444/459/398
1968 | f 413/438/399 391/439/399 321/460/399 445/461/399
1969 | f 310/343/400 318/342/400 442/455/400 312/398/400
1970 | f 443/457/401 319/344/401 311/345/401 313/399/401
1971 | f 382/462/402 430/463/402 414/414/402 388/413/402
1972 | f 415/416/403 431/464/403 383/465/403 389/417/403
1973 | f 412/436/404 418/441/404 440/466/404 444/459/404
1974 | f 441/467/405 419/442/405 413/438/405 445/461/405
1975 | f 438/468/406 446/469/406 444/459/406 440/466/406
1976 | f 445/461/407 447/470/407 439/471/407 441/467/407
1977 | f 434/472/408 446/469/408 438/468/408 436/473/408
1978 | f 439/471/409 447/470/409 435/474/409 437/475/409
1979 | f 432/476/410 448/477/410 446/469/410 434/472/410
1980 | f 447/470/411 449/478/411 433/479/411 435/474/411
1981 | f 430/463/412 448/477/412 432/476/412 450/480/412
1982 | f 433/479/413 449/478/413 431/464/413 451/481/413
1983 | f 414/414/414 430/463/414 450/480/414 416/452/414
1984 | f 451/481/415 431/464/415 415/416/415 417/453/415
1985 | f 312/398/416 448/482/416 430/483/416 382/400/416
1986 | f 431/484/417 449/485/417 313/399/417 383/401/417
1987 | f 312/398/418 442/455/418 446/486/418 448/482/418
1988 | f 447/487/419 443/457/419 313/399/419 449/485/419
1989 | f 442/455/420 444/454/420 446/486/420
1990 | f 447/487/421 445/456/421 443/457/421
1991 | f 416/452/422 450/480/422 452/488/422 476/489/422
1992 | f 453/490/423 451/481/423 417/453/423 477/491/423
1993 | f 450/480/424 432/476/424 462/492/424 452/488/424
1994 | f 463/493/425 433/479/425 451/481/425 453/490/425
1995 | f 432/476/426 434/472/426 460/494/426 462/492/426
1996 | f 461/495/427 435/474/427 433/479/427 463/493/427
1997 | f 434/472/428 436/473/428 458/496/428 460/494/428
1998 | f 459/497/429 437/475/429 435/474/429 461/495/429
1999 | f 436/473/430 438/468/430 456/498/430 458/496/430
2000 | f 457/499/431 439/471/431 437/475/431 459/497/431
2001 | f 438/468/432 440/466/432 454/500/432 456/498/432
2002 | f 455/501/433 441/467/433 439/471/433 457/499/433
2003 | f 440/466/434 418/441/434 474/502/434 454/500/434
2004 | f 475/503/435 419/442/435 441/467/435 455/501/435
2005 | f 428/450/436 416/452/436 476/489/436 464/504/436
2006 | f 477/491/437 417/453/437 429/451/437 465/505/437
2007 | f 426/448/438 428/450/438 464/504/438 466/506/438
2008 | f 465/505/439 429/451/439 427/449/439 467/507/439
2009 | f 424/446/440 426/448/440 466/506/440 468/508/440
2010 | f 467/507/441 427/449/441 425/447/441 469/509/441
2011 | f 422/444/442 424/446/442 468/508/442 470/510/442
2012 | f 469/509/443 425/447/443 423/445/443 471/511/443
2013 | f 420/440/444 422/444/444 470/510/444 472/512/444
2014 | f 471/511/445 423/445/445 421/443/445 473/513/445
2015 | f 418/441/446 420/440/446 472/512/446 474/502/446
2016 | f 473/513/447 421/443/447 419/442/447 475/503/447
2017 | f 458/496/448 456/498/448 480/514/448 478/515/448
2018 | f 481/516/449 457/499/449 459/497/449 479/517/449
2019 | f 478/515/450 480/514/450 482/518/450 484/519/450
2020 | f 483/520/451 481/516/451 479/517/451 485/521/451
2021 | f 484/519/452 482/518/452 488/522/452 486/523/452
2022 | f 489/524/453 483/520/453 485/521/453 487/525/453
2023 | f 486/523/454 488/522/454 490/526/454 492/527/454
2024 | f 491/528/455 489/524/455 487/525/455 493/529/455
2025 | f 464/504/456 476/489/456 486/523/456 492/527/456
2026 | f 487/525/457 477/491/457 465/505/457 493/529/457
2027 | f 452/488/458 484/519/458 486/523/458 476/489/458
2028 | f 487/525/459 485/521/459 453/490/459 477/491/459
2029 | f 452/488/460 462/492/460 478/515/460 484/519/460
2030 | f 479/517/461 463/493/461 453/490/461 485/521/461
2031 | f 458/496/462 478/515/462 462/492/462 460/494/462
2032 | f 463/493/463 479/517/463 459/497/463 461/495/463
2033 | f 454/500/464 474/502/464 480/514/464 456/498/464
2034 | f 481/516/465 475/503/465 455/501/465 457/499/465
2035 | f 472/512/466 482/518/466 480/514/466 474/502/466
2036 | f 481/516/467 483/520/467 473/513/467 475/503/467
2037 | f 470/510/468 488/522/468 482/518/468 472/512/468
2038 | f 483/520/469 489/524/469 471/511/469 473/513/469
2039 | f 468/508/470 490/526/470 488/522/470 470/510/470
2040 | f 489/524/471 491/528/471 469/509/471 471/511/471
2041 | f 466/506/472 492/527/472 490/526/472 468/508/472
2042 | f 491/528/473 493/529/473 467/507/473 469/509/473
2043 | f 464/504/474 492/527/474 466/506/474
2044 | f 467/507/475 493/529/475 465/505/475
2045 | f 392/433/476 390/437/476 504/530/476 502/531/476
2046 | f 505/532/477 391/439/477 393/435/477 503/533/477
2047 | f 394/429/478 392/433/478 502/531/478 500/534/478
2048 | f 503/533/479 393/435/479 395/431/479 501/535/479
2049 | f 396/425/480 394/429/480 500/534/480 498/536/480
2050 | f 501/535/481 395/431/481 397/427/481 499/537/481
2051 | f 398/538/482 396/425/482 498/536/482 496/539/482
2052 | f 499/537/483 397/427/483 399/540/483 497/541/483
2053 | f 400/542/484 398/538/484 496/539/484 494/543/484
2054 | f 497/541/485 399/540/485 401/544/485 495/545/485
2055 | f 388/546/486 400/542/486 494/543/486 506/547/486
2056 | f 495/545/487 401/544/487 389/548/487 507/549/487
2057 | f 494/543/488 502/531/488 504/530/488 506/547/488
2058 | f 505/532/489 503/533/489 495/545/489 507/549/489
2059 | f 494/543/490 496/539/490 500/534/490 502/531/490
2060 | f 501/535/491 497/541/491 495/545/491 503/533/491
2061 | f 496/539/492 498/536/492 500/534/492
2062 | f 501/535/493 499/537/493 497/541/493
2063 | f 314/380/494 382/400/494 388/550/494 506/551/494
2064 | f 389/548/495 383/552/495 315/553/495 507/549/495
2065 | f 314/554/496 506/547/496 504/530/496 322/555/496
2066 | f 505/532/497 507/549/497 315/553/497 323/556/497
2067 | f 320/458/498 322/555/498 504/530/498 390/437/498
2068 | f 505/532/499 323/556/499 321/460/499 391/439/499
2069 |
--------------------------------------------------------------------------------
/object_textures/bark_brown_02_diff_1k.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/object_textures/bark_brown_02_diff_1k.jpg
--------------------------------------------------------------------------------
/references/CVAT_import.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/references/CVAT_import.jpg
--------------------------------------------------------------------------------
/references/UV_mapping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/references/UV_mapping.png
--------------------------------------------------------------------------------
/references/blender_render.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/references/blender_render.gif
--------------------------------------------------------------------------------
/references/blender_scene.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/references/blender_scene.png
--------------------------------------------------------------------------------
/references/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ignc-research/blender-gen/feeddedb950526fd7b4efe4274282798567c4b8b/references/example.png
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | matplotlib==3.3.1
2 |
--------------------------------------------------------------------------------
/show_annotations.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import json
5 | import os
6 | import sys
7 | from typing import List, Dict, Any
8 |
9 | import matplotlib.pyplot as plt
10 | import matplotlib.patches as patches
11 | import matplotlib.image as mpimg
12 |
13 | sys.path.append(os.getcwd())
14 | import config
15 |
16 | # Constants
17 | DATASET_DIR = "DATASET"
18 | ANNOTATIONS_FILE = "instances_default.json"
19 | IMAGES_DIR = "images"
20 |
21 |
22 | def load_config() -> Any:
23 | """Load the configuration."""
24 | return config.cfg()
25 |
26 |
27 | def load_annotations(cfg: Any) -> Dict[str, Any]:
28 | """Load annotations from the specified configuration."""
29 | annotations_path = os.path.join(
30 | DATASET_DIR, cfg.out_folder, "annotations", ANNOTATIONS_FILE
31 | )
32 | try:
33 | with open(annotations_path) as f:
34 | return json.load(f)
35 | except FileNotFoundError:
36 | print(f"Error: {annotations_path} not found.")
37 | sys.exit(1)
38 | except json.JSONDecodeError:
39 | print(f"Error: Failed to decode JSON from {annotations_path}.")
40 | sys.exit(1)
41 |
42 |
43 | class AnnotationViewer:
44 | def __init__(
45 | self, images: List[Dict[str, Any]], labels: List[Dict[str, Any]], cfg: Any
46 | ):
47 | """Initialize the AnnotationViewer with images, labels, and configuration."""
48 | self.images = images
49 | self.labels = labels
50 | self.cfg = cfg
51 | self.index = 0
52 | self.fig, self.ax = plt.subplots(1)
53 | self.fig.canvas.mpl_connect("key_press_event", self.on_key)
54 | self.fig.canvas.mpl_connect("button_press_event", self.on_click)
55 | self.show_image()
56 |
57 | def show_image(self) -> None:
58 | """Display the current image with its annotation."""
59 | self.ax.clear()
60 | image = self.images[self.index]
61 | label = self.labels[self.index]
62 | img_name = image["file_name"]
63 | print(f"Showing annotation for img: {img_name}")
64 | bbox = label["bbox"]
65 | img_path = os.path.join(DATASET_DIR, self.cfg.out_folder, IMAGES_DIR, img_name)
66 | try:
67 | I = mpimg.imread(img_path) # load rendered image
68 | except FileNotFoundError:
69 | print(f"Error: Image file {img_path} not found.")
70 | return
71 | self.ax.imshow(I)
72 | plt.axis("off")
73 | x, y, w, h = bbox
74 | rect = patches.Rectangle(
75 | (x, y), w, h, linewidth=2, edgecolor="g", facecolor="none"
76 | ) # add bounding box annotation
77 | self.ax.add_patch(rect)
78 | self.fig.canvas.draw()
79 |
80 | def on_key(self, event: Any) -> None:
81 | """Handle key press events."""
82 | if event.key == "escape":
83 | plt.close(self.fig)
84 | elif event.key == "right":
85 | self.index = (self.index + 1) % len(self.images)
86 | self.show_image()
87 | elif event.key == "left":
88 | self.index = (self.index - 1) % len(self.images)
89 | self.show_image()
90 |
91 | def on_click(self, event: Any) -> None:
92 | """Handle mouse click events."""
93 | if event.button == 1: # left mouse button
94 | self.index = (self.index + 1) % len(self.images)
95 | self.show_image()
96 | elif event.button == 3: # right mouse button
97 | self.index = (self.index - 1) % len(self.images)
98 | self.show_image()
99 |
100 |
101 | def main() -> None:
102 | """Main function to run the annotation viewer."""
103 | cfg = load_config()
104 | data = load_annotations(cfg)
105 | images = data["images"]
106 | labels = data["annotations"]
107 | print("Use the mouse buttons or arrow keys to navigate, close the viewer with Esc.")
108 | viewer = AnnotationViewer(images, labels, cfg)
109 | plt.show()
110 |
111 |
112 | if __name__ == "__main__":
113 | main()
114 |
--------------------------------------------------------------------------------
/texture_color_converter.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import os
3 | import cv2
4 | import random
5 | import numpy as np
6 |
7 | def main():
8 | parser = argparse.ArgumentParser()
9 | parser.add_argument('--input_folder', help='path to folder with textures')
10 | parser.add_argument('--output_folder', help='path to output folder with new textures')
11 | args = parser.parse_args()
12 |
13 | # Parameters
14 | H = [220, 260] # hue range
15 | V = -70 # value offset
16 | MAX_V = 128 # maximum value
17 | MIN_V = 0 # minimum value
18 |
19 | dir_ = os.listdir(args.input_folder)
20 |
21 | for file in dir_:
22 | print(args.input_folder+'/'+file)
23 | image = cv2.imread(args.input_folder+'/'+file)
24 | image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
25 | h,w,c = image.shape
26 | image[:,:,0] = np.random.randint(H[0], H[1], size=(h,w))/2
27 | image[:,:,1] = 255 # constant saturation
28 | image[:,:,2] = image[:,:,2] + V # increase or decrease pixel-wise value
29 | image[image[:,:,2] < MIN_V, 2] = MIN_V # set minimum value
30 | image[image[:,:,2] > MAX_V, 2] = MAX_V # set maximum value
31 | image[image > 255] = 255
32 | image[image < 0] = 0
33 | image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)
34 | cv2.imwrite(args.output_folder+'/'+file, image)
35 |
36 |
37 | if __name__ == '__main__':
38 | main()
39 |
--------------------------------------------------------------------------------
/util.py:
--------------------------------------------------------------------------------
1 | import random
2 |
3 |
4 | def orderCorners(objBB):
5 | """change bounding box corner order."""
6 | # change bounding box order according to
7 | # https://github.com/Microsoft/singleshotpose/blob/master/label_file_creation.md
8 | out = []
9 | corners = [v[:] for v in objBB] # list of tuples (x,y,z)
10 | out.append(corners[0]) # -1 -1 -1
11 | out.append(corners[1]) # -1 -1 1
12 | out.append(corners[3]) # -1 1 -1
13 | out.append(corners[2]) # -1 1 1
14 | out.append(corners[4]) # 1 -1 -1
15 | out.append(corners[5]) # 1 -1 1
16 | out.append(corners[7]) # 1 1 -1
17 | out.append(corners[6]) # 1 1 1
18 | return out
19 |
20 |
21 | def kelvin_to_rgb(K):
22 | """converts color temperature in Kelvin to RGB values according to
23 | http://www.vendian.org/mncharity/dir3/blackbody/UnstableURLs/bbr_color.html"""
24 | table = {4000: (1.0000, 0.6636, 0.3583),
25 | 5000: (1.0000, 0.7992, 0.6045),
26 | 6000: (1.0000, 0.9019, 0.8473),
27 | 7000: (0.9337, 0.9150, 1.0000),
28 | 8000: (0.7874, 0.8187, 1.0000),
29 | 9000: (0.6693, 0.7541, 1.0000),
30 | 0: (1, 1, 1)
31 | }
32 | rgb = table[K]
33 | return rgb
34 |
35 | def get_random_temperature_color(): # 4K-9K test
36 | color_list = [(1.0000, 0.6636, 0.3583), # 4000K
37 | (1.0000, 0.7992, 0.6045), # 5000K
38 | (1.0000, 0.9019, 0.8473), # 6000K
39 | (0.9337, 0.9150, 1.0000), # 7000K
40 | (0.7874, 0.8187, 1.0000), # 8000K
41 | (0.6693, 0.7541, 1.0000), # 9000K
42 | (1.0,1.0,1.0) # white
43 | ]
44 | idx = random.randint(0, len(color_list)-1)
45 | return color_list[idx]
46 |
47 |
48 | #def get_random_temperature_color():
49 | # color_list = [(1.0000, 0.2434, 0.0000), # 1900K
50 | # (1.0000, 0.3786, 0.0790), # 2600K
51 | # (1.0000, 0.4668, 0.1229), # 2900K
52 | # (1.0000, 0.4970, 0.1879), # 3200K
53 | # (1.0000, 0.8221, 0.6541), # 5200K
54 | # (1.0000, 0.8286, 0.7187), # 5400K
55 | # (1.0000, 0.9019, 0.8473), # 6000K
56 | # (0.9337, 0.9150, 1.0000), # 7000K
57 | # (0.3928, 0.5565, 1.0000) # 20000K
58 | # ]
59 | # idx = random.randint(0, len(color_list)-1)
60 | # return color_list[idx]
61 |
--------------------------------------------------------------------------------