├── .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 | ![Screenshot](./references/example.png) 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 | --------------------------------------------------------------------------------