├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── cube.obj ├── cylinder.obj ├── earth.png ├── moon.png ├── plane.obj ├── soccerball.obj ├── sphere.obj └── starfield.png ├── conf.lua ├── demo.gif ├── g3d ├── camera.lua ├── collisions.lua ├── g3d.vert ├── init.lua ├── matrices.lua ├── model.lua ├── objloader.lua └── vectors.lua └── main.lua /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://www.paypal.me/groverburger"] 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | */Thumbs.db 4 | docs/* 5 | Thumbs.db 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 groverburger 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 | ![g3d_logo](https://user-images.githubusercontent.com/19754251/91235387-502bb980-e6ea-11ea-9d12-74f762f69859.png) 2 | 3 | groverburger's 3D engine (g3d) simplifies [LÖVE](http://love2d.org)'s 3d capabilities to be as simple to use as possible.
4 | View the original forum post [here](https://love2d.org/forums/viewtopic.php?f=5&t=86350). 5 | 6 | ![pic1](demo.gif) 7 | 8 | The entire `main.lua` file for the Earth and Moon demo is under 30 lines, as shown here: 9 | ```lua 10 | -- written by groverbuger for g3d 11 | -- may 2021 12 | -- MIT license 13 | 14 | local g3d = require "g3d" 15 | local earth = g3d.newModel("assets/sphere.obj", "assets/earth.png", {0,0,4}) 16 | local moon = g3d.newModel("assets/sphere.obj", "assets/moon.png", {5,0,4}, nil, {0.5,0.5,0.5}) 17 | local background = g3d.newModel("assets/sphere.obj", "assets/starfield.png", {0,0,0}, nil, {500,500,500}) 18 | local timer = 0 19 | 20 | function love.mousemoved(x,y, dx,dy) 21 | g3d.camera.firstPersonLook(dx,dy) 22 | end 23 | 24 | function love.update(dt) 25 | timer = timer + dt 26 | moon:setTranslation(math.cos(timer)*5, 0, math.sin(timer)*5 +4) 27 | moon:setRotation(0, math.pi - timer, 0) 28 | g3d.camera.firstPersonMovement(dt) 29 | if love.keyboard.isDown("escape") then love.event.push("quit") end 30 | end 31 | 32 | function love.draw() 33 | earth:draw() 34 | moon:draw() 35 | background:draw() 36 | end 37 | ``` 38 | 39 | ## Features 40 | 41 | - 3D Model rendering 42 | - .obj file loading 43 | - Basic first person movement and camera controls 44 | - Perspective and orthographic projections 45 | - Easily create your own custom vertex and fragment shaders 46 | - Basic collision functions 47 | - Simple, commented, and organized 48 | - Fully documented, check out the [g3d wiki](https://github.com/groverburger/g3d/wiki)! 49 | 50 | ## Getting Started 51 | 52 | 1. Download the latest release version. 53 | 2. Add the `g3d` subfolder folder to your project. 54 | 3. Add `g3d = require "g3d"` to the top of your `main.lua` file. 55 | 56 | For more information, check out the [g3d wiki](https://github.com/groverburger/g3d/wiki)! 57 | 58 | ## Games and demos made with g3d 59 | 60 | [Hoarder's Horrible House of Stuff](https://alesan99.itch.io/hoarders-horrible-house-of-stuff) by alesan99
61 | ![Hoarder's Gif](https://img.itch.zone/aW1hZ2UvODY2NDc3LzQ4NjYzMDcuZ2lm/original/byZGOE.gif) 62 | 63 | [Lead Haul](https://hydrogen-maniac.itch.io/lead-haul) by YouDoYouBuddy
64 | ![Lead Haul Screenshot](https://user-images.githubusercontent.com/19754251/134966103-014a1f67-c79f-4bf6-bece-5764d6c22ee5.png) 65 | 66 | [Plan Meow](https://sacemakesgame.itch.io/plan-meow) by SaceMakesGame 67 | ![Plan Meow Screenshot](https://github.com/user-attachments/assets/31df1499-8991-4ffc-946d-7a2f0e8cb198) 68 | 69 | [First Person Test](https://github.com/groverburger/g3d_fps) by groverburger
70 | ![First Person Test Gif](https://user-images.githubusercontent.com/19754251/108477667-6012f900-7248-11eb-97e9-8fbc03a09a99.gif) 71 | 72 | [g3d voxel engine](https://github.com/groverburger/g3d_voxel) by groverburger
73 | ![g3d_voxel3](https://user-images.githubusercontent.com/19754251/146161518-7e94510f-5683-4a3c-aaa2-c39d4d23f0bd.png) 74 | 75 | ## Additional Help and FAQ 76 | 77 | Check out the [g3d wiki](https://github.com/groverburger/g3d/wiki)! 78 | -------------------------------------------------------------------------------- /assets/cube.obj: -------------------------------------------------------------------------------- 1 | # cube.obj 2 | # 3 | 4 | o cube 5 | mtllib cube.mtl 6 | 7 | v -1 -1 1 8 | v 1 -1 1 9 | v -1 1 1 10 | v 1 1 1 11 | v -1 1 -1 12 | v 1 1 -1 13 | v -1 -1 -1 14 | v 1 -1 -1 15 | 16 | vt 0.000000 0.000000 17 | vt 1.000000 0.000000 18 | vt 0.000000 1.000000 19 | vt 1.000000 1.000000 20 | 21 | vn 0.000000 0.000000 1.000000 22 | vn 0.000000 1.000000 0.000000 23 | vn 0.000000 0.000000 -1.000000 24 | vn 0.000000 -1.000000 0.000000 25 | vn 1.000000 0.000000 0.000000 26 | vn -1.000000 0.000000 0.000000 27 | 28 | g cube 29 | usemtl cube 30 | s 1 31 | f 1/1/1 2/2/1 3/3/1 32 | f 3/3/1 2/2/1 4/4/1 33 | s 2 34 | f 3/1/2 4/2/2 5/3/2 35 | f 5/3/2 4/2/2 6/4/2 36 | s 3 37 | f 5/4/3 6/3/3 7/2/3 38 | f 7/2/3 6/3/3 8/1/3 39 | s 4 40 | f 7/1/4 8/2/4 1/3/4 41 | f 1/3/4 8/2/4 2/4/4 42 | s 5 43 | f 2/1/5 8/2/5 4/3/5 44 | f 4/3/5 8/2/5 6/4/5 45 | s 6 46 | f 7/1/6 1/2/6 5/3/6 47 | f 5/3/6 1/2/6 3/4/6 48 | -------------------------------------------------------------------------------- /assets/cylinder.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.91.2 OBJ File: '' 2 | # www.blender.org 3 | o Cylinder 4 | v -1.000000 0.000000 -1.000000 5 | v -1.000000 0.000000 1.000000 6 | v -0.980785 0.195090 -1.000000 7 | v -0.980785 0.195090 1.000000 8 | v -0.923880 0.382683 -1.000000 9 | v -0.923880 0.382683 1.000000 10 | v -0.831470 0.555570 -1.000000 11 | v -0.831470 0.555570 1.000000 12 | v -0.707107 0.707107 -1.000000 13 | v -0.707107 0.707107 1.000000 14 | v -0.555570 0.831470 -1.000000 15 | v -0.555570 0.831470 1.000000 16 | v -0.382683 0.923880 -1.000000 17 | v -0.382683 0.923880 1.000000 18 | v -0.195090 0.980785 -1.000000 19 | v -0.195090 0.980785 1.000000 20 | v -0.000000 1.000000 -1.000000 21 | v -0.000000 1.000000 1.000000 22 | v 0.195090 0.980785 -1.000000 23 | v 0.195090 0.980785 1.000000 24 | v 0.382683 0.923880 -1.000000 25 | v 0.382683 0.923880 1.000000 26 | v 0.555570 0.831470 -1.000000 27 | v 0.555570 0.831470 1.000000 28 | v 0.707107 0.707107 -1.000000 29 | v 0.707107 0.707107 1.000000 30 | v 0.831470 0.555570 -1.000000 31 | v 0.831470 0.555570 1.000000 32 | v 0.923880 0.382683 -1.000000 33 | v 0.923880 0.382683 1.000000 34 | v 0.980785 0.195090 -1.000000 35 | v 0.980785 0.195090 1.000000 36 | v 1.000000 -0.000000 -1.000000 37 | v 1.000000 -0.000000 1.000000 38 | v 0.980785 -0.195091 -1.000000 39 | v 0.980785 -0.195091 1.000000 40 | v 0.923879 -0.382684 -1.000000 41 | v 0.923879 -0.382684 1.000000 42 | v 0.831469 -0.555571 -1.000000 43 | v 0.831469 -0.555571 1.000000 44 | v 0.707106 -0.707107 -1.000000 45 | v 0.707106 -0.707107 1.000000 46 | v 0.555570 -0.831470 -1.000000 47 | v 0.555570 -0.831470 1.000000 48 | v 0.382683 -0.923880 -1.000000 49 | v 0.382683 -0.923880 1.000000 50 | v 0.195089 -0.980785 -1.000000 51 | v 0.195089 -0.980785 1.000000 52 | v -0.000001 -1.000000 -1.000000 53 | v -0.000001 -1.000000 1.000000 54 | v -0.195091 -0.980785 -1.000000 55 | v -0.195091 -0.980785 1.000000 56 | v -0.382684 -0.923879 -1.000000 57 | v -0.382684 -0.923879 1.000000 58 | v -0.555571 -0.831469 -1.000000 59 | v -0.555571 -0.831469 1.000000 60 | v -0.707108 -0.707106 -1.000000 61 | v -0.707108 -0.707106 1.000000 62 | v -0.831470 -0.555569 -1.000000 63 | v -0.831470 -0.555569 1.000000 64 | v -0.923880 -0.382682 -1.000000 65 | v -0.923880 -0.382682 1.000000 66 | v -0.980786 -0.195089 -1.000000 67 | v -0.980786 -0.195089 1.000000 68 | vt 1.000000 1.000000 69 | vt 0.968750 0.500000 70 | vt 1.000000 0.500000 71 | vt 0.968750 1.000000 72 | vt 0.937500 0.500000 73 | vt 0.937500 1.000000 74 | vt 0.906250 0.500000 75 | vt 0.906250 1.000000 76 | vt 0.875000 0.500000 77 | vt 0.875000 1.000000 78 | vt 0.843750 0.500000 79 | vt 0.843750 1.000000 80 | vt 0.812500 0.500000 81 | vt 0.812500 1.000000 82 | vt 0.781250 0.500000 83 | vt 0.781250 1.000000 84 | vt 0.750000 0.500000 85 | vt 0.750000 1.000000 86 | vt 0.718750 0.500000 87 | vt 0.718750 1.000000 88 | vt 0.687500 0.500000 89 | vt 0.687500 1.000000 90 | vt 0.656250 0.500000 91 | vt 0.656250 1.000000 92 | vt 0.625000 0.500000 93 | vt 0.625000 1.000000 94 | vt 0.593750 0.500000 95 | vt 0.593750 1.000000 96 | vt 0.562500 0.500000 97 | vt 0.562500 1.000000 98 | vt 0.531250 0.500000 99 | vt 0.531250 1.000000 100 | vt 0.500000 0.500000 101 | vt 0.500000 1.000000 102 | vt 0.468750 0.500000 103 | vt 0.468750 1.000000 104 | vt 0.437500 0.500000 105 | vt 0.437500 1.000000 106 | vt 0.406250 0.500000 107 | vt 0.406250 1.000000 108 | vt 0.375000 0.500000 109 | vt 0.375000 1.000000 110 | vt 0.343750 0.500000 111 | vt 0.343750 1.000000 112 | vt 0.312500 0.500000 113 | vt 0.312500 1.000000 114 | vt 0.281250 0.500000 115 | vt 0.281250 1.000000 116 | vt 0.250000 0.500000 117 | vt 0.250000 1.000000 118 | vt 0.218750 0.500000 119 | vt 0.218750 1.000000 120 | vt 0.187500 0.500000 121 | vt 0.187500 1.000000 122 | vt 0.156250 0.500000 123 | vt 0.156250 1.000000 124 | vt 0.125000 0.500000 125 | vt 0.125000 1.000000 126 | vt 0.093750 0.500000 127 | vt 0.093750 1.000000 128 | vt 0.062500 0.500000 129 | vt 0.028269 0.341844 130 | vt 0.158156 0.028269 131 | vt 0.471731 0.158156 132 | vt 0.062500 1.000000 133 | vt 0.031250 0.500000 134 | vt 0.031250 1.000000 135 | vt 0.000000 0.500000 136 | vt 0.985388 0.296822 137 | vt 0.796822 0.014612 138 | vt 0.514611 0.203179 139 | vt 0.341844 0.471731 140 | vt 0.296822 0.485388 141 | vt 0.250000 0.490000 142 | vt 0.203179 0.485389 143 | vt 0.158156 0.471731 144 | vt 0.116663 0.449553 145 | vt 0.080295 0.419706 146 | vt 0.050447 0.383337 147 | vt 0.014612 0.296822 148 | vt 0.010000 0.250000 149 | vt 0.014611 0.203179 150 | vt 0.028269 0.158156 151 | vt 0.050447 0.116663 152 | vt 0.080294 0.080294 153 | vt 0.116663 0.050447 154 | vt 0.203178 0.014612 155 | vt 0.250000 0.010000 156 | vt 0.296822 0.014612 157 | vt 0.341844 0.028269 158 | vt 0.383337 0.050447 159 | vt 0.419706 0.080294 160 | vt 0.449553 0.116663 161 | vt 0.485388 0.203178 162 | vt 0.490000 0.250000 163 | vt 0.485388 0.296822 164 | vt 0.471731 0.341844 165 | vt 0.449553 0.383337 166 | vt 0.419706 0.419706 167 | vt 0.383337 0.449553 168 | vt 0.000000 1.000000 169 | vt 0.703179 0.485389 170 | vt 0.750000 0.490000 171 | vt 0.796822 0.485388 172 | vt 0.841844 0.471731 173 | vt 0.883337 0.449553 174 | vt 0.919706 0.419706 175 | vt 0.949553 0.383337 176 | vt 0.971731 0.341844 177 | vt 0.990000 0.250000 178 | vt 0.985388 0.203178 179 | vt 0.971731 0.158156 180 | vt 0.949553 0.116663 181 | vt 0.919706 0.080294 182 | vt 0.883337 0.050447 183 | vt 0.841844 0.028269 184 | vt 0.750000 0.010000 185 | vt 0.703178 0.014612 186 | vt 0.658156 0.028269 187 | vt 0.616663 0.050447 188 | vt 0.580294 0.080294 189 | vt 0.550447 0.116663 190 | vt 0.528269 0.158156 191 | vt 0.510000 0.250000 192 | vt 0.514612 0.296822 193 | vt 0.528269 0.341844 194 | vt 0.550447 0.383337 195 | vt 0.580295 0.419706 196 | vt 0.616663 0.449553 197 | vt 0.658156 0.471731 198 | vn -0.9952 0.0980 0.0000 199 | vn -0.9569 0.2903 0.0000 200 | vn -0.8819 0.4714 0.0000 201 | vn -0.7730 0.6344 0.0000 202 | vn -0.6344 0.7730 0.0000 203 | vn -0.4714 0.8819 0.0000 204 | vn -0.2903 0.9569 0.0000 205 | vn -0.0980 0.9952 0.0000 206 | vn 0.0980 0.9952 0.0000 207 | vn 0.2903 0.9569 0.0000 208 | vn 0.4714 0.8819 0.0000 209 | vn 0.6344 0.7730 0.0000 210 | vn 0.7730 0.6344 0.0000 211 | vn 0.8819 0.4714 0.0000 212 | vn 0.9569 0.2903 0.0000 213 | vn 0.9952 0.0980 0.0000 214 | vn 0.9952 -0.0980 0.0000 215 | vn 0.9569 -0.2903 0.0000 216 | vn 0.8819 -0.4714 0.0000 217 | vn 0.7730 -0.6344 0.0000 218 | vn 0.6344 -0.7730 0.0000 219 | vn 0.4714 -0.8819 0.0000 220 | vn 0.2903 -0.9569 0.0000 221 | vn 0.0980 -0.9952 0.0000 222 | vn -0.0980 -0.9952 0.0000 223 | vn -0.2903 -0.9569 0.0000 224 | vn -0.4714 -0.8819 0.0000 225 | vn -0.6344 -0.7730 0.0000 226 | vn -0.7730 -0.6344 0.0000 227 | vn -0.8819 -0.4714 0.0000 228 | vn 0.0000 0.0000 1.0000 229 | vn -0.9569 -0.2903 0.0000 230 | vn -0.9952 -0.0980 0.0000 231 | vn 0.0000 0.0000 -1.0000 232 | s off 233 | f 2/1/1 3/2/1 1/3/1 234 | f 4/4/2 5/5/2 3/2/2 235 | f 6/6/3 7/7/3 5/5/3 236 | f 8/8/4 9/9/4 7/7/4 237 | f 10/10/5 11/11/5 9/9/5 238 | f 12/12/6 13/13/6 11/11/6 239 | f 14/14/7 15/15/7 13/13/7 240 | f 16/16/8 17/17/8 15/15/8 241 | f 18/18/9 19/19/9 17/17/9 242 | f 20/20/10 21/21/10 19/19/10 243 | f 22/22/11 23/23/11 21/21/11 244 | f 24/24/12 25/25/12 23/23/12 245 | f 26/26/13 27/27/13 25/25/13 246 | f 28/28/14 29/29/14 27/27/14 247 | f 30/30/15 31/31/15 29/29/15 248 | f 32/32/16 33/33/16 31/31/16 249 | f 34/34/17 35/35/17 33/33/17 250 | f 36/36/18 37/37/18 35/35/18 251 | f 38/38/19 39/39/19 37/37/19 252 | f 40/40/20 41/41/20 39/39/20 253 | f 42/42/21 43/43/21 41/41/21 254 | f 44/44/22 45/45/22 43/43/22 255 | f 46/46/23 47/47/23 45/45/23 256 | f 48/48/24 49/49/24 47/47/24 257 | f 50/50/25 51/51/25 49/49/25 258 | f 52/52/26 53/53/26 51/51/26 259 | f 54/54/27 55/55/27 53/53/27 260 | f 56/56/28 57/57/28 55/55/28 261 | f 58/58/29 59/59/29 57/57/29 262 | f 60/60/30 61/61/30 59/59/30 263 | f 54/62/31 38/63/31 22/64/31 264 | f 62/65/32 63/66/32 61/61/32 265 | f 64/67/33 1/68/33 63/66/33 266 | f 15/69/34 31/70/34 47/71/34 267 | f 2/1/1 4/4/1 3/2/1 268 | f 4/4/2 6/6/2 5/5/2 269 | f 6/6/3 8/8/3 7/7/3 270 | f 8/8/4 10/10/4 9/9/4 271 | f 10/10/5 12/12/5 11/11/5 272 | f 12/12/6 14/14/6 13/13/6 273 | f 14/14/7 16/16/7 15/15/7 274 | f 16/16/8 18/18/8 17/17/8 275 | f 18/18/9 20/20/9 19/19/9 276 | f 20/20/10 22/22/10 21/21/10 277 | f 22/22/11 24/24/11 23/23/11 278 | f 24/24/12 26/26/12 25/25/12 279 | f 26/26/13 28/28/13 27/27/13 280 | f 28/28/14 30/30/14 29/29/14 281 | f 30/30/15 32/32/15 31/31/15 282 | f 32/32/16 34/34/16 33/33/16 283 | f 34/34/17 36/36/17 35/35/17 284 | f 36/36/18 38/38/18 37/37/18 285 | f 38/38/19 40/40/19 39/39/19 286 | f 40/40/20 42/42/20 41/41/20 287 | f 42/42/21 44/44/21 43/43/21 288 | f 44/44/22 46/46/22 45/45/22 289 | f 46/46/23 48/48/23 47/47/23 290 | f 48/48/24 50/50/24 49/49/24 291 | f 50/50/25 52/52/25 51/51/25 292 | f 52/52/26 54/54/26 53/53/26 293 | f 54/54/27 56/56/27 55/55/27 294 | f 56/56/28 58/58/28 57/57/28 295 | f 58/58/29 60/60/29 59/59/29 296 | f 60/60/30 62/65/30 61/61/30 297 | f 6/72/31 4/73/31 2/74/31 298 | f 2/74/31 64/75/31 6/72/31 299 | f 64/75/31 62/76/31 6/72/31 300 | f 62/76/31 60/77/31 58/78/31 301 | f 58/78/31 56/79/31 54/62/31 302 | f 54/62/31 52/80/31 50/81/31 303 | f 50/81/31 48/82/31 54/62/31 304 | f 48/82/31 46/83/31 54/62/31 305 | f 46/83/31 44/84/31 38/63/31 306 | f 44/84/31 42/85/31 38/63/31 307 | f 42/85/31 40/86/31 38/63/31 308 | f 38/63/31 36/87/31 34/88/31 309 | f 34/88/31 32/89/31 30/90/31 310 | f 30/90/31 28/91/31 26/92/31 311 | f 26/92/31 24/93/31 22/64/31 312 | f 22/64/31 20/94/31 18/95/31 313 | f 18/95/31 16/96/31 22/64/31 314 | f 16/96/31 14/97/31 22/64/31 315 | f 14/97/31 12/98/31 10/99/31 316 | f 10/99/31 8/100/31 6/72/31 317 | f 62/76/31 58/78/31 6/72/31 318 | f 58/78/31 54/62/31 6/72/31 319 | f 38/63/31 34/88/31 22/64/31 320 | f 34/88/31 30/90/31 22/64/31 321 | f 30/90/31 26/92/31 22/64/31 322 | f 14/97/31 10/99/31 22/64/31 323 | f 10/99/31 6/72/31 22/64/31 324 | f 54/62/31 46/83/31 38/63/31 325 | f 6/72/31 54/62/31 22/64/31 326 | f 62/65/32 64/67/32 63/66/32 327 | f 64/67/33 2/101/33 1/68/33 328 | f 63/102/34 1/103/34 3/104/34 329 | f 3/104/34 5/105/34 7/106/34 330 | f 7/106/34 9/107/34 11/108/34 331 | f 11/108/34 13/109/34 7/106/34 332 | f 13/109/34 15/69/34 7/106/34 333 | f 15/69/34 17/110/34 19/111/34 334 | f 19/111/34 21/112/34 15/69/34 335 | f 21/112/34 23/113/34 15/69/34 336 | f 23/113/34 25/114/34 31/70/34 337 | f 25/114/34 27/115/34 31/70/34 338 | f 27/115/34 29/116/34 31/70/34 339 | f 31/70/34 33/117/34 35/118/34 340 | f 35/118/34 37/119/34 39/120/34 341 | f 39/120/34 41/121/34 43/122/34 342 | f 43/122/34 45/123/34 47/71/34 343 | f 47/71/34 49/124/34 51/125/34 344 | f 51/125/34 53/126/34 55/127/34 345 | f 55/127/34 57/128/34 63/102/34 346 | f 57/128/34 59/129/34 63/102/34 347 | f 59/129/34 61/130/34 63/102/34 348 | f 63/102/34 3/104/34 7/106/34 349 | f 31/70/34 35/118/34 47/71/34 350 | f 35/118/34 39/120/34 47/71/34 351 | f 39/120/34 43/122/34 47/71/34 352 | f 47/71/34 51/125/34 63/102/34 353 | f 51/125/34 55/127/34 63/102/34 354 | f 63/102/34 7/106/34 15/69/34 355 | f 15/69/34 23/113/34 31/70/34 356 | f 63/102/34 15/69/34 47/71/34 357 | -------------------------------------------------------------------------------- /assets/earth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groverburger/g3d/b72a98c1bc8318411d4cd32d1ed6bffd434bc274/assets/earth.png -------------------------------------------------------------------------------- /assets/moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groverburger/g3d/b72a98c1bc8318411d4cd32d1ed6bffd434bc274/assets/moon.png -------------------------------------------------------------------------------- /assets/plane.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.91.2 OBJ File: '' 2 | # www.blender.org 3 | o Plane 4 | v 1.000000 -1.000000 0.000000 5 | v 1.000000 1.000000 0.000000 6 | v -1.000000 -1.000000 0.000000 7 | v -1.000000 1.000000 0.000000 8 | vt 1.000000 0.000000 9 | vt 0.000000 1.000000 10 | vt 0.000000 0.000000 11 | vt 1.000000 1.000000 12 | vn 0.0000 0.0000 1.0000 13 | s off 14 | f 2/1/1 3/2/1 1/3/1 15 | f 2/1/1 4/4/1 3/2/1 16 | -------------------------------------------------------------------------------- /assets/soccerball.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.91.2 OBJ File: '' 2 | # www.blender.org 3 | o Icosphere 4 | v -0.000000 1.000000 0.000000 5 | v -0.723607 0.447219 0.525725 6 | v 0.276388 0.447220 0.850649 7 | v 0.894426 0.447216 0.000000 8 | v 0.276388 0.447220 -0.850649 9 | v -0.723607 0.447219 -0.525725 10 | v -0.276388 -0.447220 0.850649 11 | v 0.723607 -0.447219 0.525725 12 | v 0.723607 -0.447219 -0.525725 13 | v -0.276388 -0.447220 -0.850649 14 | v -0.894426 -0.447216 -0.000000 15 | v 0.000000 -1.000000 -0.000000 16 | v 0.162455 0.850654 0.499995 17 | v -0.425323 0.850654 0.309011 18 | v -0.262869 0.525738 0.809012 19 | v -0.850648 0.525736 0.000000 20 | v -0.425323 0.850654 -0.309011 21 | v 0.525730 0.850652 0.000000 22 | v 0.688189 0.525736 0.499997 23 | v 0.162455 0.850654 -0.499995 24 | v 0.688189 0.525736 -0.499997 25 | v -0.262869 0.525738 -0.809012 26 | v -0.951058 -0.000000 0.309013 27 | v -0.951058 -0.000000 -0.309013 28 | v 0.000000 -0.000000 1.000000 29 | v -0.587786 -0.000000 0.809017 30 | v 0.951058 0.000000 0.309013 31 | v 0.587786 0.000000 0.809017 32 | v 0.587786 0.000000 -0.809017 33 | v 0.951058 0.000000 -0.309013 34 | v -0.587786 -0.000000 -0.809017 35 | v -0.000000 0.000000 -1.000000 36 | v -0.688189 -0.525736 0.499997 37 | v 0.262869 -0.525738 0.809012 38 | v 0.850648 -0.525736 -0.000000 39 | v 0.262869 -0.525738 -0.809012 40 | v -0.688189 -0.525736 -0.499997 41 | v -0.162455 -0.850654 0.499995 42 | v -0.525730 -0.850652 -0.000000 43 | v 0.425323 -0.850654 0.309011 44 | v 0.425323 -0.850654 -0.309011 45 | v -0.162455 -0.850654 -0.499995 46 | vt 0.921101 0.503731 47 | vt 0.853200 0.350950 48 | vt 0.948737 0.256524 49 | vt 0.772128 0.243803 50 | vt 0.772128 0.503731 51 | vt 0.000920 0.503731 52 | vt 0.028556 0.256524 53 | vt 0.081991 0.503731 54 | vt 0.028556 0.750938 55 | vt 0.948737 0.750938 56 | vt 0.853200 0.656512 57 | vt 0.691056 0.350949 58 | vt 1.002171 0.083154 59 | vt 0.853199 0.103741 60 | vt 1.023345 0.005489 61 | vt 0.163063 0.503731 62 | vt 0.135426 0.256523 63 | vt 0.230965 0.350949 64 | vt 0.081989 0.924308 65 | vt 0.135426 0.750939 66 | vt 0.230965 0.903724 67 | vt 0.772128 0.763659 68 | vt 0.853199 0.903721 69 | vt 0.691056 0.903724 70 | vt 0.691056 0.103738 71 | vt 0.081989 0.083154 72 | vt 0.163063 0.009312 73 | vt 0.230965 0.103738 74 | vt 0.230965 0.656512 75 | vt 1.002171 0.924308 76 | vt 0.623154 0.998149 77 | vt 0.691056 0.656512 78 | vt 0.542080 0.083154 79 | vt 0.595516 0.256523 80 | vt 0.488647 0.256524 81 | vt 0.312038 0.243803 82 | vt 0.393109 0.103741 83 | vt 0.393109 0.350950 84 | vt 0.312038 0.763659 85 | vt 0.312038 0.503731 86 | vt 0.393109 0.656512 87 | vt 0.542080 0.924308 88 | vt 0.393109 0.903721 89 | vt 0.488647 0.750938 90 | vt 0.623154 0.503731 91 | vt 0.595516 0.750938 92 | vt 0.542082 0.503731 93 | vt 0.461011 0.503731 94 | vn -0.1024 0.9435 0.3151 95 | vn -0.7002 0.6617 0.2680 96 | vn 0.2680 0.9435 0.1947 97 | vn 0.2680 0.9435 -0.1947 98 | vn -0.1024 0.9435 -0.3151 99 | vn -0.9050 0.3304 0.2680 100 | vn -0.0247 0.3304 0.9435 101 | vn 0.8897 0.3304 0.3151 102 | vn 0.5746 0.3304 -0.7488 103 | vn -0.5346 0.3304 -0.7779 104 | vn -0.8026 0.1256 0.5831 105 | vn 0.3066 0.1256 0.9435 106 | vn 0.9921 0.1256 0.0000 107 | vn 0.3066 0.1256 -0.9435 108 | vn -0.8026 0.1256 -0.5831 109 | vn -0.4089 -0.6617 0.6284 110 | vn 0.4713 -0.6617 0.5831 111 | vn 0.7002 -0.6617 -0.2680 112 | vn -0.0385 -0.6617 -0.7488 113 | vn -0.7240 -0.6617 -0.1947 114 | vn -0.2680 -0.9435 -0.1947 115 | vn -0.4911 -0.7947 -0.3568 116 | vn -0.4089 -0.6617 -0.6284 117 | vn 0.1024 -0.9435 -0.3151 118 | vn 0.1876 -0.7947 -0.5773 119 | vn 0.4713 -0.6617 -0.5831 120 | vn 0.3313 -0.9435 0.0000 121 | vn 0.6071 -0.7947 -0.0000 122 | vn 0.7002 -0.6617 0.2680 123 | vn 0.1024 -0.9435 0.3151 124 | vn 0.1876 -0.7947 0.5773 125 | vn -0.0385 -0.6617 0.7488 126 | vn -0.2680 -0.9435 0.1947 127 | vn -0.4911 -0.7947 0.3568 128 | vn -0.7240 -0.6617 0.1947 129 | vn -0.8897 -0.3304 -0.3151 130 | vn -0.7947 -0.1876 -0.5773 131 | vn -0.5746 -0.3304 -0.7488 132 | vn 0.0247 -0.3304 -0.9435 133 | vn 0.3035 -0.1876 -0.9342 134 | vn 0.5346 -0.3304 -0.7779 135 | vn 0.9050 -0.3304 -0.2680 136 | vn 0.9822 -0.1876 0.0000 137 | vn 0.9050 -0.3304 0.2680 138 | vn 0.5346 -0.3304 0.7779 139 | vn 0.3035 -0.1876 0.9342 140 | vn 0.0247 -0.3304 0.9435 141 | vn -0.5746 -0.3304 0.7488 142 | vn -0.7947 -0.1876 0.5773 143 | vn -0.8897 -0.3304 0.3151 144 | vn -0.3066 -0.1256 -0.9435 145 | vn -0.3035 0.1876 -0.9342 146 | vn -0.0247 0.3304 -0.9435 147 | vn 0.8026 -0.1256 -0.5831 148 | vn 0.7947 0.1876 -0.5773 149 | vn 0.8897 0.3304 -0.3151 150 | vn 0.8026 -0.1256 0.5831 151 | vn 0.7947 0.1876 0.5773 152 | vn 0.5746 0.3304 0.7488 153 | vn -0.3066 -0.1256 0.9435 154 | vn -0.3035 0.1876 0.9342 155 | vn -0.5346 0.3304 0.7779 156 | vn -0.9921 -0.1256 0.0000 157 | vn -0.9822 0.1876 0.0000 158 | vn -0.9050 0.3304 -0.2680 159 | vn -0.4713 0.6617 -0.5831 160 | vn -0.1876 0.7947 -0.5773 161 | vn 0.0385 0.6617 -0.7488 162 | vn 0.4089 0.6617 -0.6284 163 | vn 0.4911 0.7947 -0.3568 164 | vn 0.7240 0.6617 -0.1947 165 | vn 0.7240 0.6617 0.1947 166 | vn 0.4911 0.7947 0.3568 167 | vn 0.4089 0.6617 0.6284 168 | vn -0.7002 0.6617 -0.2680 169 | vn -0.6071 0.7947 0.0000 170 | vn -0.3313 0.9435 0.0000 171 | vn 0.0385 0.6617 0.7488 172 | vn -0.1876 0.7947 0.5773 173 | vn -0.4713 0.6617 0.5831 174 | s off 175 | f 1/1/1 14/2/1 13/3/1 176 | f 2/4/2 14/2/2 16/5/2 177 | f 1/6/3 13/7/3 18/8/3 178 | f 1/6/4 18/8/4 20/9/4 179 | f 1/1/5 20/10/5 17/11/5 180 | f 2/4/6 16/5/6 23/12/6 181 | f 3/13/7 15/14/7 25/15/7 182 | f 4/16/8 19/17/8 27/18/8 183 | f 5/19/9 21/20/9 29/21/9 184 | f 6/22/10 22/23/10 31/24/10 185 | f 2/4/11 23/12/11 26/25/11 186 | f 3/26/12 25/27/12 28/28/12 187 | f 4/16/13 27/18/13 30/29/13 188 | f 5/30/14 29/21/14 32/31/14 189 | f 6/22/15 31/24/15 24/32/15 190 | f 7/33/16 33/34/16 38/35/16 191 | f 8/36/17 34/37/17 40/38/17 192 | f 9/39/18 35/40/18 41/41/18 193 | f 10/42/19 36/43/19 42/44/19 194 | f 11/45/20 37/46/20 39/47/20 195 | f 39/47/21 42/44/21 12/48/21 196 | f 39/47/22 37/46/22 42/44/22 197 | f 37/46/23 10/42/23 42/44/23 198 | f 42/44/24 41/41/24 12/48/24 199 | f 42/44/25 36/43/25 41/41/25 200 | f 36/43/26 9/39/26 41/41/26 201 | f 41/41/27 40/38/27 12/48/27 202 | f 41/41/28 35/40/28 40/38/28 203 | f 35/40/29 8/36/29 40/38/29 204 | f 40/38/30 38/35/30 12/48/30 205 | f 40/38/31 34/37/31 38/35/31 206 | f 34/37/32 7/33/32 38/35/32 207 | f 38/35/33 39/47/33 12/48/33 208 | f 38/35/34 33/34/34 39/47/34 209 | f 33/34/35 11/45/35 39/47/35 210 | f 24/32/36 37/46/36 11/45/36 211 | f 24/32/37 31/24/37 37/46/37 212 | f 31/24/38 10/42/38 37/46/38 213 | f 32/31/39 36/43/39 10/42/39 214 | f 32/31/40 29/21/40 36/43/40 215 | f 29/21/41 9/39/41 36/43/41 216 | f 30/29/42 35/40/42 9/39/42 217 | f 30/29/43 27/18/43 35/40/43 218 | f 27/18/44 8/36/44 35/40/44 219 | f 28/28/45 34/37/45 8/36/45 220 | f 28/28/46 25/27/46 34/37/46 221 | f 25/27/47 7/33/47 34/37/47 222 | f 26/25/48 33/34/48 7/33/48 223 | f 26/25/49 23/12/49 33/34/49 224 | f 23/12/50 11/45/50 33/34/50 225 | f 31/24/51 32/31/51 10/42/51 226 | f 31/24/52 22/23/52 32/31/52 227 | f 22/23/53 5/30/53 32/31/53 228 | f 29/21/54 30/29/54 9/39/54 229 | f 29/21/55 21/20/55 30/29/55 230 | f 21/20/56 4/16/56 30/29/56 231 | f 27/18/57 28/28/57 8/36/57 232 | f 27/18/58 19/17/58 28/28/58 233 | f 19/17/59 3/26/59 28/28/59 234 | f 25/15/60 26/25/60 7/33/60 235 | f 25/15/61 15/14/61 26/25/61 236 | f 15/14/62 2/4/62 26/25/62 237 | f 23/12/63 24/32/63 11/45/63 238 | f 23/12/64 16/5/64 24/32/64 239 | f 16/5/65 6/22/65 24/32/65 240 | f 17/11/66 22/23/66 6/22/66 241 | f 17/11/67 20/10/67 22/23/67 242 | f 20/10/68 5/30/68 22/23/68 243 | f 20/9/69 21/20/69 5/19/69 244 | f 20/9/70 18/8/70 21/20/70 245 | f 18/8/71 4/16/71 21/20/71 246 | f 18/8/72 19/17/72 4/16/72 247 | f 18/8/73 13/7/73 19/17/73 248 | f 13/7/74 3/26/74 19/17/74 249 | f 16/5/75 17/11/75 6/22/75 250 | f 16/5/76 14/2/76 17/11/76 251 | f 14/2/77 1/1/77 17/11/77 252 | f 13/3/78 15/14/78 3/13/78 253 | f 13/3/79 14/2/79 15/14/79 254 | f 14/2/80 2/4/80 15/14/80 255 | -------------------------------------------------------------------------------- /assets/sphere.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.91.2 OBJ File: '' 2 | # www.blender.org 3 | o Sphere 4 | v 0.195090 0.000000 0.980785 5 | v 0.382683 0.000000 0.923880 6 | v 0.555570 0.000000 0.831470 7 | v 0.707107 0.000000 0.707107 8 | v 0.831470 0.000000 0.555570 9 | v 0.923880 0.000000 0.382683 10 | v 0.980785 0.000000 0.195090 11 | v 1.000000 0.000000 0.000000 12 | v 0.980785 0.000000 -0.195090 13 | v 0.555570 0.000000 -0.831470 14 | v 0.191342 -0.038060 0.980785 15 | v 0.375330 -0.074658 0.923880 16 | v 0.544895 -0.108386 0.831470 17 | v 0.693520 -0.137950 0.707107 18 | v 0.815493 -0.162212 0.555570 19 | v 0.906127 -0.180240 0.382683 20 | v 0.961940 -0.191342 0.195090 21 | v 0.980785 -0.195090 0.000000 22 | v 0.961940 -0.191342 -0.195090 23 | v 0.906127 -0.180240 -0.382683 24 | v 0.815493 -0.162212 -0.555570 25 | v 0.693520 -0.137950 -0.707107 26 | v 0.544895 -0.108386 -0.831470 27 | v 0.375330 -0.074658 -0.923880 28 | v 0.191341 -0.038060 -0.980785 29 | v 0.180240 -0.074658 0.980785 30 | v 0.353553 -0.146447 0.923880 31 | v 0.513280 -0.212608 0.831470 32 | v 0.653281 -0.270598 0.707107 33 | v 0.768178 -0.318190 0.555570 34 | v 0.853553 -0.353553 0.382683 35 | v 0.906127 -0.375330 0.195090 36 | v 0.923879 -0.382684 0.000000 37 | v 0.906127 -0.375330 -0.195090 38 | v 0.853553 -0.353554 -0.382683 39 | v 0.768178 -0.318190 -0.555570 40 | v 0.653281 -0.270598 -0.707107 41 | v 0.513280 -0.212608 -0.831470 42 | v 0.353553 -0.146447 -0.923880 43 | v 0.180240 -0.074658 -0.980785 44 | v 0.162212 -0.108387 0.980785 45 | v 0.318190 -0.212608 0.923880 46 | v 0.461940 -0.308658 0.831470 47 | v 0.587938 -0.392848 0.707107 48 | v 0.691342 -0.461940 0.555570 49 | v 0.768178 -0.513280 0.382683 50 | v 0.815493 -0.544895 0.195090 51 | v 0.831469 -0.555570 0.000000 52 | v 0.815493 -0.544895 -0.195090 53 | v 0.768178 -0.513280 -0.382683 54 | v 0.691342 -0.461940 -0.555570 55 | v 0.587938 -0.392848 -0.707107 56 | v 0.461940 -0.308658 -0.831470 57 | v 0.318189 -0.212608 -0.923880 58 | v 0.162211 -0.108386 -0.980785 59 | v 0.137950 -0.137950 0.980785 60 | v 0.270598 -0.270598 0.923880 61 | v 0.392847 -0.392848 0.831470 62 | v 0.500000 -0.500000 0.707107 63 | v 0.587938 -0.587938 0.555570 64 | v 0.653281 -0.653282 0.382683 65 | v 0.693520 -0.693520 0.195090 66 | v 0.707107 -0.707107 0.000000 67 | v 0.693520 -0.693520 -0.195090 68 | v 0.653281 -0.653282 -0.382683 69 | v 0.587938 -0.587938 -0.555570 70 | v 0.500000 -0.500000 -0.707107 71 | v 0.392847 -0.392848 -0.831470 72 | v 0.270598 -0.270598 -0.923880 73 | v 0.137949 -0.137950 -0.980785 74 | v 0.108386 -0.162212 0.980785 75 | v 0.212607 -0.318190 0.923880 76 | v 0.308658 -0.461940 0.831470 77 | v 0.392847 -0.587938 0.707107 78 | v 0.461940 -0.691342 0.555570 79 | v 0.513280 -0.768178 0.382683 80 | v 0.544895 -0.815493 0.195090 81 | v 0.555570 -0.831470 0.000000 82 | v 0.544895 -0.815493 -0.195090 83 | v 0.513280 -0.768178 -0.382683 84 | v 0.461940 -0.691342 -0.555570 85 | v 0.392847 -0.587938 -0.707107 86 | v 0.308658 -0.461940 -0.831470 87 | v 0.212607 -0.318190 -0.923880 88 | v 0.108386 -0.162212 -0.980785 89 | v 0.074658 -0.180240 0.980785 90 | v 0.146446 -0.353554 0.923880 91 | v 0.212607 -0.513280 0.831470 92 | v 0.270598 -0.653282 0.707107 93 | v 0.318189 -0.768178 0.555570 94 | v 0.353553 -0.853554 0.382683 95 | v 0.375330 -0.906128 0.195090 96 | v 0.382683 -0.923880 0.000000 97 | v 0.375330 -0.906128 -0.195090 98 | v 0.353553 -0.853554 -0.382683 99 | v 0.318189 -0.768178 -0.555570 100 | v 0.270598 -0.653282 -0.707107 101 | v 0.212607 -0.513280 -0.831470 102 | v 0.146446 -0.353554 -0.923880 103 | v 0.074658 -0.180240 -0.980785 104 | v 0.038060 -0.191342 0.980785 105 | v 0.074658 -0.375331 0.923880 106 | v 0.108386 -0.544895 0.831470 107 | v 0.137949 -0.693520 0.707107 108 | v 0.162211 -0.815493 0.555570 109 | v 0.180240 -0.906128 0.382683 110 | v 0.191341 -0.961940 0.195090 111 | v 0.195090 -0.980785 0.000000 112 | v 0.191341 -0.961940 -0.195090 113 | v 0.180240 -0.906128 -0.382683 114 | v 0.162211 -0.815493 -0.555570 115 | v 0.137949 -0.693520 -0.707107 116 | v 0.108386 -0.544895 -0.831470 117 | v 0.074658 -0.375330 -0.923880 118 | v 0.038060 -0.191342 -0.980785 119 | v -0.000000 -0.195091 0.980785 120 | v -0.000000 -0.382684 0.923880 121 | v -0.000000 -0.555570 0.831470 122 | v -0.000000 -0.707107 0.707107 123 | v -0.000000 -0.831470 0.555570 124 | v -0.000000 -0.923880 0.382683 125 | v -0.000000 -0.980785 0.195090 126 | v -0.000000 -1.000000 0.000000 127 | v -0.000000 -0.980785 -0.195090 128 | v -0.000000 -0.923880 -0.382683 129 | v -0.000000 -0.831470 -0.555570 130 | v -0.000000 -0.707107 -0.707107 131 | v -0.000000 -0.555570 -0.831470 132 | v -0.000000 -0.382684 -0.923880 133 | v -0.000000 -0.195090 -0.980785 134 | v -0.038061 -0.191342 0.980785 135 | v -0.074658 -0.375331 0.923880 136 | v -0.108387 -0.544895 0.831470 137 | v -0.137950 -0.693520 0.707107 138 | v -0.162212 -0.815493 0.555570 139 | v -0.180240 -0.906128 0.382683 140 | v -0.191342 -0.961940 0.195090 141 | v -0.195091 -0.980785 0.000000 142 | v -0.191342 -0.961940 -0.195090 143 | v -0.180240 -0.906128 -0.382683 144 | v -0.162212 -0.815493 -0.555570 145 | v -0.137950 -0.693520 -0.707107 146 | v -0.108387 -0.544895 -0.831470 147 | v -0.074658 -0.375330 -0.923880 148 | v -0.038061 -0.191342 -0.980785 149 | v -0.074658 -0.180240 0.980785 150 | v -0.146447 -0.353554 0.923880 151 | v -0.212608 -0.513280 0.831470 152 | v -0.270598 -0.653282 0.707107 153 | v -0.318190 -0.768178 0.555570 154 | v -0.353554 -0.853554 0.382683 155 | v -0.375331 -0.906127 0.195090 156 | v -0.382684 -0.923880 0.000000 157 | v -0.375331 -0.906127 -0.195090 158 | v -0.353554 -0.853554 -0.382683 159 | v -0.318190 -0.768178 -0.555570 160 | v -0.270598 -0.653282 -0.707107 161 | v -0.212608 -0.513280 -0.831470 162 | v -0.146447 -0.353553 -0.923880 163 | v -0.074658 -0.180240 -0.980785 164 | v -0.108387 -0.162212 0.980785 165 | v -0.212608 -0.318190 0.923880 166 | v -0.308659 -0.461940 0.831470 167 | v -0.392848 -0.587938 0.707107 168 | v -0.461940 -0.691342 0.555570 169 | v -0.513280 -0.768178 0.382683 170 | v -0.544895 -0.815493 0.195090 171 | v -0.555571 -0.831470 0.000000 172 | v -0.544895 -0.815493 -0.195090 173 | v -0.513280 -0.768178 -0.382683 174 | v -0.461940 -0.691342 -0.555570 175 | v -0.392848 -0.587938 -0.707107 176 | v -0.308659 -0.461940 -0.831470 177 | v -0.212608 -0.318190 -0.923880 178 | v -0.108387 -0.162212 -0.980785 179 | v -0.137950 -0.137950 0.980785 180 | v -0.270599 -0.270598 0.923880 181 | v -0.392848 -0.392848 0.831470 182 | v -0.500000 -0.500000 0.707107 183 | v -0.587938 -0.587938 0.555570 184 | v -0.653282 -0.653282 0.382683 185 | v -0.693520 -0.693520 0.195090 186 | v -0.707107 -0.707107 0.000000 187 | v -0.693520 -0.693520 -0.195090 188 | v -0.653282 -0.653282 -0.382683 189 | v -0.587938 -0.587938 -0.555570 190 | v -0.500000 -0.500000 -0.707107 191 | v -0.392848 -0.392848 -0.831470 192 | v -0.270598 -0.270598 -0.923880 193 | v -0.137950 -0.137950 -0.980785 194 | v -0.162212 -0.108386 0.980785 195 | v -0.318190 -0.212608 0.923880 196 | v -0.461940 -0.308658 0.831470 197 | v -0.587938 -0.392848 0.707107 198 | v -0.691342 -0.461940 0.555570 199 | v -0.768178 -0.513280 0.382683 200 | v -0.815493 -0.544895 0.195090 201 | v -0.831470 -0.555570 0.000000 202 | v -0.815493 -0.544895 -0.195090 203 | v -0.768178 -0.513280 -0.382683 204 | v -0.691342 -0.461940 -0.555570 205 | v -0.587938 -0.392848 -0.707107 206 | v -0.461940 -0.308658 -0.831470 207 | v -0.318190 -0.212608 -0.923880 208 | v -0.162212 -0.108386 -0.980785 209 | v -0.000000 0.000000 -1.000000 210 | v -0.180240 -0.074658 0.980785 211 | v -0.353554 -0.146447 0.923880 212 | v -0.513280 -0.212608 0.831470 213 | v -0.653282 -0.270598 0.707107 214 | v -0.768178 -0.318190 0.555570 215 | v -0.853554 -0.353553 0.382683 216 | v -0.906128 -0.375330 0.195090 217 | v -0.923880 -0.382683 0.000000 218 | v -0.906128 -0.375330 -0.195090 219 | v -0.853554 -0.353553 -0.382683 220 | v -0.768178 -0.318190 -0.555570 221 | v -0.653282 -0.270598 -0.707107 222 | v -0.513280 -0.212608 -0.831470 223 | v -0.353554 -0.146447 -0.923880 224 | v -0.180240 -0.074658 -0.980785 225 | v -0.191342 -0.038060 0.980785 226 | v -0.375331 -0.074658 0.923880 227 | v -0.544896 -0.108386 0.831470 228 | v -0.693520 -0.137950 0.707107 229 | v -0.815493 -0.162212 0.555570 230 | v -0.906128 -0.180240 0.382683 231 | v -0.961940 -0.191342 0.195090 232 | v -0.980786 -0.195090 0.000000 233 | v -0.961940 -0.191342 -0.195090 234 | v -0.906128 -0.180240 -0.382683 235 | v -0.815493 -0.162212 -0.555570 236 | v -0.693520 -0.137950 -0.707107 237 | v -0.544895 -0.108386 -0.831470 238 | v -0.375331 -0.074658 -0.923880 239 | v -0.191342 -0.038060 -0.980785 240 | v -0.195091 0.000000 0.980785 241 | v -0.382684 -0.000000 0.923880 242 | v -0.555571 -0.000000 0.831470 243 | v -0.707107 0.000000 0.707107 244 | v -0.831470 0.000000 0.555570 245 | v -0.923880 -0.000000 0.382683 246 | v -0.980785 0.000000 0.195090 247 | v -1.000000 0.000000 0.000000 248 | v -0.980785 0.000000 -0.195090 249 | v -0.923880 -0.000000 -0.382683 250 | v -0.831470 0.000000 -0.555570 251 | v -0.707107 0.000000 -0.707107 252 | v -0.555570 0.000000 -0.831470 253 | v -0.382684 -0.000000 -0.923880 254 | v -0.195091 -0.000000 -0.980785 255 | v -0.191342 0.038060 0.980785 256 | v -0.375331 0.074658 0.923880 257 | v -0.544896 0.108386 0.831470 258 | v -0.693520 0.137950 0.707107 259 | v -0.815493 0.162212 0.555570 260 | v -0.906128 0.180240 0.382683 261 | v -0.961940 0.191342 0.195090 262 | v -0.980786 0.195090 0.000000 263 | v -0.961940 0.191342 -0.195090 264 | v -0.906128 0.180240 -0.382683 265 | v -0.815493 0.162212 -0.555570 266 | v -0.693520 0.137950 -0.707107 267 | v -0.544895 0.108386 -0.831470 268 | v -0.375331 0.074658 -0.923880 269 | v -0.191342 0.038060 -0.980785 270 | v -0.180240 0.074658 0.980785 271 | v -0.353554 0.146447 0.923880 272 | v -0.513280 0.212608 0.831470 273 | v -0.653282 0.270598 0.707107 274 | v -0.768178 0.318190 0.555570 275 | v -0.853554 0.353553 0.382683 276 | v -0.906127 0.375330 0.195090 277 | v -0.923880 0.382684 0.000000 278 | v -0.906127 0.375330 -0.195090 279 | v -0.853554 0.353553 -0.382683 280 | v -0.768178 0.318190 -0.555570 281 | v -0.653282 0.270598 -0.707107 282 | v -0.513280 0.212608 -0.831470 283 | v -0.353554 0.146447 -0.923880 284 | v -0.180240 0.074658 -0.980785 285 | v -0.162212 0.108386 0.980785 286 | v -0.318190 0.212608 0.923880 287 | v -0.461940 0.308658 0.831470 288 | v -0.587938 0.392847 0.707107 289 | v -0.691342 0.461940 0.555570 290 | v -0.768178 0.513280 0.382683 291 | v -0.815493 0.544895 0.195090 292 | v -0.831470 0.555570 0.000000 293 | v -0.815493 0.544895 -0.195090 294 | v -0.768178 0.513280 -0.382683 295 | v -0.691342 0.461940 -0.555570 296 | v -0.587938 0.392847 -0.707107 297 | v -0.461940 0.308658 -0.831470 298 | v -0.318190 0.212607 -0.923880 299 | v -0.162212 0.108386 -0.980785 300 | v -0.000001 0.000000 1.000000 301 | v -0.137950 0.137950 0.980785 302 | v -0.270598 0.270598 0.923880 303 | v -0.392848 0.392848 0.831470 304 | v -0.500000 0.500000 0.707107 305 | v -0.587938 0.587938 0.555570 306 | v -0.653282 0.653281 0.382683 307 | v -0.693520 0.693520 0.195090 308 | v -0.707107 0.707107 0.000000 309 | v -0.693520 0.693520 -0.195090 310 | v -0.653282 0.653281 -0.382683 311 | v -0.587938 0.587938 -0.555570 312 | v -0.500000 0.500000 -0.707107 313 | v -0.392848 0.392847 -0.831470 314 | v -0.270598 0.270598 -0.923880 315 | v -0.137950 0.137950 -0.980785 316 | v -0.108387 0.162212 0.980785 317 | v -0.212608 0.318190 0.923880 318 | v -0.308659 0.461940 0.831470 319 | v -0.392848 0.587938 0.707107 320 | v -0.461940 0.691342 0.555570 321 | v -0.513280 0.768178 0.382683 322 | v -0.544895 0.815493 0.195090 323 | v -0.555570 0.831470 0.000000 324 | v -0.544895 0.815493 -0.195090 325 | v -0.513280 0.768178 -0.382683 326 | v -0.461940 0.691342 -0.555570 327 | v -0.392848 0.587938 -0.707107 328 | v -0.308658 0.461940 -0.831470 329 | v -0.212608 0.318190 -0.923880 330 | v -0.108387 0.162212 -0.980785 331 | v -0.074658 0.180240 0.980785 332 | v -0.146447 0.353553 0.923880 333 | v -0.212608 0.513280 0.831470 334 | v -0.270598 0.653281 0.707107 335 | v -0.318190 0.768177 0.555570 336 | v -0.353554 0.853553 0.382683 337 | v -0.375330 0.906127 0.195090 338 | v -0.382684 0.923880 0.000000 339 | v -0.375330 0.906127 -0.195090 340 | v -0.353554 0.853553 -0.382683 341 | v -0.318190 0.768177 -0.555570 342 | v -0.270598 0.653281 -0.707107 343 | v -0.212608 0.513280 -0.831470 344 | v -0.146447 0.353553 -0.923880 345 | v -0.074658 0.180240 -0.980785 346 | v -0.038061 0.191342 0.980785 347 | v -0.074658 0.375330 0.923880 348 | v -0.108387 0.544895 0.831470 349 | v -0.137950 0.693520 0.707107 350 | v -0.162212 0.815493 0.555570 351 | v -0.180240 0.906127 0.382683 352 | v -0.191342 0.961939 0.195090 353 | v -0.195090 0.980785 0.000000 354 | v -0.191342 0.961939 -0.195090 355 | v -0.180240 0.906127 -0.382683 356 | v -0.162212 0.815493 -0.555570 357 | v -0.137950 0.693520 -0.707107 358 | v -0.108387 0.544895 -0.831470 359 | v -0.074658 0.375330 -0.923880 360 | v -0.038061 0.191342 -0.980785 361 | v -0.000000 0.195090 0.980785 362 | v -0.000000 0.382683 0.923880 363 | v -0.000000 0.555570 0.831470 364 | v -0.000000 0.707107 0.707107 365 | v -0.000000 0.831469 0.555570 366 | v -0.000000 0.923879 0.382683 367 | v -0.000000 0.980785 0.195090 368 | v -0.000000 1.000000 0.000000 369 | v -0.000000 0.980785 -0.195090 370 | v -0.000000 0.923879 -0.382683 371 | v -0.000000 0.831469 -0.555570 372 | v -0.000000 0.707107 -0.707107 373 | v -0.000000 0.555570 -0.831470 374 | v -0.000000 0.382683 -0.923880 375 | v -0.000000 0.195090 -0.980785 376 | v 0.038060 0.191342 0.980785 377 | v 0.074658 0.375330 0.923880 378 | v 0.108386 0.544895 0.831470 379 | v 0.137949 0.693520 0.707107 380 | v 0.162211 0.815493 0.555570 381 | v 0.180240 0.906127 0.382683 382 | v 0.191342 0.961939 0.195090 383 | v 0.195090 0.980785 0.000000 384 | v 0.191342 0.961939 -0.195090 385 | v 0.180240 0.906127 -0.382683 386 | v 0.162211 0.815493 -0.555570 387 | v 0.137949 0.693520 -0.707107 388 | v 0.108386 0.544895 -0.831470 389 | v 0.074658 0.375330 -0.923880 390 | v 0.038060 0.191342 -0.980785 391 | v 0.074658 0.180240 0.980785 392 | v 0.146446 0.353553 0.923880 393 | v 0.212607 0.513280 0.831470 394 | v 0.270598 0.653281 0.707107 395 | v 0.318189 0.768177 0.555570 396 | v 0.353553 0.853553 0.382683 397 | v 0.375330 0.906127 0.195090 398 | v 0.382683 0.923879 0.000000 399 | v 0.375330 0.906127 -0.195090 400 | v 0.353553 0.853553 -0.382683 401 | v 0.318189 0.768177 -0.555570 402 | v 0.270598 0.653281 -0.707107 403 | v 0.212607 0.513280 -0.831470 404 | v 0.146446 0.353553 -0.923880 405 | v 0.074657 0.180240 -0.980785 406 | v 0.108386 0.162212 0.980785 407 | v 0.212607 0.318190 0.923880 408 | v 0.308658 0.461940 0.831470 409 | v 0.392847 0.587938 0.707107 410 | v 0.461939 0.691341 0.555570 411 | v 0.513280 0.768178 0.382683 412 | v 0.544895 0.815493 0.195090 413 | v 0.555570 0.831469 0.000000 414 | v 0.544895 0.815493 -0.195090 415 | v 0.513280 0.768178 -0.382683 416 | v 0.461939 0.691341 -0.555570 417 | v 0.392847 0.587938 -0.707107 418 | v 0.308658 0.461940 -0.831470 419 | v 0.212607 0.318189 -0.923880 420 | v 0.108386 0.162212 -0.980785 421 | v 0.137949 0.137950 0.980785 422 | v 0.270598 0.270598 0.923880 423 | v 0.392847 0.392847 0.831470 424 | v 0.500000 0.500000 0.707107 425 | v 0.587937 0.587937 0.555570 426 | v 0.653281 0.653281 0.382683 427 | v 0.693519 0.693519 0.195090 428 | v 0.707106 0.707106 0.000000 429 | v 0.693519 0.693519 -0.195090 430 | v 0.653281 0.653281 -0.382683 431 | v 0.587937 0.587937 -0.555570 432 | v 0.500000 0.500000 -0.707107 433 | v 0.392847 0.392847 -0.831470 434 | v 0.270598 0.270598 -0.923880 435 | v 0.137949 0.137950 -0.980785 436 | v 0.162211 0.108386 0.980785 437 | v 0.318189 0.212607 0.923880 438 | v 0.461939 0.308658 0.831470 439 | v 0.587937 0.392847 0.707107 440 | v 0.691341 0.461939 0.555570 441 | v 0.768177 0.513280 0.382683 442 | v 0.815492 0.544895 0.195090 443 | v 0.831469 0.555570 0.000000 444 | v 0.815492 0.544895 -0.195090 445 | v 0.768177 0.513280 -0.382683 446 | v 0.691341 0.461939 -0.555570 447 | v 0.587937 0.392847 -0.707107 448 | v 0.461939 0.308658 -0.831470 449 | v 0.318189 0.212607 -0.923880 450 | v 0.162211 0.108386 -0.980785 451 | v 0.180240 0.074658 0.980785 452 | v 0.353553 0.146447 0.923880 453 | v 0.513280 0.212607 0.831470 454 | v 0.653281 0.270598 0.707107 455 | v 0.768177 0.318189 0.555570 456 | v 0.853553 0.353553 0.382683 457 | v 0.906127 0.375330 0.195090 458 | v 0.923879 0.382683 0.000000 459 | v 0.906127 0.375330 -0.195090 460 | v 0.853553 0.353553 -0.382683 461 | v 0.768177 0.318189 -0.555570 462 | v 0.653281 0.270598 -0.707107 463 | v 0.513279 0.212607 -0.831470 464 | v 0.353553 0.146446 -0.923880 465 | v 0.180240 0.074658 -0.980785 466 | v 0.191342 0.038060 0.980785 467 | v 0.375330 0.074658 0.923880 468 | v 0.544895 0.108386 0.831470 469 | v 0.693520 0.137950 0.707107 470 | v 0.815492 0.162211 0.555570 471 | v 0.906127 0.180240 0.382683 472 | v 0.961939 0.191341 0.195090 473 | v 0.980785 0.195090 0.000000 474 | v 0.961939 0.191341 -0.195090 475 | v 0.906127 0.180240 -0.382683 476 | v 0.815492 0.162211 -0.555570 477 | v 0.693520 0.137950 -0.707107 478 | v 0.544895 0.108386 -0.831470 479 | v 0.375330 0.074658 -0.923880 480 | v 0.191341 0.038060 -0.980785 481 | v 0.923879 -0.000000 -0.382683 482 | v 0.831469 -0.000000 -0.555570 483 | v 0.707106 -0.000000 -0.707107 484 | v 0.382683 -0.000000 -0.923880 485 | v 0.195090 -0.000000 -0.980785 486 | vt 0.750000 0.687500 487 | vt 0.718750 0.750000 488 | vt 0.750000 0.750000 489 | vt 0.750000 0.250000 490 | vt 0.718750 0.312500 491 | vt 0.750000 0.312500 492 | vt 0.718750 0.812500 493 | vt 0.750000 0.812500 494 | vt 0.718750 0.375000 495 | vt 0.750000 0.375000 496 | vt 0.718750 0.875000 497 | vt 0.750000 0.875000 498 | vt 0.718750 0.437500 499 | vt 0.750000 0.437500 500 | vt 0.718750 0.937500 501 | vt 0.750000 0.937500 502 | vt 0.718750 0.500000 503 | vt 0.750000 0.500000 504 | vt 0.750000 0.062500 505 | vt 0.734375 0.000000 506 | vt 0.718750 0.062500 507 | vt 0.734375 1.000000 508 | vt 0.718750 0.562500 509 | vt 0.750000 0.562500 510 | vt 0.718750 0.125000 511 | vt 0.750000 0.125000 512 | vt 0.718750 0.625000 513 | vt 0.750000 0.625000 514 | vt 0.750000 0.187500 515 | vt 0.718750 0.187500 516 | vt 0.718750 0.687500 517 | vt 0.718750 0.250000 518 | vt 0.687500 0.687500 519 | vt 0.687500 0.250000 520 | vt 0.687500 0.750000 521 | vt 0.687500 0.312500 522 | vt 0.687500 0.812500 523 | vt 0.687500 0.375000 524 | vt 0.687500 0.875000 525 | vt 0.687500 0.437500 526 | vt 0.687500 0.937500 527 | vt 0.687500 0.500000 528 | vt 0.703125 0.000000 529 | vt 0.687500 0.062500 530 | vt 0.703125 1.000000 531 | vt 0.687500 0.562500 532 | vt 0.687500 0.125000 533 | vt 0.687500 0.625000 534 | vt 0.687500 0.187500 535 | vt 0.656250 0.937500 536 | vt 0.656250 0.500000 537 | vt 0.671875 0.000000 538 | vt 0.656250 0.062500 539 | vt 0.671875 1.000000 540 | vt 0.656250 0.562500 541 | vt 0.656250 0.125000 542 | vt 0.656250 0.625000 543 | vt 0.656250 0.187500 544 | vt 0.656250 0.687500 545 | vt 0.656250 0.250000 546 | vt 0.656250 0.750000 547 | vt 0.656250 0.312500 548 | vt 0.656250 0.812500 549 | vt 0.656250 0.375000 550 | vt 0.656250 0.875000 551 | vt 0.656250 0.437500 552 | vt 0.625000 0.250000 553 | vt 0.625000 0.750000 554 | vt 0.625000 0.312500 555 | vt 0.625000 0.812500 556 | vt 0.625000 0.375000 557 | vt 0.625000 0.875000 558 | vt 0.625000 0.437500 559 | vt 0.625000 0.937500 560 | vt 0.625000 0.500000 561 | vt 0.640625 0.000000 562 | vt 0.625000 0.062500 563 | vt 0.640625 1.000000 564 | vt 0.625000 0.562500 565 | vt 0.625000 0.125000 566 | vt 0.625000 0.625000 567 | vt 0.625000 0.187500 568 | vt 0.625000 0.687500 569 | vt 0.593750 0.437500 570 | vt 0.593750 0.500000 571 | vt 0.609375 0.000000 572 | vt 0.593750 0.062500 573 | vt 0.609375 1.000000 574 | vt 0.593750 0.937500 575 | vt 0.593750 0.562500 576 | vt 0.593750 0.125000 577 | vt 0.593750 0.625000 578 | vt 0.593750 0.187500 579 | vt 0.593750 0.687500 580 | vt 0.593750 0.250000 581 | vt 0.593750 0.750000 582 | vt 0.593750 0.312500 583 | vt 0.593750 0.812500 584 | vt 0.593750 0.375000 585 | vt 0.593750 0.875000 586 | vt 0.562500 0.687500 587 | vt 0.562500 0.750000 588 | vt 0.562500 0.250000 589 | vt 0.562500 0.312500 590 | vt 0.562500 0.812500 591 | vt 0.562500 0.375000 592 | vt 0.562500 0.875000 593 | vt 0.562500 0.437500 594 | vt 0.562500 0.937500 595 | vt 0.562500 0.500000 596 | vt 0.578125 0.000000 597 | vt 0.562500 0.062500 598 | vt 0.578125 1.000000 599 | vt 0.562500 0.562500 600 | vt 0.562500 0.125000 601 | vt 0.562500 0.625000 602 | vt 0.562500 0.187500 603 | vt 0.546875 1.000000 604 | vt 0.531250 0.937500 605 | vt 0.531250 0.562500 606 | vt 0.531250 0.125000 607 | vt 0.531250 0.625000 608 | vt 0.531250 0.187500 609 | vt 0.531250 0.687500 610 | vt 0.531250 0.250000 611 | vt 0.531250 0.750000 612 | vt 0.531250 0.312500 613 | vt 0.531250 0.812500 614 | vt 0.531250 0.375000 615 | vt 0.531250 0.875000 616 | vt 0.531250 0.437500 617 | vt 0.531250 0.500000 618 | vt 0.546875 0.000000 619 | vt 0.531250 0.062500 620 | vt 0.500000 0.750000 621 | vt 0.500000 0.812500 622 | vt 0.500000 0.375000 623 | vt 0.500000 0.875000 624 | vt 0.500000 0.437500 625 | vt 0.500000 0.937500 626 | vt 0.500000 0.500000 627 | vt 0.515625 0.000000 628 | vt 0.500000 0.062500 629 | vt 0.515625 1.000000 630 | vt 0.500000 0.562500 631 | vt 0.500000 0.125000 632 | vt 0.500000 0.625000 633 | vt 0.500000 0.187500 634 | vt 0.500000 0.687500 635 | vt 0.500000 0.250000 636 | vt 0.500000 0.312500 637 | vt 0.468750 0.062500 638 | vt 0.468750 0.125000 639 | vt 0.468750 0.625000 640 | vt 0.468750 0.187500 641 | vt 0.468750 0.687500 642 | vt 0.468750 0.250000 643 | vt 0.468750 0.750000 644 | vt 0.468750 0.312500 645 | vt 0.468750 0.812500 646 | vt 0.468750 0.375000 647 | vt 0.468750 0.875000 648 | vt 0.468750 0.437500 649 | vt 0.468750 0.937500 650 | vt 0.468750 0.500000 651 | vt 0.484374 0.000000 652 | vt 0.484375 1.000000 653 | vt 0.468750 0.562500 654 | vt 0.437500 0.375000 655 | vt 0.437500 0.812500 656 | vt 0.437500 0.875000 657 | vt 0.437500 0.437500 658 | vt 0.437500 0.937500 659 | vt 0.437500 0.500000 660 | vt 0.453124 0.000000 661 | vt 0.437500 0.062500 662 | vt 0.453125 1.000000 663 | vt 0.437500 0.562500 664 | vt 0.437500 0.125000 665 | vt 0.437500 0.625000 666 | vt 0.437500 0.187500 667 | vt 0.437500 0.687500 668 | vt 0.437500 0.250000 669 | vt 0.437500 0.750000 670 | vt 0.437500 0.312500 671 | vt 0.406250 0.625000 672 | vt 0.406250 0.187500 673 | vt 0.406250 0.687500 674 | vt 0.406250 0.250000 675 | vt 0.406250 0.750000 676 | vt 0.406250 0.312500 677 | vt 0.406250 0.812500 678 | vt 0.406250 0.375000 679 | vt 0.406250 0.875000 680 | vt 0.406250 0.437500 681 | vt 0.406250 0.937500 682 | vt 0.406250 0.500000 683 | vt 0.421874 0.000000 684 | vt 0.406250 0.062500 685 | vt 0.421875 1.000000 686 | vt 0.406250 0.562500 687 | vt 0.406250 0.125000 688 | vt 0.375000 0.875000 689 | vt 0.375000 0.375000 690 | vt 0.375000 0.437500 691 | vt 0.375000 0.937500 692 | vt 0.375000 0.500000 693 | vt 0.390625 0.000000 694 | vt 0.375000 0.062500 695 | vt 0.390625 1.000000 696 | vt 0.375000 0.562500 697 | vt 0.375000 0.125000 698 | vt 0.375000 0.625000 699 | vt 0.375000 0.187500 700 | vt 0.375000 0.687500 701 | vt 0.375000 0.250000 702 | vt 0.375000 0.750000 703 | vt 0.375000 0.312500 704 | vt 0.375000 0.812500 705 | vt 0.343750 0.187500 706 | vt 0.343750 0.625000 707 | vt 0.343750 0.687500 708 | vt 0.343750 0.250000 709 | vt 0.343750 0.750000 710 | vt 0.343750 0.312500 711 | vt 0.343750 0.812500 712 | vt 0.343750 0.375000 713 | vt 0.343750 0.875000 714 | vt 0.343750 0.437500 715 | vt 0.343750 0.937500 716 | vt 0.343750 0.500000 717 | vt 0.359375 0.000000 718 | vt 0.343750 0.062500 719 | vt 0.359375 1.000000 720 | vt 0.343750 0.562500 721 | vt 0.343750 0.125000 722 | vt 0.312500 0.375000 723 | vt 0.312500 0.437500 724 | vt 0.312500 0.937500 725 | vt 0.312500 0.500000 726 | vt 0.328125 0.000000 727 | vt 0.312500 0.062500 728 | vt 0.328125 1.000000 729 | vt 0.312500 0.562500 730 | vt 0.312500 0.125000 731 | vt 0.312500 0.625000 732 | vt 0.312500 0.187500 733 | vt 0.312500 0.687500 734 | vt 0.312500 0.250000 735 | vt 0.312500 0.750000 736 | vt 0.312500 0.312500 737 | vt 0.312500 0.812500 738 | vt 0.312500 0.875000 739 | vt 0.281250 0.625000 740 | vt 0.281250 0.687500 741 | vt 0.281250 0.250000 742 | vt 0.281250 0.750000 743 | vt 0.281250 0.312500 744 | vt 0.281250 0.812500 745 | vt 0.281250 0.375000 746 | vt 0.281250 0.875000 747 | vt 0.281250 0.437500 748 | vt 0.281250 0.937500 749 | vt 0.281250 0.500000 750 | vt 0.296875 0.000000 751 | vt 0.281250 0.062500 752 | vt 0.296875 1.000000 753 | vt 0.281250 0.562500 754 | vt 0.281250 0.125000 755 | vt 0.281250 0.187500 756 | vt 0.250000 0.875000 757 | vt 0.250000 0.937500 758 | vt 0.250000 0.500000 759 | vt 0.265625 0.000000 760 | vt 0.250000 0.062500 761 | vt 0.265625 1.000000 762 | vt 0.250000 0.562500 763 | vt 0.250000 0.125000 764 | vt 0.250000 0.625000 765 | vt 0.250000 0.187500 766 | vt 0.250000 0.687500 767 | vt 0.250000 0.250000 768 | vt 0.250000 0.750000 769 | vt 0.250000 0.312500 770 | vt 0.250000 0.812500 771 | vt 0.250000 0.375000 772 | vt 0.250000 0.437500 773 | vt 0.218750 0.750000 774 | vt 0.218750 0.250000 775 | vt 0.218750 0.312500 776 | vt 0.218750 0.812500 777 | vt 0.218750 0.375000 778 | vt 0.218750 0.875000 779 | vt 0.218750 0.437500 780 | vt 0.218750 0.937500 781 | vt 0.218750 0.500000 782 | vt 0.234375 0.000000 783 | vt 0.218750 0.062500 784 | vt 0.234375 1.000000 785 | vt 0.218750 0.562500 786 | vt 0.218750 0.125000 787 | vt 0.218750 0.625000 788 | vt 0.218750 0.187500 789 | vt 0.218750 0.687500 790 | vt 0.203125 0.000000 791 | vt 0.187500 0.062500 792 | vt 0.203125 1.000000 793 | vt 0.187500 0.937500 794 | vt 0.187500 0.500000 795 | vt 0.187500 0.562500 796 | vt 0.187500 0.125000 797 | vt 0.187500 0.625000 798 | vt 0.187500 0.187500 799 | vt 0.187500 0.687500 800 | vt 0.187500 0.250000 801 | vt 0.187500 0.750000 802 | vt 0.187500 0.312500 803 | vt 0.187500 0.812500 804 | vt 0.187500 0.375000 805 | vt 0.187500 0.875000 806 | vt 0.187500 0.437500 807 | vt 0.156250 0.250000 808 | vt 0.156250 0.312500 809 | vt 0.156250 0.750000 810 | vt 0.156250 0.812500 811 | vt 0.156250 0.375000 812 | vt 0.156250 0.875000 813 | vt 0.156250 0.437500 814 | vt 0.156250 0.937500 815 | vt 0.156250 0.500000 816 | vt 0.171875 0.000000 817 | vt 0.156250 0.062500 818 | vt 0.171875 1.000000 819 | vt 0.156250 0.562500 820 | vt 0.156250 0.125000 821 | vt 0.156250 0.625000 822 | vt 0.156250 0.187500 823 | vt 0.156250 0.687500 824 | vt 0.125000 0.562500 825 | vt 0.125000 0.125000 826 | vt 0.125000 0.625000 827 | vt 0.125000 0.187500 828 | vt 0.125000 0.687500 829 | vt 0.125000 0.250000 830 | vt 0.125000 0.750000 831 | vt 0.125000 0.312500 832 | vt 0.125000 0.812500 833 | vt 0.125000 0.375000 834 | vt 0.125000 0.875000 835 | vt 0.125000 0.437500 836 | vt 0.125000 0.937500 837 | vt 0.125000 0.500000 838 | vt 0.140625 0.000000 839 | vt 0.125000 0.062500 840 | vt 0.140625 1.000000 841 | vt 0.093750 0.812500 842 | vt 0.093750 0.375000 843 | vt 0.093750 0.875000 844 | vt 0.093750 0.437500 845 | vt 0.093750 0.937500 846 | vt 0.093750 0.500000 847 | vt 0.109375 0.000000 848 | vt 0.093750 0.062500 849 | vt 0.109375 1.000000 850 | vt 0.093750 0.562500 851 | vt 0.093750 0.125000 852 | vt 0.093750 0.625000 853 | vt 0.093750 0.187500 854 | vt 0.093750 0.687500 855 | vt 0.093750 0.250000 856 | vt 0.093750 0.750000 857 | vt 0.093750 0.312500 858 | vt 0.062500 0.125000 859 | vt 0.062500 0.625000 860 | vt 0.062500 0.187500 861 | vt 0.062500 0.687500 862 | vt 0.062500 0.250000 863 | vt 0.062500 0.750000 864 | vt 0.062500 0.312500 865 | vt 0.062500 0.812500 866 | vt 0.062500 0.375000 867 | vt 0.062500 0.875000 868 | vt 0.062500 0.437500 869 | vt 0.062500 0.937500 870 | vt 0.062500 0.500000 871 | vt 0.078125 0.000000 872 | vt 0.062500 0.062500 873 | vt 0.078125 1.000000 874 | vt 0.062500 0.562500 875 | vt 0.031250 0.375000 876 | vt 0.031250 0.812500 877 | vt 0.031250 0.875000 878 | vt 0.031250 0.437500 879 | vt 0.031250 0.937500 880 | vt 0.031250 0.500000 881 | vt 0.046875 0.000000 882 | vt 0.031250 0.062500 883 | vt 0.046875 1.000000 884 | vt 0.031250 0.562500 885 | vt 0.031250 0.125000 886 | vt 0.031250 0.625000 887 | vt 0.031250 0.187500 888 | vt 0.031250 0.687500 889 | vt 0.031250 0.250000 890 | vt 0.031250 0.750000 891 | vt 0.031250 0.312500 892 | vt 0.000000 0.625000 893 | vt 0.000000 0.187500 894 | vt 0.000000 0.687500 895 | vt 0.000000 0.250000 896 | vt 0.000000 0.750000 897 | vt 0.000000 0.312500 898 | vt 0.000000 0.812500 899 | vt 0.000000 0.375000 900 | vt 0.000000 0.875000 901 | vt 0.000000 0.437500 902 | vt 0.000000 0.937500 903 | vt 0.000000 0.500000 904 | vt 0.015625 0.000000 905 | vt 0.000000 0.062500 906 | vt 0.015625 1.000000 907 | vt 0.000000 0.562500 908 | vt 0.000000 0.125000 909 | vt 1.000000 0.875000 910 | vt 0.968750 0.812500 911 | vt 0.968750 0.875000 912 | vt 1.000000 0.437500 913 | vt 0.968750 0.375000 914 | vt 0.968750 0.437500 915 | vt 0.968750 0.937500 916 | vt 1.000000 0.937500 917 | vt 0.968750 0.500000 918 | vt 1.000000 0.500000 919 | vt 1.000000 0.062500 920 | vt 0.984375 0.000000 921 | vt 0.968750 0.062500 922 | vt 0.984375 1.000000 923 | vt 1.000000 0.562500 924 | vt 0.968750 0.562500 925 | vt 1.000000 0.125000 926 | vt 0.968750 0.125000 927 | vt 0.968750 0.625000 928 | vt 1.000000 0.625000 929 | vt 0.968750 0.187500 930 | vt 1.000000 0.187500 931 | vt 1.000000 0.687500 932 | vt 0.968750 0.687500 933 | vt 1.000000 0.250000 934 | vt 0.968750 0.250000 935 | vt 0.968750 0.750000 936 | vt 1.000000 0.750000 937 | vt 1.000000 0.312500 938 | vt 0.968750 0.312500 939 | vt 1.000000 0.812500 940 | vt 1.000000 0.375000 941 | vt 0.937500 0.625000 942 | vt 0.937500 0.687500 943 | vt 0.937500 0.187500 944 | vt 0.937500 0.250000 945 | vt 0.937500 0.750000 946 | vt 0.937500 0.312500 947 | vt 0.937500 0.812500 948 | vt 0.937500 0.375000 949 | vt 0.937500 0.875000 950 | vt 0.937500 0.437500 951 | vt 0.937500 0.937500 952 | vt 0.937500 0.500000 953 | vt 0.953125 0.000000 954 | vt 0.937500 0.062500 955 | vt 0.953125 1.000000 956 | vt 0.937500 0.562500 957 | vt 0.937500 0.125000 958 | vt 0.906250 0.937500 959 | vt 0.906250 0.500000 960 | vt 0.921875 0.000000 961 | vt 0.906250 0.062500 962 | vt 0.921875 1.000000 963 | vt 0.906250 0.562500 964 | vt 0.906250 0.125000 965 | vt 0.906250 0.625000 966 | vt 0.906250 0.187500 967 | vt 0.906250 0.687500 968 | vt 0.906250 0.250000 969 | vt 0.906250 0.750000 970 | vt 0.906250 0.312500 971 | vt 0.906250 0.812500 972 | vt 0.906250 0.375000 973 | vt 0.906250 0.875000 974 | vt 0.906250 0.437500 975 | vt 0.875000 0.250000 976 | vt 0.875000 0.750000 977 | vt 0.875000 0.312500 978 | vt 0.875000 0.812500 979 | vt 0.875000 0.375000 980 | vt 0.875000 0.875000 981 | vt 0.875000 0.437500 982 | vt 0.875000 0.937500 983 | vt 0.875000 0.500000 984 | vt 0.890625 0.000000 985 | vt 0.875000 0.062500 986 | vt 0.890625 1.000000 987 | vt 0.875000 0.562500 988 | vt 0.875000 0.125000 989 | vt 0.875000 0.625000 990 | vt 0.875000 0.187500 991 | vt 0.875000 0.687500 992 | vt 0.843750 0.437500 993 | vt 0.843750 0.500000 994 | vt 0.859375 0.000000 995 | vt 0.843750 0.062500 996 | vt 0.859375 1.000000 997 | vt 0.843750 0.937500 998 | vt 0.843750 0.562500 999 | vt 0.843750 0.125000 1000 | vt 0.843750 0.625000 1001 | vt 0.843750 0.187500 1002 | vt 0.843750 0.687500 1003 | vt 0.843750 0.250000 1004 | vt 0.843750 0.750000 1005 | vt 0.843750 0.312500 1006 | vt 0.843750 0.812500 1007 | vt 0.843750 0.375000 1008 | vt 0.843750 0.875000 1009 | vt 0.812500 0.750000 1010 | vt 0.812500 0.250000 1011 | vt 0.812500 0.312500 1012 | vt 0.812500 0.812500 1013 | vt 0.812500 0.375000 1014 | vt 0.812500 0.875000 1015 | vt 0.812500 0.437500 1016 | vt 0.812500 0.937500 1017 | vt 0.812500 0.500000 1018 | vt 0.828125 0.000000 1019 | vt 0.812500 0.062500 1020 | vt 0.828125 1.000000 1021 | vt 0.812500 0.562500 1022 | vt 0.812500 0.125000 1023 | vt 0.812500 0.625000 1024 | vt 0.812500 0.187500 1025 | vt 0.812500 0.687500 1026 | vt 0.796875 0.000000 1027 | vt 0.781250 0.062500 1028 | vt 0.796875 1.000000 1029 | vt 0.781250 0.937500 1030 | vt 0.781250 0.562500 1031 | vt 0.781250 0.125000 1032 | vt 0.781250 0.625000 1033 | vt 0.781250 0.187500 1034 | vt 0.781250 0.687500 1035 | vt 0.781250 0.250000 1036 | vt 0.781250 0.750000 1037 | vt 0.781250 0.312500 1038 | vt 0.781250 0.812500 1039 | vt 0.781250 0.375000 1040 | vt 0.781250 0.875000 1041 | vt 0.781250 0.437500 1042 | vt 0.781250 0.500000 1043 | vt 0.765625 0.000000 1044 | vt 0.765625 1.000000 1045 | vn 0.7708 -0.0759 -0.6326 1046 | vn 0.7708 -0.0759 0.6326 1047 | vn 0.6332 -0.0624 -0.7715 1048 | vn 0.8786 -0.0865 0.4696 1049 | vn 0.4709 -0.0464 -0.8810 1050 | vn 0.9527 -0.0938 0.2890 1051 | vn 0.2902 -0.0286 -0.9565 1052 | vn 0.9904 -0.0975 0.0975 1053 | vn 0.0980 -0.0097 0.9951 1054 | vn 0.0980 -0.0097 -0.9951 1055 | vn 0.9904 -0.0975 -0.0975 1056 | vn 0.2902 -0.0286 0.9565 1057 | vn 0.9527 -0.0938 -0.2890 1058 | vn 0.4709 -0.0464 0.8810 1059 | vn 0.8786 -0.0865 -0.4696 1060 | vn 0.6332 -0.0624 0.7715 1061 | vn 0.8448 -0.2563 -0.4696 1062 | vn 0.6088 -0.1847 0.7715 1063 | vn 0.7412 -0.2248 -0.6326 1064 | vn 0.7412 -0.2248 0.6326 1065 | vn 0.6088 -0.1847 -0.7715 1066 | vn 0.8448 -0.2563 0.4696 1067 | vn 0.4528 -0.1374 -0.8810 1068 | vn 0.9161 -0.2779 0.2890 1069 | vn 0.2790 -0.0846 -0.9565 1070 | vn 0.9524 -0.2889 0.0975 1071 | vn 0.0942 -0.0286 0.9951 1072 | vn 0.0942 -0.0286 -0.9951 1073 | vn 0.9524 -0.2889 -0.0975 1074 | vn 0.2790 -0.0846 0.9565 1075 | vn 0.9161 -0.2779 -0.2890 1076 | vn 0.4528 -0.1374 0.8810 1077 | vn 0.2571 -0.1374 -0.9565 1078 | vn 0.8777 -0.4691 0.0975 1079 | vn 0.0869 -0.0464 0.9951 1080 | vn 0.0869 -0.0464 -0.9951 1081 | vn 0.8777 -0.4691 -0.0975 1082 | vn 0.2571 -0.1374 0.9565 1083 | vn 0.8443 -0.4513 -0.2890 1084 | vn 0.4173 -0.2230 0.8810 1085 | vn 0.7786 -0.4162 -0.4696 1086 | vn 0.5611 -0.2999 0.7715 1087 | vn 0.6831 -0.3651 -0.6326 1088 | vn 0.6831 -0.3651 0.6326 1089 | vn 0.5611 -0.2999 -0.7715 1090 | vn 0.7786 -0.4162 0.4696 1091 | vn 0.4173 -0.2230 -0.8810 1092 | vn 0.8443 -0.4513 0.2890 1093 | vn 0.4918 -0.4036 0.7715 1094 | vn 0.5987 -0.4913 -0.6326 1095 | vn 0.5987 -0.4913 0.6326 1096 | vn 0.4918 -0.4036 -0.7715 1097 | vn 0.6825 -0.5601 0.4696 1098 | vn 0.3658 -0.3002 -0.8810 1099 | vn 0.7400 -0.6073 0.2890 1100 | vn 0.2254 -0.1850 -0.9565 1101 | vn 0.7693 -0.6314 0.0976 1102 | vn 0.0761 -0.0625 0.9951 1103 | vn 0.0761 -0.0625 -0.9951 1104 | vn 0.7693 -0.6314 -0.0976 1105 | vn 0.2254 -0.1850 0.9565 1106 | vn 0.7400 -0.6073 -0.2890 1107 | vn 0.3658 -0.3002 0.8810 1108 | vn 0.6825 -0.5601 -0.4696 1109 | vn 0.6314 -0.7693 0.0976 1110 | vn 0.0625 -0.0761 0.9951 1111 | vn 0.0625 -0.0761 -0.9951 1112 | vn 0.6314 -0.7693 -0.0975 1113 | vn 0.1850 -0.2254 0.9565 1114 | vn 0.6073 -0.7400 -0.2890 1115 | vn 0.3002 -0.3658 0.8810 1116 | vn 0.5601 -0.6825 -0.4696 1117 | vn 0.4036 -0.4918 0.7715 1118 | vn 0.4913 -0.5987 -0.6326 1119 | vn 0.4913 -0.5987 0.6326 1120 | vn 0.4036 -0.4918 -0.7715 1121 | vn 0.5601 -0.6825 0.4696 1122 | vn 0.3002 -0.3658 -0.8810 1123 | vn 0.6073 -0.7400 0.2890 1124 | vn 0.1850 -0.2254 -0.9565 1125 | vn 0.3651 -0.6831 -0.6326 1126 | vn 0.3651 -0.6831 0.6326 1127 | vn 0.2999 -0.5611 -0.7715 1128 | vn 0.4162 -0.7786 0.4696 1129 | vn 0.2230 -0.4173 -0.8810 1130 | vn 0.4513 -0.8443 0.2890 1131 | vn 0.1374 -0.2571 -0.9565 1132 | vn 0.4691 -0.8777 0.0976 1133 | vn 0.0464 -0.0869 0.9951 1134 | vn 0.0464 -0.0869 -0.9951 1135 | vn 0.4691 -0.8777 -0.0976 1136 | vn 0.1374 -0.2571 0.9565 1137 | vn 0.4513 -0.8443 -0.2890 1138 | vn 0.2231 -0.4173 0.8810 1139 | vn 0.4162 -0.7786 -0.4696 1140 | vn 0.2999 -0.5611 0.7715 1141 | vn 0.0286 -0.0942 -0.9951 1142 | vn 0.2889 -0.9524 -0.0976 1143 | vn 0.0846 -0.2790 0.9565 1144 | vn 0.2779 -0.9161 -0.2890 1145 | vn 0.1374 -0.4528 0.8810 1146 | vn 0.2563 -0.8448 -0.4696 1147 | vn 0.1847 -0.6088 0.7715 1148 | vn 0.2248 -0.7412 -0.6326 1149 | vn 0.2248 -0.7412 0.6326 1150 | vn 0.1847 -0.6088 -0.7715 1151 | vn 0.2563 -0.8448 0.4696 1152 | vn 0.1374 -0.4528 -0.8810 1153 | vn 0.2779 -0.9161 0.2890 1154 | vn 0.0846 -0.2790 -0.9565 1155 | vn 0.2889 -0.9524 0.0976 1156 | vn 0.0286 -0.0942 0.9951 1157 | vn 0.0624 -0.6332 -0.7715 1158 | vn 0.0865 -0.8786 0.4696 1159 | vn 0.0464 -0.4709 -0.8810 1160 | vn 0.0938 -0.9527 0.2890 1161 | vn 0.0286 -0.2902 -0.9565 1162 | vn 0.0975 -0.9904 0.0976 1163 | vn 0.0097 -0.0980 0.9951 1164 | vn 0.0097 -0.0980 -0.9951 1165 | vn 0.0975 -0.9904 -0.0976 1166 | vn 0.0286 -0.2902 0.9565 1167 | vn 0.0938 -0.9527 -0.2890 1168 | vn 0.0464 -0.4709 0.8810 1169 | vn 0.0865 -0.8786 -0.4696 1170 | vn 0.0624 -0.6332 0.7715 1171 | vn 0.0759 -0.7708 -0.6326 1172 | vn 0.0759 -0.7708 0.6326 1173 | vn -0.0286 -0.2902 0.9565 1174 | vn -0.0938 -0.9527 -0.2890 1175 | vn -0.0464 -0.4709 0.8810 1176 | vn -0.0865 -0.8786 -0.4696 1177 | vn -0.0624 -0.6332 0.7715 1178 | vn -0.0759 -0.7708 -0.6326 1179 | vn -0.0759 -0.7708 0.6326 1180 | vn -0.0624 -0.6332 -0.7715 1181 | vn -0.0865 -0.8786 0.4696 1182 | vn -0.0464 -0.4709 -0.8810 1183 | vn -0.0938 -0.9527 0.2890 1184 | vn -0.0286 -0.2902 -0.9565 1185 | vn -0.0975 -0.9904 0.0976 1186 | vn -0.0097 -0.0980 0.9951 1187 | vn -0.0097 -0.0980 -0.9951 1188 | vn -0.0975 -0.9904 -0.0976 1189 | vn -0.2563 -0.8448 0.4696 1190 | vn -0.1374 -0.4528 -0.8810 1191 | vn -0.2779 -0.9161 0.2890 1192 | vn -0.0846 -0.2790 -0.9565 1193 | vn -0.2889 -0.9524 0.0976 1194 | vn -0.0286 -0.0942 0.9951 1195 | vn -0.0286 -0.0942 -0.9951 1196 | vn -0.2889 -0.9524 -0.0976 1197 | vn -0.0846 -0.2790 0.9565 1198 | vn -0.2779 -0.9161 -0.2890 1199 | vn -0.1374 -0.4528 0.8810 1200 | vn -0.2563 -0.8448 -0.4696 1201 | vn -0.1847 -0.6088 0.7715 1202 | vn -0.2248 -0.7412 -0.6326 1203 | vn -0.2248 -0.7412 0.6326 1204 | vn -0.1847 -0.6088 -0.7715 1205 | vn -0.4513 -0.8443 -0.2890 1206 | vn -0.2231 -0.4173 0.8810 1207 | vn -0.4162 -0.7786 -0.4696 1208 | vn -0.2999 -0.5611 0.7715 1209 | vn -0.3651 -0.6831 -0.6326 1210 | vn -0.3651 -0.6831 0.6326 1211 | vn -0.2999 -0.5611 -0.7715 1212 | vn -0.4162 -0.7786 0.4696 1213 | vn -0.2230 -0.4173 -0.8810 1214 | vn -0.4513 -0.8443 0.2890 1215 | vn -0.1374 -0.2571 -0.9566 1216 | vn -0.4691 -0.8777 0.0976 1217 | vn -0.0464 -0.0869 0.9951 1218 | vn -0.0464 -0.0869 -0.9951 1219 | vn -0.4691 -0.8777 -0.0976 1220 | vn -0.1374 -0.2571 0.9565 1221 | vn -0.3002 -0.3658 -0.8810 1222 | vn -0.6073 -0.7400 0.2890 1223 | vn -0.1850 -0.2254 -0.9566 1224 | vn -0.6314 -0.7693 0.0976 1225 | vn -0.0625 -0.0761 0.9951 1226 | vn -0.0625 -0.0761 -0.9951 1227 | vn -0.6314 -0.7693 -0.0976 1228 | vn -0.1850 -0.2254 0.9565 1229 | vn -0.6073 -0.7400 -0.2890 1230 | vn -0.3002 -0.3658 0.8810 1231 | vn -0.5601 -0.6825 -0.4696 1232 | vn -0.4036 -0.4918 0.7715 1233 | vn -0.4913 -0.5987 -0.6326 1234 | vn -0.4913 -0.5987 0.6326 1235 | vn -0.4036 -0.4918 -0.7715 1236 | vn -0.5601 -0.6825 0.4696 1237 | vn -0.3658 -0.3002 0.8810 1238 | vn -0.6825 -0.5601 -0.4696 1239 | vn -0.4918 -0.4036 0.7715 1240 | vn -0.5987 -0.4913 -0.6326 1241 | vn -0.5987 -0.4913 0.6326 1242 | vn -0.4918 -0.4036 -0.7715 1243 | vn -0.6825 -0.5601 0.4696 1244 | vn -0.3658 -0.3002 -0.8810 1245 | vn -0.7400 -0.6073 0.2890 1246 | vn -0.2254 -0.1850 -0.9565 1247 | vn -0.7693 -0.6314 0.0976 1248 | vn -0.0761 -0.0625 0.9951 1249 | vn -0.0761 -0.0625 -0.9951 1250 | vn -0.7693 -0.6314 -0.0976 1251 | vn -0.2254 -0.1850 0.9565 1252 | vn -0.7400 -0.6073 -0.2890 1253 | vn -0.8443 -0.4513 0.2890 1254 | vn -0.2571 -0.1374 -0.9566 1255 | vn -0.8777 -0.4691 0.0976 1256 | vn -0.0869 -0.0464 0.9951 1257 | vn -0.0869 -0.0464 -0.9951 1258 | vn -0.8777 -0.4691 -0.0976 1259 | vn -0.2571 -0.1374 0.9565 1260 | vn -0.8443 -0.4513 -0.2890 1261 | vn -0.4173 -0.2230 0.8810 1262 | vn -0.7786 -0.4162 -0.4696 1263 | vn -0.5611 -0.2999 0.7715 1264 | vn -0.6831 -0.3651 -0.6326 1265 | vn -0.6831 -0.3651 0.6326 1266 | vn -0.5611 -0.2999 -0.7715 1267 | vn -0.7786 -0.4162 0.4696 1268 | vn -0.4173 -0.2231 -0.8810 1269 | vn -0.8448 -0.2563 -0.4696 1270 | vn -0.6088 -0.1847 0.7715 1271 | vn -0.7412 -0.2248 -0.6326 1272 | vn -0.7412 -0.2248 0.6326 1273 | vn -0.6088 -0.1847 -0.7715 1274 | vn -0.8448 -0.2563 0.4696 1275 | vn -0.4528 -0.1374 -0.8810 1276 | vn -0.9161 -0.2779 0.2890 1277 | vn -0.2790 -0.0846 -0.9565 1278 | vn -0.9524 -0.2889 0.0976 1279 | vn -0.0942 -0.0286 0.9951 1280 | vn -0.0942 -0.0286 -0.9951 1281 | vn -0.9524 -0.2889 -0.0976 1282 | vn -0.2790 -0.0846 0.9565 1283 | vn -0.9161 -0.2779 -0.2890 1284 | vn -0.4528 -0.1374 0.8810 1285 | vn -0.2902 -0.0286 -0.9565 1286 | vn -0.9904 -0.0975 0.0976 1287 | vn -0.0980 -0.0097 0.9951 1288 | vn -0.0980 -0.0097 -0.9951 1289 | vn -0.9904 -0.0975 -0.0976 1290 | vn -0.2902 -0.0286 0.9565 1291 | vn -0.9527 -0.0938 -0.2890 1292 | vn -0.4709 -0.0464 0.8810 1293 | vn -0.8786 -0.0865 -0.4696 1294 | vn -0.6332 -0.0624 0.7715 1295 | vn -0.7708 -0.0759 -0.6326 1296 | vn -0.7708 -0.0759 0.6326 1297 | vn -0.6332 -0.0624 -0.7715 1298 | vn -0.8786 -0.0865 0.4696 1299 | vn -0.4709 -0.0464 -0.8810 1300 | vn -0.9527 -0.0938 0.2890 1301 | vn -0.7708 0.0759 -0.6326 1302 | vn -0.7708 0.0759 0.6326 1303 | vn -0.6332 0.0624 -0.7715 1304 | vn -0.8786 0.0865 0.4696 1305 | vn -0.4709 0.0464 -0.8810 1306 | vn -0.9527 0.0938 0.2890 1307 | vn -0.2902 0.0286 -0.9565 1308 | vn -0.9904 0.0976 0.0976 1309 | vn -0.0980 0.0097 0.9951 1310 | vn -0.0980 0.0097 -0.9951 1311 | vn -0.9904 0.0976 -0.0976 1312 | vn -0.2902 0.0286 0.9565 1313 | vn -0.9527 0.0938 -0.2890 1314 | vn -0.4709 0.0464 0.8810 1315 | vn -0.8786 0.0865 -0.4696 1316 | vn -0.6332 0.0624 0.7715 1317 | vn -0.0942 0.0286 0.9951 1318 | vn -0.0942 0.0286 -0.9951 1319 | vn -0.9524 0.2889 -0.0976 1320 | vn -0.2790 0.0846 0.9565 1321 | vn -0.9161 0.2779 -0.2890 1322 | vn -0.4528 0.1374 0.8810 1323 | vn -0.8448 0.2563 -0.4696 1324 | vn -0.6088 0.1847 0.7715 1325 | vn -0.7412 0.2248 -0.6326 1326 | vn -0.7412 0.2248 0.6326 1327 | vn -0.6088 0.1847 -0.7715 1328 | vn -0.8448 0.2563 0.4696 1329 | vn -0.4528 0.1374 -0.8810 1330 | vn -0.9161 0.2779 0.2890 1331 | vn -0.2790 0.0846 -0.9565 1332 | vn -0.9524 0.2889 0.0976 1333 | vn -0.6831 0.3651 0.6326 1334 | vn -0.5611 0.2999 -0.7715 1335 | vn -0.7786 0.4162 0.4696 1336 | vn -0.4173 0.2230 -0.8810 1337 | vn -0.8443 0.4513 0.2890 1338 | vn -0.2571 0.1374 -0.9565 1339 | vn -0.8777 0.4691 0.0976 1340 | vn -0.0869 0.0464 0.9951 1341 | vn -0.0869 0.0464 -0.9951 1342 | vn -0.8777 0.4691 -0.0976 1343 | vn -0.2571 0.1374 0.9565 1344 | vn -0.8443 0.4513 -0.2890 1345 | vn -0.4173 0.2230 0.8810 1346 | vn -0.7786 0.4162 -0.4696 1347 | vn -0.5611 0.2999 0.7715 1348 | vn -0.6831 0.3651 -0.6326 1349 | vn -0.7693 0.6314 -0.0976 1350 | vn -0.2254 0.1850 0.9565 1351 | vn -0.7400 0.6073 -0.2890 1352 | vn -0.3658 0.3002 0.8810 1353 | vn -0.6825 0.5601 -0.4696 1354 | vn -0.4918 0.4036 0.7715 1355 | vn -0.5987 0.4913 -0.6326 1356 | vn -0.5987 0.4913 0.6326 1357 | vn -0.4918 0.4036 -0.7715 1358 | vn -0.6825 0.5601 0.4696 1359 | vn -0.3658 0.3002 -0.8810 1360 | vn -0.7400 0.6073 0.2890 1361 | vn -0.2254 0.1850 -0.9565 1362 | vn -0.7693 0.6314 0.0976 1363 | vn -0.0761 0.0625 0.9951 1364 | vn -0.0761 0.0625 -0.9951 1365 | vn -0.4036 0.4918 -0.7715 1366 | vn -0.5601 0.6825 0.4696 1367 | vn -0.3002 0.3658 -0.8810 1368 | vn -0.6073 0.7400 0.2890 1369 | vn -0.1850 0.2254 -0.9565 1370 | vn -0.6314 0.7693 0.0976 1371 | vn -0.0625 0.0761 0.9951 1372 | vn -0.0625 0.0761 -0.9951 1373 | vn -0.6314 0.7693 -0.0976 1374 | vn -0.1850 0.2254 0.9565 1375 | vn -0.6073 0.7400 -0.2890 1376 | vn -0.3002 0.3658 0.8810 1377 | vn -0.5601 0.6825 -0.4696 1378 | vn -0.4036 0.4918 0.7715 1379 | vn -0.4913 0.5987 -0.6326 1380 | vn -0.4913 0.5987 0.6326 1381 | vn -0.1374 0.2571 0.9565 1382 | vn -0.4513 0.8443 -0.2890 1383 | vn -0.2230 0.4173 0.8810 1384 | vn -0.4162 0.7786 -0.4696 1385 | vn -0.2999 0.5611 0.7715 1386 | vn -0.3651 0.6831 -0.6326 1387 | vn -0.3651 0.6831 0.6326 1388 | vn -0.2999 0.5611 -0.7715 1389 | vn -0.4162 0.7786 0.4696 1390 | vn -0.2231 0.4173 -0.8810 1391 | vn -0.4513 0.8443 0.2890 1392 | vn -0.1374 0.2571 -0.9565 1393 | vn -0.4691 0.8777 0.0976 1394 | vn -0.0464 0.0869 0.9951 1395 | vn -0.0464 0.0869 -0.9951 1396 | vn -0.4691 0.8777 -0.0976 1397 | vn -0.2563 0.8448 0.4696 1398 | vn -0.1374 0.4528 -0.8810 1399 | vn -0.2779 0.9161 0.2890 1400 | vn -0.0846 0.2790 -0.9565 1401 | vn -0.2889 0.9524 0.0976 1402 | vn -0.0286 0.0942 0.9951 1403 | vn -0.0286 0.0942 -0.9951 1404 | vn -0.2889 0.9524 -0.0976 1405 | vn -0.0846 0.2790 0.9565 1406 | vn -0.2779 0.9161 -0.2890 1407 | vn -0.1374 0.4528 0.8810 1408 | vn -0.2563 0.8448 -0.4696 1409 | vn -0.1847 0.6088 0.7715 1410 | vn -0.2248 0.7412 -0.6326 1411 | vn -0.2248 0.7412 0.6326 1412 | vn -0.1847 0.6088 -0.7715 1413 | vn -0.0938 0.9527 -0.2890 1414 | vn -0.0464 0.4709 0.8810 1415 | vn -0.0865 0.8786 -0.4696 1416 | vn -0.0624 0.6332 0.7715 1417 | vn -0.0759 0.7708 -0.6326 1418 | vn -0.0759 0.7708 0.6326 1419 | vn -0.0624 0.6332 -0.7715 1420 | vn -0.0865 0.8786 0.4696 1421 | vn -0.0464 0.4709 -0.8810 1422 | vn -0.0938 0.9527 0.2890 1423 | vn -0.0286 0.2902 -0.9565 1424 | vn -0.0975 0.9904 0.0976 1425 | vn -0.0097 0.0980 0.9951 1426 | vn -0.0097 0.0980 -0.9951 1427 | vn -0.0975 0.9904 -0.0976 1428 | vn -0.0286 0.2902 0.9565 1429 | vn 0.0464 0.4709 -0.8810 1430 | vn 0.0938 0.9527 0.2890 1431 | vn 0.0286 0.2902 -0.9565 1432 | vn 0.0976 0.9904 0.0976 1433 | vn 0.0097 0.0980 0.9951 1434 | vn 0.0097 0.0980 -0.9951 1435 | vn 0.0976 0.9904 -0.0976 1436 | vn 0.0286 0.2902 0.9565 1437 | vn 0.0938 0.9527 -0.2890 1438 | vn 0.0464 0.4709 0.8810 1439 | vn 0.0865 0.8786 -0.4696 1440 | vn 0.0624 0.6332 0.7715 1441 | vn 0.0759 0.7708 -0.6326 1442 | vn 0.0759 0.7708 0.6326 1443 | vn 0.0624 0.6332 -0.7715 1444 | vn 0.0865 0.8786 0.4696 1445 | vn 0.2563 0.8448 -0.4696 1446 | vn 0.1847 0.6088 0.7715 1447 | vn 0.2248 0.7412 -0.6326 1448 | vn 0.2248 0.7412 0.6326 1449 | vn 0.1847 0.6088 -0.7715 1450 | vn 0.2563 0.8448 0.4696 1451 | vn 0.1374 0.4528 -0.8810 1452 | vn 0.2779 0.9161 0.2890 1453 | vn 0.0846 0.2790 -0.9565 1454 | vn 0.2889 0.9524 0.0976 1455 | vn 0.0286 0.0942 0.9951 1456 | vn 0.0286 0.0942 -0.9951 1457 | vn 0.2889 0.9524 -0.0976 1458 | vn 0.0846 0.2790 0.9565 1459 | vn 0.2779 0.9161 -0.2890 1460 | vn 0.1374 0.4528 0.8810 1461 | vn 0.1374 0.2571 -0.9565 1462 | vn 0.4691 0.8777 0.0976 1463 | vn 0.0464 0.0869 0.9951 1464 | vn 0.0464 0.0869 -0.9951 1465 | vn 0.4691 0.8777 -0.0976 1466 | vn 0.1374 0.2571 0.9565 1467 | vn 0.4513 0.8443 -0.2890 1468 | vn 0.2231 0.4173 0.8810 1469 | vn 0.4162 0.7786 -0.4696 1470 | vn 0.2999 0.5611 0.7715 1471 | vn 0.3651 0.6831 -0.6326 1472 | vn 0.3651 0.6831 0.6326 1473 | vn 0.2999 0.5611 -0.7715 1474 | vn 0.4162 0.7786 0.4696 1475 | vn 0.2231 0.4173 -0.8810 1476 | vn 0.4513 0.8443 0.2890 1477 | vn 0.4036 0.4918 0.7715 1478 | vn 0.4913 0.5987 -0.6326 1479 | vn 0.4913 0.5987 0.6326 1480 | vn 0.4036 0.4918 -0.7715 1481 | vn 0.5601 0.6825 0.4696 1482 | vn 0.3002 0.3658 -0.8810 1483 | vn 0.6073 0.7400 0.2890 1484 | vn 0.1850 0.2254 -0.9565 1485 | vn 0.6314 0.7693 0.0976 1486 | vn 0.0625 0.0761 0.9951 1487 | vn 0.0625 0.0761 -0.9951 1488 | vn 0.6314 0.7693 -0.0976 1489 | vn 0.1850 0.2254 0.9565 1490 | vn 0.6073 0.7400 -0.2890 1491 | vn 0.3002 0.3658 0.8810 1492 | vn 0.5601 0.6825 -0.4696 1493 | vn 0.7693 0.6314 0.0976 1494 | vn 0.0761 0.0625 0.9951 1495 | vn 0.0761 0.0625 -0.9951 1496 | vn 0.7693 0.6314 -0.0976 1497 | vn 0.2254 0.1850 0.9565 1498 | vn 0.7400 0.6073 -0.2890 1499 | vn 0.3658 0.3002 0.8810 1500 | vn 0.6825 0.5601 -0.4696 1501 | vn 0.4918 0.4036 0.7715 1502 | vn 0.5987 0.4913 -0.6326 1503 | vn 0.5987 0.4913 0.6326 1504 | vn 0.4918 0.4036 -0.7715 1505 | vn 0.6825 0.5601 0.4696 1506 | vn 0.3658 0.3002 -0.8810 1507 | vn 0.7400 0.6073 0.2890 1508 | vn 0.2254 0.1850 -0.9565 1509 | vn 0.6831 0.3651 -0.6326 1510 | vn 0.6831 0.3651 0.6326 1511 | vn 0.5611 0.2999 -0.7715 1512 | vn 0.7786 0.4162 0.4696 1513 | vn 0.4173 0.2231 -0.8810 1514 | vn 0.8443 0.4513 0.2890 1515 | vn 0.2571 0.1374 -0.9565 1516 | vn 0.8777 0.4691 0.0976 1517 | vn 0.0869 0.0464 0.9951 1518 | vn 0.0869 0.0464 -0.9951 1519 | vn 0.8777 0.4691 -0.0976 1520 | vn 0.2571 0.1374 0.9565 1521 | vn 0.8443 0.4513 -0.2890 1522 | vn 0.4173 0.2230 0.8810 1523 | vn 0.7786 0.4162 -0.4696 1524 | vn 0.5611 0.2999 0.7715 1525 | vn 0.0942 0.0286 0.9951 1526 | vn 0.0942 0.0286 -0.9951 1527 | vn 0.9524 0.2889 -0.0976 1528 | vn 0.2790 0.0846 0.9565 1529 | vn 0.9161 0.2779 -0.2890 1530 | vn 0.4528 0.1374 0.8810 1531 | vn 0.8448 0.2563 -0.4696 1532 | vn 0.6088 0.1847 0.7715 1533 | vn 0.7412 0.2248 -0.6326 1534 | vn 0.7412 0.2248 0.6326 1535 | vn 0.6088 0.1847 -0.7715 1536 | vn 0.8448 0.2563 0.4696 1537 | vn 0.4528 0.1374 -0.8810 1538 | vn 0.9161 0.2779 0.2890 1539 | vn 0.2790 0.0846 -0.9565 1540 | vn 0.9524 0.2889 0.0976 1541 | vn 0.7708 0.0759 0.6326 1542 | vn 0.6332 0.0624 -0.7715 1543 | vn 0.8786 0.0865 0.4696 1544 | vn 0.4709 0.0464 -0.8810 1545 | vn 0.9527 0.0938 0.2890 1546 | vn 0.2902 0.0286 -0.9565 1547 | vn 0.9904 0.0976 0.0975 1548 | vn 0.0980 0.0097 0.9951 1549 | vn 0.0980 0.0097 -0.9951 1550 | vn 0.9904 0.0976 -0.0976 1551 | vn 0.2902 0.0286 0.9565 1552 | vn 0.9527 0.0938 -0.2890 1553 | vn 0.4709 0.0464 0.8810 1554 | vn 0.8786 0.0865 -0.4696 1555 | vn 0.6332 0.0624 0.7715 1556 | vn 0.7708 0.0759 -0.6326 1557 | vn 0.9904 -0.0976 0.0975 1558 | vn 0.9904 -0.0976 -0.0975 1559 | vn 0.2790 -0.0846 0.9566 1560 | vn 0.4173 -0.2231 0.8810 1561 | vn 0.6314 -0.7693 0.0975 1562 | vn 0.6314 -0.7693 -0.0976 1563 | vn 0.2231 -0.4173 -0.8810 1564 | vn 0.2889 -0.9524 -0.0975 1565 | vn -0.2231 -0.4173 -0.8810 1566 | vn -0.1374 -0.2571 -0.9565 1567 | vn -0.1850 -0.2254 -0.9565 1568 | vn -0.2571 -0.1374 -0.9565 1569 | vn -0.4173 -0.2230 -0.8810 1570 | vn -0.2790 0.0846 0.9566 1571 | vn -0.4173 0.2231 -0.8810 1572 | vn -0.2571 0.1374 0.9566 1573 | vn -0.2231 0.4173 0.8810 1574 | vn 0.2230 0.4173 -0.8810 1575 | vn 0.4173 0.2230 -0.8810 1576 | vn 0.9904 0.0976 0.0976 1577 | vn 0.9904 0.0976 -0.0975 1578 | s off 1579 | f 479/1/1 22/2/1 480/3/1 1580 | f 4/4/2 15/5/2 5/6/2 1581 | f 480/3/3 23/7/3 10/8/3 1582 | f 5/6/4 16/9/4 6/10/4 1583 | f 10/8/5 24/11/5 481/12/5 1584 | f 6/10/6 17/13/6 7/14/6 1585 | f 481/12/7 25/15/7 482/16/7 1586 | f 7/14/8 18/17/8 8/18/8 1587 | f 1/19/9 297/20/9 11/21/9 1588 | f 206/22/10 482/16/10 25/15/10 1589 | f 8/18/11 19/23/11 9/24/11 1590 | f 1/19/12 12/25/12 2/26/12 1591 | f 9/24/13 20/27/13 478/28/13 1592 | f 3/29/14 12/25/14 13/30/14 1593 | f 478/28/15 21/31/15 479/1/15 1594 | f 3/29/16 14/32/16 4/4/16 1595 | f 20/27/17 36/33/17 21/31/17 1596 | f 13/30/18 29/34/18 14/32/18 1597 | f 22/2/19 36/33/19 37/35/19 1598 | f 14/32/20 30/36/20 15/5/20 1599 | f 22/2/21 38/37/21 23/7/21 1600 | f 15/5/22 31/38/22 16/9/22 1601 | f 23/7/23 39/39/23 24/11/23 1602 | f 16/9/24 32/40/24 17/13/24 1603 | f 24/11/25 40/41/25 25/15/25 1604 | f 17/13/26 33/42/26 18/17/26 1605 | f 11/21/27 297/43/27 26/44/27 1606 | f 206/45/28 25/15/28 40/41/28 1607 | f 19/23/29 33/42/29 34/46/29 1608 | f 11/21/30 27/47/30 12/25/30 1609 | f 20/27/31 34/46/31 35/48/31 1610 | f 12/25/32 28/49/32 13/30/32 1611 | f 39/39/33 55/50/33 40/41/33 1612 | f 32/40/34 48/51/34 33/42/34 1613 | f 26/44/35 297/52/35 41/53/35 1614 | f 206/54/36 40/41/36 55/50/36 1615 | f 33/42/37 49/55/37 34/46/37 1616 | f 26/44/38 42/56/38 27/47/38 1617 | f 34/46/39 50/57/39 35/48/39 1618 | f 27/47/40 43/58/40 28/49/40 1619 | f 36/33/41 50/57/41 51/59/41 1620 | f 28/49/42 44/60/42 29/34/42 1621 | f 37/35/43 51/59/43 52/61/43 1622 | f 29/34/44 45/62/44 30/36/44 1623 | f 37/35/45 53/63/45 38/37/45 1624 | f 30/36/46 46/64/46 31/38/46 1625 | f 38/37/47 54/65/47 39/39/47 1626 | f 32/40/48 46/64/48 47/66/48 1627 | f 43/58/49 59/67/49 44/60/49 1628 | f 51/59/50 67/68/50 52/61/50 1629 | f 44/60/51 60/69/51 45/62/51 1630 | f 52/61/52 68/70/52 53/63/52 1631 | f 45/62/53 61/71/53 46/64/53 1632 | f 53/63/54 69/72/54 54/65/54 1633 | f 46/64/55 62/73/55 47/66/55 1634 | f 54/65/56 70/74/56 55/50/56 1635 | f 48/51/57 62/73/57 63/75/57 1636 | f 41/53/58 297/76/58 56/77/58 1637 | f 206/78/59 55/50/59 70/74/59 1638 | f 48/51/60 64/79/60 49/55/60 1639 | f 41/53/61 57/80/61 42/56/61 1640 | f 49/55/62 65/81/62 50/57/62 1641 | f 42/56/63 58/82/63 43/58/63 1642 | f 51/59/64 65/81/64 66/83/64 1643 | f 63/75/65 77/84/65 78/85/65 1644 | f 56/77/66 297/86/66 71/87/66 1645 | f 206/88/67 70/74/67 85/89/67 1646 | f 63/75/68 79/90/68 64/79/68 1647 | f 56/77/69 72/91/69 57/80/69 1648 | f 64/79/70 80/92/70 65/81/70 1649 | f 57/80/71 73/93/71 58/82/71 1650 | f 66/83/72 80/92/72 81/94/72 1651 | f 58/82/73 74/95/73 59/67/73 1652 | f 66/83/74 82/96/74 67/68/74 1653 | f 60/69/75 74/95/75 75/97/75 1654 | f 68/70/76 82/96/76 83/98/76 1655 | f 60/69/77 76/99/77 61/71/77 1656 | f 69/72/78 83/98/78 84/100/78 1657 | f 61/71/79 77/84/79 62/73/79 1658 | f 69/72/80 85/89/80 70/74/80 1659 | f 82/96/81 96/101/81 97/102/81 1660 | f 75/97/82 89/103/82 90/104/82 1661 | f 82/96/83 98/105/83 83/98/83 1662 | f 75/97/84 91/106/84 76/99/84 1663 | f 84/100/85 98/105/85 99/107/85 1664 | f 77/84/86 91/106/86 92/108/86 1665 | f 84/100/87 100/109/87 85/89/87 1666 | f 77/84/88 93/110/88 78/85/88 1667 | f 71/87/89 297/111/89 86/112/89 1668 | f 206/113/90 85/89/90 100/109/90 1669 | f 78/85/91 94/114/91 79/90/91 1670 | f 71/87/92 87/115/92 72/91/92 1671 | f 79/90/93 95/116/93 80/92/93 1672 | f 72/91/94 88/117/94 73/93/94 1673 | f 81/94/95 95/116/95 96/101/95 1674 | f 73/93/96 89/103/96 74/95/96 1675 | f 206/118/97 100/109/97 115/119/97 1676 | f 93/110/98 109/120/98 94/114/98 1677 | f 86/112/99 102/121/99 87/115/99 1678 | f 94/114/100 110/122/100 95/116/100 1679 | f 87/115/101 103/123/101 88/117/101 1680 | f 96/101/102 110/122/102 111/124/102 1681 | f 89/103/103 103/123/103 104/125/103 1682 | f 97/102/104 111/124/104 112/126/104 1683 | f 89/103/105 105/127/105 90/104/105 1684 | f 97/102/106 113/128/106 98/105/106 1685 | f 90/104/107 106/129/107 91/106/107 1686 | f 98/105/108 114/130/108 99/107/108 1687 | f 92/108/109 106/129/109 107/131/109 1688 | f 100/109/110 114/130/110 115/119/110 1689 | f 92/108/111 108/132/111 93/110/111 1690 | f 86/112/112 297/133/112 101/134/112 1691 | f 113/128/113 127/135/113 128/136/113 1692 | f 105/127/114 121/137/114 106/129/114 1693 | f 114/130/115 128/136/115 129/138/115 1694 | f 107/131/116 121/137/116 122/139/116 1695 | f 115/119/117 129/138/117 130/140/117 1696 | f 107/131/118 123/141/118 108/132/118 1697 | f 101/134/119 297/142/119 116/143/119 1698 | f 206/144/120 115/119/120 130/140/120 1699 | f 109/120/121 123/141/121 124/145/121 1700 | f 101/134/122 117/146/122 102/121/122 1701 | f 109/120/123 125/147/123 110/122/123 1702 | f 102/121/124 118/148/124 103/123/124 1703 | f 111/124/125 125/147/125 126/149/125 1704 | f 103/123/126 119/150/126 104/125/126 1705 | f 111/124/127 127/135/127 112/126/127 1706 | f 104/125/128 120/151/128 105/127/128 1707 | f 117/146/129 131/152/129 132/153/129 1708 | f 124/145/130 140/154/130 125/147/130 1709 | f 117/146/131 133/155/131 118/148/131 1710 | f 126/149/132 140/154/132 141/156/132 1711 | f 118/148/133 134/157/133 119/150/133 1712 | f 126/149/134 142/158/134 127/135/134 1713 | f 120/151/135 134/157/135 135/159/135 1714 | f 128/136/136 142/158/136 143/160/136 1715 | f 120/151/137 136/161/137 121/137/137 1716 | f 128/136/138 144/162/138 129/138/138 1717 | f 122/139/139 136/161/139 137/163/139 1718 | f 130/140/140 144/162/140 145/164/140 1719 | f 122/139/141 138/165/141 123/141/141 1720 | f 116/143/142 297/166/142 131/152/142 1721 | f 206/167/143 130/140/143 145/164/143 1722 | f 123/141/144 139/168/144 124/145/144 1723 | f 135/159/145 151/169/145 136/161/145 1724 | f 144/162/146 158/170/146 159/171/146 1725 | f 137/163/147 151/169/147 152/172/147 1726 | f 144/162/148 160/173/148 145/164/148 1727 | f 137/163/149 153/174/149 138/165/149 1728 | f 131/152/150 297/175/150 146/176/150 1729 | f 206/177/151 145/164/151 160/173/151 1730 | f 138/165/152 154/178/152 139/168/152 1731 | f 131/152/153 147/179/153 132/153/153 1732 | f 139/168/154 155/180/154 140/154/154 1733 | f 133/155/155 147/179/155 148/181/155 1734 | f 141/156/156 155/180/156 156/182/156 1735 | f 133/155/157 149/183/157 134/157/157 1736 | f 141/156/158 157/184/158 142/158/158 1737 | f 134/157/159 150/185/159 135/159/159 1738 | f 142/158/160 158/170/160 143/160/160 1739 | f 154/178/161 170/186/161 155/180/161 1740 | f 147/179/162 163/187/162 148/181/162 1741 | f 156/182/163 170/186/163 171/188/163 1742 | f 148/181/164 164/189/164 149/183/164 1743 | f 156/182/165 172/190/165 157/184/165 1744 | f 150/185/166 164/189/166 165/191/166 1745 | f 158/170/167 172/190/167 173/192/167 1746 | f 150/185/168 166/193/168 151/169/168 1747 | f 158/170/169 174/194/169 159/171/169 1748 | f 152/172/170 166/193/170 167/195/170 1749 | f 159/171/171 175/196/171 160/173/171 1750 | f 152/172/172 168/197/172 153/174/172 1751 | f 146/176/173 297/198/173 161/199/173 1752 | f 206/200/174 160/173/174 175/196/174 1753 | f 154/178/175 168/197/175 169/201/175 1754 | f 146/176/176 162/202/176 147/179/176 1755 | f 173/192/177 189/203/177 174/194/177 1756 | f 167/195/178 181/204/178 182/205/178 1757 | f 175/196/179 189/203/179 190/206/179 1758 | f 167/195/180 183/207/180 168/197/180 1759 | f 161/199/181 297/208/181 176/209/181 1760 | f 206/210/182 175/196/182 190/206/182 1761 | f 168/197/183 184/211/183 169/201/183 1762 | f 161/199/184 177/212/184 162/202/184 1763 | f 169/201/185 185/213/185 170/186/185 1764 | f 162/202/186 178/214/186 163/187/186 1765 | f 170/186/187 186/215/187 171/188/187 1766 | f 163/187/188 179/216/188 164/189/188 1767 | f 171/188/189 187/217/189 172/190/189 1768 | f 164/189/190 180/218/190 165/191/190 1769 | f 173/192/191 187/217/191 188/219/191 1770 | f 165/191/192 181/204/192 166/193/192 1771 | f 177/212/193 193/220/193 178/214/193 1772 | f 186/215/194 200/221/194 201/222/194 1773 | f 179/216/195 193/220/195 194/223/195 1774 | f 186/215/196 202/224/196 187/217/196 1775 | f 180/218/197 194/223/197 195/225/197 1776 | f 188/219/198 202/224/198 203/226/198 1777 | f 180/218/199 196/227/199 181/204/199 1778 | f 188/219/200 204/228/200 189/203/200 1779 | f 182/205/201 196/227/201 197/229/201 1780 | f 190/206/202 204/228/202 205/230/202 1781 | f 182/205/203 198/231/203 183/207/203 1782 | f 176/209/204 297/232/204 191/233/204 1783 | f 206/234/205 190/206/205 205/230/205 1784 | f 184/211/206 198/231/206 199/235/206 1785 | f 176/209/207 192/236/207 177/212/207 1786 | f 184/211/208 200/221/208 185/213/208 1787 | f 197/229/209 212/237/209 213/238/209 1788 | f 204/228/210 221/239/210 205/230/210 1789 | f 197/229/211 214/240/211 198/231/211 1790 | f 191/233/212 297/241/212 207/242/212 1791 | f 206/243/213 205/230/213 221/239/213 1792 | f 198/231/214 215/244/214 199/235/214 1793 | f 191/233/215 208/245/215 192/236/215 1794 | f 199/235/216 216/246/216 200/221/216 1795 | f 193/220/217 208/245/217 209/247/217 1796 | f 201/222/218 216/246/218 217/248/218 1797 | f 193/220/219 210/249/219 194/223/219 1798 | f 201/222/220 218/250/220 202/224/220 1799 | f 194/223/221 211/251/221 195/225/221 1800 | f 203/226/222 218/250/222 219/252/222 1801 | f 195/225/223 212/237/223 196/227/223 1802 | f 203/226/224 220/253/224 204/228/224 1803 | f 217/248/225 231/254/225 232/255/225 1804 | f 209/247/226 225/256/226 210/249/226 1805 | f 217/248/227 233/257/227 218/250/227 1806 | f 210/249/228 226/258/228 211/251/228 1807 | f 218/250/229 234/259/229 219/252/229 1808 | f 211/251/230 227/260/230 212/237/230 1809 | f 219/252/231 235/261/231 220/253/231 1810 | f 213/238/232 227/260/232 228/262/232 1811 | f 221/239/233 235/261/233 236/263/233 1812 | f 213/238/234 229/264/234 214/240/234 1813 | f 207/242/235 297/265/235 222/266/235 1814 | f 206/267/236 221/239/236 236/263/236 1815 | f 214/240/237 230/268/237 215/244/237 1816 | f 207/242/238 223/269/238 208/245/238 1817 | f 215/244/239 231/254/239 216/246/239 1818 | f 208/245/240 224/270/240 209/247/240 1819 | f 236/263/241 250/271/241 251/272/241 1820 | f 228/262/242 244/273/242 229/264/242 1821 | f 222/266/243 297/274/243 237/275/243 1822 | f 206/276/244 236/263/244 251/272/244 1823 | f 229/264/245 245/277/245 230/268/245 1824 | f 222/266/246 238/278/246 223/269/246 1825 | f 230/268/247 246/279/247 231/254/247 1826 | f 224/270/248 238/278/248 239/280/248 1827 | f 232/255/249 246/279/249 247/281/249 1828 | f 225/256/250 239/280/250 240/282/250 1829 | f 232/255/251 248/283/251 233/257/251 1830 | f 225/256/252 241/284/252 226/258/252 1831 | f 234/259/253 248/283/253 249/285/253 1832 | f 226/258/254 242/286/254 227/260/254 1833 | f 234/259/255 250/271/255 235/261/255 1834 | f 228/262/256 242/286/256 243/287/256 1835 | f 247/281/257 263/288/257 248/283/257 1836 | f 241/284/258 255/289/258 256/290/258 1837 | f 248/283/259 264/291/259 249/285/259 1838 | f 241/284/260 257/292/260 242/286/260 1839 | f 249/285/261 265/293/261 250/271/261 1840 | f 243/287/262 257/292/262 258/294/262 1841 | f 250/271/263 266/295/263 251/272/263 1842 | f 243/287/264 259/296/264 244/273/264 1843 | f 237/275/265 297/297/265 252/298/265 1844 | f 206/299/266 251/272/266 266/295/266 1845 | f 244/273/267 260/300/267 245/277/267 1846 | f 237/275/268 253/301/268 238/278/268 1847 | f 245/277/269 261/302/269 246/279/269 1848 | f 238/278/270 254/303/270 239/280/270 1849 | f 247/281/271 261/302/271 262/304/271 1850 | f 240/282/272 254/303/272 255/289/272 1851 | f 252/298/273 297/305/273 267/306/273 1852 | f 206/307/274 266/295/274 281/308/274 1853 | f 260/300/275 274/309/275 275/310/275 1854 | f 252/298/276 268/311/276 253/301/276 1855 | f 260/300/277 276/312/277 261/302/277 1856 | f 253/301/278 269/313/278 254/303/278 1857 | f 262/304/279 276/312/279 277/314/279 1858 | f 255/289/280 269/313/280 270/315/280 1859 | f 262/304/281 278/316/281 263/288/281 1860 | f 256/290/282 270/315/282 271/317/282 1861 | f 263/288/283 279/318/283 264/291/283 1862 | f 256/290/284 272/319/284 257/292/284 1863 | f 265/293/285 279/318/285 280/320/285 1864 | f 258/294/286 272/319/286 273/321/286 1865 | f 266/295/287 280/320/287 281/308/287 1866 | f 258/294/288 274/309/288 259/296/288 1867 | f 271/317/289 285/322/289 286/323/289 1868 | f 279/318/290 293/324/290 294/325/290 1869 | f 271/317/291 287/326/291 272/319/291 1870 | f 279/318/292 295/327/292 280/320/292 1871 | f 273/321/293 287/326/293 288/328/293 1872 | f 281/308/294 295/327/294 296/329/294 1873 | f 273/321/295 289/330/295 274/309/295 1874 | f 267/306/296 297/331/296 282/332/296 1875 | f 206/333/297 281/308/297 296/329/297 1876 | f 274/309/298 290/334/298 275/310/298 1877 | f 267/306/299 283/335/299 268/311/299 1878 | f 275/310/300 291/336/300 276/312/300 1879 | f 268/311/301 284/337/301 269/313/301 1880 | f 277/314/302 291/336/302 292/338/302 1881 | f 269/313/303 285/322/303 270/315/303 1882 | f 277/314/304 293/324/304 278/316/304 1883 | f 289/330/305 306/339/305 290/334/305 1884 | f 282/332/306 299/340/306 283/335/306 1885 | f 290/334/307 307/341/307 291/336/307 1886 | f 283/335/308 300/342/308 284/337/308 1887 | f 292/338/309 307/341/309 308/343/309 1888 | f 285/322/310 300/342/310 301/344/310 1889 | f 292/338/311 309/345/311 293/324/311 1890 | f 286/323/312 301/344/312 302/346/312 1891 | f 293/324/313 310/347/313 294/325/313 1892 | f 286/323/314 303/348/314 287/326/314 1893 | f 294/325/315 311/349/315 295/327/315 1894 | f 288/328/316 303/348/316 304/350/316 1895 | f 295/327/317 312/351/317 296/329/317 1896 | f 289/330/318 304/350/318 305/352/318 1897 | f 282/332/319 297/353/319 298/354/319 1898 | f 206/355/320 296/329/320 312/351/320 1899 | f 309/345/321 325/356/321 310/347/321 1900 | f 302/346/322 318/357/322 303/348/322 1901 | f 311/349/323 325/356/323 326/358/323 1902 | f 304/350/324 318/357/324 319/359/324 1903 | f 311/349/325 327/360/325 312/351/325 1904 | f 304/350/326 320/361/326 305/352/326 1905 | f 298/354/327 297/362/327 313/363/327 1906 | f 206/364/328 312/351/328 327/360/328 1907 | f 305/352/329 321/365/329 306/339/329 1908 | f 298/354/330 314/366/330 299/340/330 1909 | f 306/339/331 322/367/331 307/341/331 1910 | f 299/340/332 315/368/332 300/342/332 1911 | f 308/343/333 322/367/333 323/369/333 1912 | f 301/344/334 315/368/334 316/370/334 1913 | f 308/343/335 324/371/335 309/345/335 1914 | f 302/346/336 316/370/336 317/372/336 1915 | f 313/363/337 329/373/337 314/366/337 1916 | f 321/365/338 337/374/338 322/367/338 1917 | f 314/366/339 330/375/339 315/368/339 1918 | f 323/369/340 337/374/340 338/376/340 1919 | f 316/370/341 330/375/341 331/377/341 1920 | f 324/371/342 338/376/342 339/378/342 1921 | f 317/372/343 331/377/343 332/379/343 1922 | f 324/371/344 340/380/344 325/356/344 1923 | f 317/372/345 333/381/345 318/357/345 1924 | f 326/358/346 340/380/346 341/382/346 1925 | f 319/359/347 333/381/347 334/383/347 1926 | f 327/360/348 341/382/348 342/384/348 1927 | f 319/359/349 335/385/349 320/361/349 1928 | f 313/363/350 297/386/350 328/387/350 1929 | f 206/388/351 327/360/351 342/384/351 1930 | f 320/361/352 336/389/352 321/365/352 1931 | f 332/379/353 348/390/353 333/381/353 1932 | f 341/382/354 355/391/354 356/392/354 1933 | f 334/383/355 348/390/355 349/393/355 1934 | f 341/382/356 357/394/356 342/384/356 1935 | f 334/383/357 350/395/357 335/385/357 1936 | f 328/387/358 297/396/358 343/397/358 1937 | f 206/398/359 342/384/359 357/394/359 1938 | f 335/385/360 351/399/360 336/389/360 1939 | f 329/373/361 343/397/361 344/400/361 1940 | f 336/389/362 352/401/362 337/374/362 1941 | f 329/373/363 345/402/363 330/375/363 1942 | f 338/376/364 352/401/364 353/403/364 1943 | f 331/377/365 345/402/365 346/404/365 1944 | f 338/376/366 354/405/366 339/378/366 1945 | f 332/379/367 346/404/367 347/406/367 1946 | f 339/378/368 355/391/368 340/380/368 1947 | f 351/399/369 367/407/369 352/401/369 1948 | f 344/400/370 360/408/370 345/402/370 1949 | f 353/403/371 367/407/371 368/409/371 1950 | f 346/404/372 360/408/372 361/410/372 1951 | f 353/403/373 369/411/373 354/405/373 1952 | f 346/404/374 362/412/374 347/406/374 1953 | f 355/391/375 369/411/375 370/413/375 1954 | f 347/406/376 363/414/376 348/390/376 1955 | f 356/392/377 370/413/377 371/415/377 1956 | f 349/393/378 363/414/378 364/416/378 1957 | f 356/392/379 372/417/379 357/394/379 1958 | f 349/393/380 365/418/380 350/395/380 1959 | f 343/397/381 297/419/381 358/420/381 1960 | f 206/421/382 357/394/382 372/417/382 1961 | f 351/399/383 365/418/383 366/422/383 1962 | f 344/400/384 358/420/384 359/423/384 1963 | f 371/424/385 385/425/385 386/426/385 1964 | f 364/427/386 378/428/386 379/429/386 1965 | f 371/424/387 387/430/387 372/431/387 1966 | f 364/427/388 380/432/388 365/433/388 1967 | f 358/434/389 297/435/389 373/436/389 1968 | f 206/437/390 372/431/390 387/430/390 1969 | f 366/438/391 380/432/391 381/439/391 1970 | f 359/440/392 373/436/392 374/441/392 1971 | f 366/438/393 382/442/393 367/443/393 1972 | f 359/440/394 375/444/394 360/445/394 1973 | f 368/446/395 382/442/395 383/447/395 1974 | f 361/448/396 375/444/396 376/449/396 1975 | f 368/446/397 384/450/397 369/451/397 1976 | f 362/452/398 376/449/398 377/453/398 1977 | f 369/451/399 385/425/399 370/454/399 1978 | f 362/452/400 378/428/400 363/455/400 1979 | f 383/447/401 397/456/401 398/457/401 1980 | f 376/449/402 390/458/402 391/459/402 1981 | f 383/447/403 399/460/403 384/450/403 1982 | f 376/449/404 392/461/404 377/453/404 1983 | f 384/450/405 400/462/405 385/425/405 1984 | f 377/453/406 393/463/406 378/428/406 1985 | f 386/426/407 400/462/407 401/464/407 1986 | f 379/429/408 393/463/408 394/465/408 1987 | f 386/426/409 402/466/409 387/430/409 1988 | f 379/429/410 395/467/410 380/432/410 1989 | f 373/436/411 297/468/411 388/469/411 1990 | f 206/470/412 387/430/412 402/466/412 1991 | f 380/432/413 396/471/413 381/439/413 1992 | f 373/436/414 389/472/414 374/441/414 1993 | f 381/439/415 397/456/415 382/442/415 1994 | f 374/441/416 390/458/416 375/444/416 1995 | f 401/464/417 417/473/417 402/466/417 1996 | f 394/465/418 410/474/418 395/467/418 1997 | f 388/469/419 297/475/419 403/476/419 1998 | f 206/477/420 402/466/420 417/473/420 1999 | f 396/471/421 410/474/421 411/478/421 2000 | f 388/469/422 404/479/422 389/472/422 2001 | f 396/471/423 412/480/423 397/456/423 2002 | f 390/458/424 404/479/424 405/481/424 2003 | f 398/457/425 412/480/425 413/482/425 2004 | f 391/459/426 405/481/426 406/483/426 2005 | f 398/457/427 414/484/427 399/460/427 2006 | f 392/461/428 406/483/428 407/485/428 2007 | f 399/460/429 415/486/429 400/462/429 2008 | f 392/461/430 408/487/430 393/463/430 2009 | f 401/464/431 415/486/431 416/488/431 2010 | f 394/465/432 408/487/432 409/489/432 2011 | f 405/481/433 421/490/433 406/483/433 2012 | f 413/482/434 429/491/434 414/484/434 2013 | f 407/485/435 421/490/435 422/492/435 2014 | f 414/484/436 430/493/436 415/486/436 2015 | f 407/485/437 423/494/437 408/487/437 2016 | f 415/486/438 431/495/438 416/488/438 2017 | f 409/489/439 423/494/439 424/496/439 2018 | f 416/488/440 432/497/440 417/473/440 2019 | f 409/489/441 425/498/441 410/474/441 2020 | f 403/476/442 297/499/442 418/500/442 2021 | f 206/501/443 417/473/443 432/497/443 2022 | f 411/478/444 425/498/444 426/502/444 2023 | f 403/476/445 419/503/445 404/479/445 2024 | f 411/478/446 427/504/446 412/480/446 2025 | f 404/479/447 420/505/447 405/481/447 2026 | f 413/482/448 427/504/448 428/506/448 2027 | f 425/498/449 439/507/449 440/508/449 2028 | f 418/500/450 297/509/450 433/510/450 2029 | f 206/511/451 432/497/451 447/512/451 2030 | f 425/498/452 441/513/452 426/502/452 2031 | f 418/500/453 434/514/453 419/503/453 2032 | f 426/502/454 442/515/454 427/504/454 2033 | f 419/503/455 435/516/455 420/505/455 2034 | f 428/506/456 442/515/456 443/517/456 2035 | f 420/505/457 436/518/457 421/490/457 2036 | f 428/506/458 444/519/458 429/491/458 2037 | f 422/492/459 436/518/459 437/520/459 2038 | f 430/493/460 444/519/460 445/521/460 2039 | f 422/492/461 438/522/461 423/494/461 2040 | f 430/493/462 446/523/462 431/495/462 2041 | f 424/496/463 438/522/463 439/507/463 2042 | f 431/495/464 447/512/464 432/497/464 2043 | f 443/517/465 459/524/465 444/519/465 2044 | f 437/520/466 451/525/466 452/526/466 2045 | f 444/519/467 460/527/467 445/521/467 2046 | f 437/520/468 453/528/468 438/522/468 2047 | f 445/521/469 461/529/469 446/523/469 2048 | f 439/507/470 453/528/470 454/530/470 2049 | f 446/523/471 462/531/471 447/512/471 2050 | f 439/507/472 455/532/472 440/508/472 2051 | f 433/510/473 297/533/473 448/534/473 2052 | f 206/535/474 447/512/474 462/531/474 2053 | f 440/508/475 456/536/475 441/513/475 2054 | f 434/514/476 448/534/476 449/537/476 2055 | f 441/513/477 457/538/477 442/515/477 2056 | f 435/516/478 449/537/478 450/539/478 2057 | f 443/517/479 457/538/479 458/540/479 2058 | f 436/518/480 450/539/480 451/525/480 2059 | f 448/534/481 297/541/481 463/542/481 2060 | f 206/543/482 462/531/482 477/544/482 2061 | f 455/532/483 471/545/483 456/536/483 2062 | f 448/534/484 464/546/484 449/537/484 2063 | f 456/536/485 472/547/485 457/538/485 2064 | f 449/537/486 465/548/486 450/539/486 2065 | f 458/540/487 472/547/487 473/549/487 2066 | f 450/539/488 466/550/488 451/525/488 2067 | f 458/540/489 474/551/489 459/524/489 2068 | f 452/526/490 466/550/490 467/552/490 2069 | f 459/524/491 475/553/491 460/527/491 2070 | f 452/526/492 468/554/492 453/528/492 2071 | f 460/527/493 476/555/493 461/529/493 2072 | f 454/530/494 468/554/494 469/556/494 2073 | f 462/531/495 476/555/495 477/544/495 2074 | f 454/530/496 470/557/496 455/532/496 2075 | f 467/552/497 4/4/497 5/6/497 2076 | f 474/551/498 10/8/498 475/553/498 2077 | f 468/554/499 5/6/499 6/10/499 2078 | f 475/553/500 481/12/500 476/555/500 2079 | f 469/556/501 6/10/501 7/14/501 2080 | f 476/555/502 482/16/502 477/544/502 2081 | f 470/557/503 7/14/503 8/18/503 2082 | f 463/542/504 297/558/504 1/19/504 2083 | f 206/559/505 477/544/505 482/16/505 2084 | f 470/557/506 9/24/506 471/545/506 2085 | f 464/546/507 1/19/507 2/26/507 2086 | f 471/545/508 478/28/508 472/547/508 2087 | f 465/548/509 2/26/509 3/29/509 2088 | f 473/549/510 478/28/510 479/1/510 2089 | f 466/550/511 3/29/511 4/4/511 2090 | f 473/549/512 480/3/512 474/551/512 2091 | f 479/1/1 21/31/1 22/2/1 2092 | f 4/4/2 14/32/2 15/5/2 2093 | f 480/3/3 22/2/3 23/7/3 2094 | f 5/6/4 15/5/4 16/9/4 2095 | f 10/8/5 23/7/5 24/11/5 2096 | f 6/10/6 16/9/6 17/13/6 2097 | f 481/12/7 24/11/7 25/15/7 2098 | f 7/14/513 17/13/513 18/17/513 2099 | f 8/18/514 18/17/514 19/23/514 2100 | f 1/19/12 11/21/12 12/25/12 2101 | f 9/24/13 19/23/13 20/27/13 2102 | f 3/29/14 2/26/14 12/25/14 2103 | f 478/28/15 20/27/15 21/31/15 2104 | f 3/29/16 13/30/16 14/32/16 2105 | f 20/27/17 35/48/17 36/33/17 2106 | f 13/30/18 28/49/18 29/34/18 2107 | f 22/2/19 21/31/19 36/33/19 2108 | f 14/32/20 29/34/20 30/36/20 2109 | f 22/2/21 37/35/21 38/37/21 2110 | f 15/5/22 30/36/22 31/38/22 2111 | f 23/7/23 38/37/23 39/39/23 2112 | f 16/9/24 31/38/24 32/40/24 2113 | f 24/11/25 39/39/25 40/41/25 2114 | f 17/13/26 32/40/26 33/42/26 2115 | f 19/23/29 18/17/29 33/42/29 2116 | f 11/21/515 26/44/515 27/47/515 2117 | f 20/27/31 19/23/31 34/46/31 2118 | f 12/25/32 27/47/32 28/49/32 2119 | f 39/39/33 54/65/33 55/50/33 2120 | f 32/40/34 47/66/34 48/51/34 2121 | f 33/42/37 48/51/37 49/55/37 2122 | f 26/44/38 41/53/38 42/56/38 2123 | f 34/46/39 49/55/39 50/57/39 2124 | f 27/47/516 42/56/516 43/58/516 2125 | f 36/33/41 35/48/41 50/57/41 2126 | f 28/49/42 43/58/42 44/60/42 2127 | f 37/35/43 36/33/43 51/59/43 2128 | f 29/34/44 44/60/44 45/62/44 2129 | f 37/35/45 52/61/45 53/63/45 2130 | f 30/36/46 45/62/46 46/64/46 2131 | f 38/37/47 53/63/47 54/65/47 2132 | f 32/40/48 31/38/48 46/64/48 2133 | f 43/58/49 58/82/49 59/67/49 2134 | f 51/59/50 66/83/50 67/68/50 2135 | f 44/60/51 59/67/51 60/69/51 2136 | f 52/61/52 67/68/52 68/70/52 2137 | f 45/62/53 60/69/53 61/71/53 2138 | f 53/63/54 68/70/54 69/72/54 2139 | f 46/64/55 61/71/55 62/73/55 2140 | f 54/65/56 69/72/56 70/74/56 2141 | f 48/51/57 47/66/57 62/73/57 2142 | f 48/51/60 63/75/60 64/79/60 2143 | f 41/53/61 56/77/61 57/80/61 2144 | f 49/55/62 64/79/62 65/81/62 2145 | f 42/56/63 57/80/63 58/82/63 2146 | f 51/59/64 50/57/64 65/81/64 2147 | f 63/75/517 62/73/517 77/84/517 2148 | f 63/75/518 78/85/518 79/90/518 2149 | f 56/77/69 71/87/69 72/91/69 2150 | f 64/79/70 79/90/70 80/92/70 2151 | f 57/80/71 72/91/71 73/93/71 2152 | f 66/83/72 65/81/72 80/92/72 2153 | f 58/82/73 73/93/73 74/95/73 2154 | f 66/83/74 81/94/74 82/96/74 2155 | f 60/69/75 59/67/75 74/95/75 2156 | f 68/70/76 67/68/76 82/96/76 2157 | f 60/69/77 75/97/77 76/99/77 2158 | f 69/72/78 68/70/78 83/98/78 2159 | f 61/71/79 76/99/79 77/84/79 2160 | f 69/72/80 84/100/80 85/89/80 2161 | f 82/96/81 81/94/81 96/101/81 2162 | f 75/97/82 74/95/82 89/103/82 2163 | f 82/96/83 97/102/83 98/105/83 2164 | f 75/97/84 90/104/84 91/106/84 2165 | f 84/100/519 83/98/519 98/105/519 2166 | f 77/84/86 76/99/86 91/106/86 2167 | f 84/100/87 99/107/87 100/109/87 2168 | f 77/84/88 92/108/88 93/110/88 2169 | f 78/85/91 93/110/91 94/114/91 2170 | f 71/87/92 86/112/92 87/115/92 2171 | f 79/90/93 94/114/93 95/116/93 2172 | f 72/91/94 87/115/94 88/117/94 2173 | f 81/94/95 80/92/95 95/116/95 2174 | f 73/93/96 88/117/96 89/103/96 2175 | f 93/110/520 108/132/520 109/120/520 2176 | f 86/112/99 101/134/99 102/121/99 2177 | f 94/114/100 109/120/100 110/122/100 2178 | f 87/115/101 102/121/101 103/123/101 2179 | f 96/101/102 95/116/102 110/122/102 2180 | f 89/103/103 88/117/103 103/123/103 2181 | f 97/102/104 96/101/104 111/124/104 2182 | f 89/103/105 104/125/105 105/127/105 2183 | f 97/102/106 112/126/106 113/128/106 2184 | f 90/104/107 105/127/107 106/129/107 2185 | f 98/105/108 113/128/108 114/130/108 2186 | f 92/108/109 91/106/109 106/129/109 2187 | f 100/109/110 99/107/110 114/130/110 2188 | f 92/108/111 107/131/111 108/132/111 2189 | f 113/128/113 112/126/113 127/135/113 2190 | f 105/127/114 120/151/114 121/137/114 2191 | f 114/130/115 113/128/115 128/136/115 2192 | f 107/131/116 106/129/116 121/137/116 2193 | f 115/119/117 114/130/117 129/138/117 2194 | f 107/131/118 122/139/118 123/141/118 2195 | f 109/120/121 108/132/121 123/141/121 2196 | f 101/134/122 116/143/122 117/146/122 2197 | f 109/120/123 124/145/123 125/147/123 2198 | f 102/121/124 117/146/124 118/148/124 2199 | f 111/124/125 110/122/125 125/147/125 2200 | f 103/123/126 118/148/126 119/150/126 2201 | f 111/124/127 126/149/127 127/135/127 2202 | f 104/125/128 119/150/128 120/151/128 2203 | f 117/146/129 116/143/129 131/152/129 2204 | f 124/145/130 139/168/130 140/154/130 2205 | f 117/146/131 132/153/131 133/155/131 2206 | f 126/149/132 125/147/132 140/154/132 2207 | f 118/148/133 133/155/133 134/157/133 2208 | f 126/149/134 141/156/134 142/158/134 2209 | f 120/151/135 119/150/135 134/157/135 2210 | f 128/136/136 127/135/136 142/158/136 2211 | f 120/151/137 135/159/137 136/161/137 2212 | f 128/136/138 143/160/138 144/162/138 2213 | f 122/139/139 121/137/139 136/161/139 2214 | f 130/140/140 129/138/140 144/162/140 2215 | f 122/139/141 137/163/141 138/165/141 2216 | f 123/141/144 138/165/144 139/168/144 2217 | f 135/159/145 150/185/145 151/169/145 2218 | f 144/162/146 143/160/146 158/170/146 2219 | f 137/163/147 136/161/147 151/169/147 2220 | f 144/162/148 159/171/148 160/173/148 2221 | f 137/163/149 152/172/149 153/174/149 2222 | f 138/165/152 153/174/152 154/178/152 2223 | f 131/152/153 146/176/153 147/179/153 2224 | f 139/168/154 154/178/154 155/180/154 2225 | f 133/155/155 132/153/155 147/179/155 2226 | f 141/156/156 140/154/156 155/180/156 2227 | f 133/155/157 148/181/157 149/183/157 2228 | f 141/156/158 156/182/158 157/184/158 2229 | f 134/157/159 149/183/159 150/185/159 2230 | f 142/158/160 157/184/160 158/170/160 2231 | f 154/178/161 169/201/161 170/186/161 2232 | f 147/179/162 162/202/162 163/187/162 2233 | f 156/182/163 155/180/163 170/186/163 2234 | f 148/181/164 163/187/164 164/189/164 2235 | f 156/182/165 171/188/165 172/190/165 2236 | f 150/185/166 149/183/166 164/189/166 2237 | f 158/170/167 157/184/167 172/190/167 2238 | f 150/185/168 165/191/168 166/193/168 2239 | f 158/170/521 173/192/521 174/194/521 2240 | f 152/172/170 151/169/170 166/193/170 2241 | f 159/171/522 174/194/522 175/196/522 2242 | f 152/172/172 167/195/172 168/197/172 2243 | f 154/178/175 153/174/175 168/197/175 2244 | f 146/176/176 161/199/176 162/202/176 2245 | f 173/192/177 188/219/177 189/203/177 2246 | f 167/195/178 166/193/178 181/204/178 2247 | f 175/196/523 174/194/523 189/203/523 2248 | f 167/195/180 182/205/180 183/207/180 2249 | f 168/197/183 183/207/183 184/211/183 2250 | f 161/199/184 176/209/184 177/212/184 2251 | f 169/201/185 184/211/185 185/213/185 2252 | f 162/202/186 177/212/186 178/214/186 2253 | f 170/186/187 185/213/187 186/215/187 2254 | f 163/187/188 178/214/188 179/216/188 2255 | f 171/188/189 186/215/189 187/217/189 2256 | f 164/189/190 179/216/190 180/218/190 2257 | f 173/192/191 172/190/191 187/217/191 2258 | f 165/191/192 180/218/192 181/204/192 2259 | f 177/212/193 192/236/193 193/220/193 2260 | f 186/215/194 185/213/194 200/221/194 2261 | f 179/216/195 178/214/195 193/220/195 2262 | f 186/215/196 201/222/196 202/224/196 2263 | f 180/218/197 179/216/197 194/223/197 2264 | f 188/219/198 187/217/198 202/224/198 2265 | f 180/218/199 195/225/199 196/227/199 2266 | f 188/219/200 203/226/200 204/228/200 2267 | f 182/205/201 181/204/201 196/227/201 2268 | f 190/206/202 189/203/202 204/228/202 2269 | f 182/205/203 197/229/203 198/231/203 2270 | f 184/211/206 183/207/206 198/231/206 2271 | f 176/209/207 191/233/207 192/236/207 2272 | f 184/211/208 199/235/208 200/221/208 2273 | f 197/229/209 196/227/209 212/237/209 2274 | f 204/228/524 220/253/524 221/239/524 2275 | f 197/229/211 213/238/211 214/240/211 2276 | f 198/231/214 214/240/214 215/244/214 2277 | f 191/233/215 207/242/215 208/245/215 2278 | f 199/235/216 215/244/216 216/246/216 2279 | f 193/220/217 192/236/217 208/245/217 2280 | f 201/222/218 200/221/218 216/246/218 2281 | f 193/220/219 209/247/219 210/249/219 2282 | f 201/222/220 217/248/220 218/250/220 2283 | f 194/223/221 210/249/221 211/251/221 2284 | f 203/226/222 202/224/222 218/250/222 2285 | f 195/225/223 211/251/223 212/237/223 2286 | f 203/226/525 219/252/525 220/253/525 2287 | f 217/248/225 216/246/225 231/254/225 2288 | f 209/247/226 224/270/226 225/256/226 2289 | f 217/248/227 232/255/227 233/257/227 2290 | f 210/249/228 225/256/228 226/258/228 2291 | f 218/250/229 233/257/229 234/259/229 2292 | f 211/251/230 226/258/230 227/260/230 2293 | f 219/252/231 234/259/231 235/261/231 2294 | f 213/238/232 212/237/232 227/260/232 2295 | f 221/239/233 220/253/233 235/261/233 2296 | f 213/238/234 228/262/234 229/264/234 2297 | f 214/240/237 229/264/237 230/268/237 2298 | f 207/242/238 222/266/238 223/269/238 2299 | f 215/244/239 230/268/239 231/254/239 2300 | f 208/245/240 223/269/240 224/270/240 2301 | f 236/263/241 235/261/241 250/271/241 2302 | f 228/262/242 243/287/242 244/273/242 2303 | f 229/264/245 244/273/245 245/277/245 2304 | f 222/266/246 237/275/246 238/278/246 2305 | f 230/268/247 245/277/247 246/279/247 2306 | f 224/270/248 223/269/248 238/278/248 2307 | f 232/255/249 231/254/249 246/279/249 2308 | f 225/256/250 224/270/250 239/280/250 2309 | f 232/255/251 247/281/251 248/283/251 2310 | f 225/256/252 240/282/252 241/284/252 2311 | f 234/259/253 233/257/253 248/283/253 2312 | f 226/258/254 241/284/254 242/286/254 2313 | f 234/259/255 249/285/255 250/271/255 2314 | f 228/262/256 227/260/256 242/286/256 2315 | f 247/281/257 262/304/257 263/288/257 2316 | f 241/284/258 240/282/258 255/289/258 2317 | f 248/283/259 263/288/259 264/291/259 2318 | f 241/284/260 256/290/260 257/292/260 2319 | f 249/285/261 264/291/261 265/293/261 2320 | f 243/287/262 242/286/262 257/292/262 2321 | f 250/271/263 265/293/263 266/295/263 2322 | f 243/287/264 258/294/264 259/296/264 2323 | f 244/273/267 259/296/267 260/300/267 2324 | f 237/275/268 252/298/268 253/301/268 2325 | f 245/277/269 260/300/269 261/302/269 2326 | f 238/278/270 253/301/270 254/303/270 2327 | f 247/281/271 246/279/271 261/302/271 2328 | f 240/282/272 239/280/272 254/303/272 2329 | f 260/300/275 259/296/275 274/309/275 2330 | f 252/298/526 267/306/526 268/311/526 2331 | f 260/300/277 275/310/277 276/312/277 2332 | f 253/301/278 268/311/278 269/313/278 2333 | f 262/304/279 261/302/279 276/312/279 2334 | f 255/289/280 254/303/280 269/313/280 2335 | f 262/304/281 277/314/281 278/316/281 2336 | f 256/290/282 255/289/282 270/315/282 2337 | f 263/288/283 278/316/283 279/318/283 2338 | f 256/290/284 271/317/284 272/319/284 2339 | f 265/293/285 264/291/285 279/318/285 2340 | f 258/294/286 257/292/286 272/319/286 2341 | f 266/295/287 265/293/287 280/320/287 2342 | f 258/294/288 273/321/288 274/309/288 2343 | f 271/317/289 270/315/289 285/322/289 2344 | f 279/318/290 278/316/290 293/324/290 2345 | f 271/317/291 286/323/291 287/326/291 2346 | f 279/318/527 294/325/527 295/327/527 2347 | f 273/321/293 272/319/293 287/326/293 2348 | f 281/308/294 280/320/294 295/327/294 2349 | f 273/321/295 288/328/295 289/330/295 2350 | f 274/309/298 289/330/298 290/334/298 2351 | f 267/306/528 282/332/528 283/335/528 2352 | f 275/310/300 290/334/300 291/336/300 2353 | f 268/311/301 283/335/301 284/337/301 2354 | f 277/314/302 276/312/302 291/336/302 2355 | f 269/313/303 284/337/303 285/322/303 2356 | f 277/314/304 292/338/304 293/324/304 2357 | f 289/330/305 305/352/305 306/339/305 2358 | f 282/332/306 298/354/306 299/340/306 2359 | f 290/334/307 306/339/307 307/341/307 2360 | f 283/335/308 299/340/308 300/342/308 2361 | f 292/338/309 291/336/309 307/341/309 2362 | f 285/322/310 284/337/310 300/342/310 2363 | f 292/338/311 308/343/311 309/345/311 2364 | f 286/323/312 285/322/312 301/344/312 2365 | f 293/324/313 309/345/313 310/347/313 2366 | f 286/323/314 302/346/314 303/348/314 2367 | f 294/325/315 310/347/315 311/349/315 2368 | f 288/328/316 287/326/316 303/348/316 2369 | f 295/327/317 311/349/317 312/351/317 2370 | f 289/330/318 288/328/318 304/350/318 2371 | f 309/345/321 324/371/321 325/356/321 2372 | f 302/346/322 317/372/322 318/357/322 2373 | f 311/349/323 310/347/323 325/356/323 2374 | f 304/350/324 303/348/324 318/357/324 2375 | f 311/349/325 326/358/325 327/360/325 2376 | f 304/350/326 319/359/326 320/361/326 2377 | f 305/352/329 320/361/329 321/365/329 2378 | f 298/354/330 313/363/330 314/366/330 2379 | f 306/339/331 321/365/331 322/367/331 2380 | f 299/340/332 314/366/332 315/368/332 2381 | f 308/343/333 307/341/333 322/367/333 2382 | f 301/344/334 300/342/334 315/368/334 2383 | f 308/343/335 323/369/335 324/371/335 2384 | f 302/346/336 301/344/336 316/370/336 2385 | f 313/363/337 328/387/337 329/373/337 2386 | f 321/365/338 336/389/338 337/374/338 2387 | f 314/366/529 329/373/529 330/375/529 2388 | f 323/369/340 322/367/340 337/374/340 2389 | f 316/370/341 315/368/341 330/375/341 2390 | f 324/371/342 323/369/342 338/376/342 2391 | f 317/372/343 316/370/343 331/377/343 2392 | f 324/371/344 339/378/344 340/380/344 2393 | f 317/372/345 332/379/345 333/381/345 2394 | f 326/358/346 325/356/346 340/380/346 2395 | f 319/359/347 318/357/347 333/381/347 2396 | f 327/360/348 326/358/348 341/382/348 2397 | f 319/359/349 334/383/349 335/385/349 2398 | f 320/361/352 335/385/352 336/389/352 2399 | f 332/379/353 347/406/353 348/390/353 2400 | f 341/382/354 340/380/354 355/391/354 2401 | f 334/383/355 333/381/355 348/390/355 2402 | f 341/382/356 356/392/356 357/394/356 2403 | f 334/383/357 349/393/357 350/395/357 2404 | f 335/385/360 350/395/360 351/399/360 2405 | f 329/373/361 328/387/361 343/397/361 2406 | f 336/389/362 351/399/362 352/401/362 2407 | f 329/373/363 344/400/363 345/402/363 2408 | f 338/376/364 337/374/364 352/401/364 2409 | f 331/377/365 330/375/365 345/402/365 2410 | f 338/376/366 353/403/366 354/405/366 2411 | f 332/379/367 331/377/367 346/404/367 2412 | f 339/378/368 354/405/368 355/391/368 2413 | f 351/399/369 366/422/369 367/407/369 2414 | f 344/400/370 359/423/370 360/408/370 2415 | f 353/403/371 352/401/371 367/407/371 2416 | f 346/404/372 345/402/372 360/408/372 2417 | f 353/403/373 368/409/373 369/411/373 2418 | f 346/404/374 361/410/374 362/412/374 2419 | f 355/391/375 354/405/375 369/411/375 2420 | f 347/406/376 362/412/376 363/414/376 2421 | f 356/392/377 355/391/377 370/413/377 2422 | f 349/393/378 348/390/378 363/414/378 2423 | f 356/392/379 371/415/379 372/417/379 2424 | f 349/393/380 364/416/380 365/418/380 2425 | f 351/399/383 350/395/383 365/418/383 2426 | f 344/400/384 343/397/384 358/420/384 2427 | f 371/424/385 370/454/385 385/425/385 2428 | f 364/427/386 363/455/386 378/428/386 2429 | f 371/424/387 386/426/387 387/430/387 2430 | f 364/427/388 379/429/388 380/432/388 2431 | f 366/438/391 365/433/391 380/432/391 2432 | f 359/440/392 358/434/392 373/436/392 2433 | f 366/438/393 381/439/393 382/442/393 2434 | f 359/440/394 374/441/394 375/444/394 2435 | f 368/446/395 367/443/395 382/442/395 2436 | f 361/448/396 360/445/396 375/444/396 2437 | f 368/446/397 383/447/397 384/450/397 2438 | f 362/452/398 361/448/398 376/449/398 2439 | f 369/451/399 384/450/399 385/425/399 2440 | f 362/452/400 377/453/400 378/428/400 2441 | f 383/447/401 382/442/401 397/456/401 2442 | f 376/449/402 375/444/402 390/458/402 2443 | f 383/447/403 398/457/403 399/460/403 2444 | f 376/449/404 391/459/404 392/461/404 2445 | f 384/450/405 399/460/405 400/462/405 2446 | f 377/453/406 392/461/406 393/463/406 2447 | f 386/426/407 385/425/407 400/462/407 2448 | f 379/429/408 378/428/408 393/463/408 2449 | f 386/426/409 401/464/409 402/466/409 2450 | f 379/429/410 394/465/410 395/467/410 2451 | f 380/432/413 395/467/413 396/471/413 2452 | f 373/436/414 388/469/414 389/472/414 2453 | f 381/439/415 396/471/415 397/456/415 2454 | f 374/441/416 389/472/416 390/458/416 2455 | f 401/464/417 416/488/417 417/473/417 2456 | f 394/465/418 409/489/418 410/474/418 2457 | f 396/471/421 395/467/421 410/474/421 2458 | f 388/469/422 403/476/422 404/479/422 2459 | f 396/471/423 411/478/423 412/480/423 2460 | f 390/458/424 389/472/424 404/479/424 2461 | f 398/457/425 397/456/425 412/480/425 2462 | f 391/459/426 390/458/426 405/481/426 2463 | f 398/457/427 413/482/427 414/484/427 2464 | f 392/461/428 391/459/428 406/483/428 2465 | f 399/460/429 414/484/429 415/486/429 2466 | f 392/461/430 407/485/430 408/487/430 2467 | f 401/464/530 400/462/530 415/486/530 2468 | f 394/465/432 393/463/432 408/487/432 2469 | f 405/481/433 420/505/433 421/490/433 2470 | f 413/482/434 428/506/434 429/491/434 2471 | f 407/485/435 406/483/435 421/490/435 2472 | f 414/484/436 429/491/436 430/493/436 2473 | f 407/485/437 422/492/437 423/494/437 2474 | f 415/486/438 430/493/438 431/495/438 2475 | f 409/489/439 408/487/439 423/494/439 2476 | f 416/488/440 431/495/440 432/497/440 2477 | f 409/489/441 424/496/441 425/498/441 2478 | f 411/478/444 410/474/444 425/498/444 2479 | f 403/476/445 418/500/445 419/503/445 2480 | f 411/478/446 426/502/446 427/504/446 2481 | f 404/479/447 419/503/447 420/505/447 2482 | f 413/482/448 412/480/448 427/504/448 2483 | f 425/498/449 424/496/449 439/507/449 2484 | f 425/498/452 440/508/452 441/513/452 2485 | f 418/500/453 433/510/453 434/514/453 2486 | f 426/502/454 441/513/454 442/515/454 2487 | f 419/503/455 434/514/455 435/516/455 2488 | f 428/506/456 427/504/456 442/515/456 2489 | f 420/505/457 435/516/457 436/518/457 2490 | f 428/506/458 443/517/458 444/519/458 2491 | f 422/492/459 421/490/459 436/518/459 2492 | f 430/493/460 429/491/460 444/519/460 2493 | f 422/492/461 437/520/461 438/522/461 2494 | f 430/493/462 445/521/462 446/523/462 2495 | f 424/496/463 423/494/463 438/522/463 2496 | f 431/495/464 446/523/464 447/512/464 2497 | f 443/517/465 458/540/465 459/524/465 2498 | f 437/520/466 436/518/466 451/525/466 2499 | f 444/519/467 459/524/467 460/527/467 2500 | f 437/520/468 452/526/468 453/528/468 2501 | f 445/521/531 460/527/531 461/529/531 2502 | f 439/507/470 438/522/470 453/528/470 2503 | f 446/523/471 461/529/471 462/531/471 2504 | f 439/507/472 454/530/472 455/532/472 2505 | f 440/508/475 455/532/475 456/536/475 2506 | f 434/514/476 433/510/476 448/534/476 2507 | f 441/513/477 456/536/477 457/538/477 2508 | f 435/516/478 434/514/478 449/537/478 2509 | f 443/517/479 442/515/479 457/538/479 2510 | f 436/518/480 435/516/480 450/539/480 2511 | f 455/532/483 470/557/483 471/545/483 2512 | f 448/534/484 463/542/484 464/546/484 2513 | f 456/536/485 471/545/485 472/547/485 2514 | f 449/537/486 464/546/486 465/548/486 2515 | f 458/540/487 457/538/487 472/547/487 2516 | f 450/539/488 465/548/488 466/550/488 2517 | f 458/540/489 473/549/489 474/551/489 2518 | f 452/526/490 451/525/490 466/550/490 2519 | f 459/524/491 474/551/491 475/553/491 2520 | f 452/526/492 467/552/492 468/554/492 2521 | f 460/527/493 475/553/493 476/555/493 2522 | f 454/530/494 453/528/494 468/554/494 2523 | f 462/531/495 461/529/495 476/555/495 2524 | f 454/530/496 469/556/496 470/557/496 2525 | f 467/552/497 466/550/497 4/4/497 2526 | f 474/551/498 480/3/498 10/8/498 2527 | f 468/554/499 467/552/499 5/6/499 2528 | f 475/553/500 10/8/500 481/12/500 2529 | f 469/556/501 468/554/501 6/10/501 2530 | f 476/555/502 481/12/502 482/16/502 2531 | f 470/557/532 469/556/532 7/14/532 2532 | f 470/557/533 8/18/533 9/24/533 2533 | f 464/546/507 463/542/507 1/19/507 2534 | f 471/545/508 9/24/508 478/28/508 2535 | f 465/548/509 464/546/509 2/26/509 2536 | f 473/549/510 472/547/510 478/28/510 2537 | f 466/550/511 465/548/511 3/29/511 2538 | f 473/549/512 479/1/512 480/3/512 2539 | -------------------------------------------------------------------------------- /assets/starfield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groverburger/g3d/b72a98c1bc8318411d4cd32d1ed6bffd434bc274/assets/starfield.png -------------------------------------------------------------------------------- /conf.lua: -------------------------------------------------------------------------------- 1 | function love.conf(t) 2 | t.window.depth = 16 3 | t.window.title = "g3d demo" 4 | end 5 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groverburger/g3d/b72a98c1bc8318411d4cd32d1ed6bffd434bc274/demo.gif -------------------------------------------------------------------------------- /g3d/camera.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | local newMatrix = require(g3d.path .. ".matrices") 6 | local g3d = g3d -- save a reference to g3d in case the user makes it non-global 7 | 8 | ---------------------------------------------------------------------------------------------------- 9 | -- define the camera singleton 10 | ---------------------------------------------------------------------------------------------------- 11 | 12 | local camera = { 13 | fov = math.pi/2, 14 | nearClip = 0.01, 15 | farClip = 1000, 16 | aspectRatio = love.graphics.getWidth()/love.graphics.getHeight(), 17 | position = {0,0,0}, 18 | target = {1,0,0}, 19 | up = {0,0,1}, 20 | 21 | viewMatrix = newMatrix(), 22 | projectionMatrix = newMatrix(), 23 | } 24 | 25 | -- private variables used only for the first person camera functions 26 | local fpsController = { 27 | direction = 0, 28 | pitch = 0, 29 | } 30 | 31 | -- read-only variables, can't be set by the end user 32 | function camera.getDirectionPitch() 33 | return fpsController.direction, fpsController.pitch 34 | end 35 | 36 | -- convenient function to return the camera's normalized look vector 37 | function camera.getLookVector() 38 | local vx = camera.target[1] - camera.position[1] 39 | local vy = camera.target[2] - camera.position[2] 40 | local vz = camera.target[3] - camera.position[3] 41 | local length = math.sqrt(vx^2 + vy^2 + vz^2) 42 | 43 | -- make sure not to divide by 0 44 | if length > 0 then 45 | return vx/length, vy/length, vz/length 46 | end 47 | return vx,vy,vz 48 | end 49 | 50 | -- give the camera a point to look from and a point to look towards 51 | function camera.lookAt(x,y,z, xAt,yAt,zAt) 52 | camera.position[1] = x 53 | camera.position[2] = y 54 | camera.position[3] = z 55 | camera.target[1] = xAt 56 | camera.target[2] = yAt 57 | camera.target[3] = zAt 58 | 59 | -- update the fpsController's direction and pitch based on lookAt 60 | local dx,dy,dz = camera.getLookVector() 61 | fpsController.direction = math.pi/2 - math.atan2(dz, dx) 62 | fpsController.pitch = math.atan2(dy, math.sqrt(dx^2 + dz^2)) 63 | 64 | -- update the camera in the shader 65 | camera.updateViewMatrix() 66 | end 67 | 68 | -- move and rotate the camera, given a point and a direction and a pitch (vertical direction) 69 | function camera.lookInDirection(x,y,z, directionTowards,pitchTowards) 70 | camera.position[1] = x or camera.position[1] 71 | camera.position[2] = y or camera.position[2] 72 | camera.position[3] = z or camera.position[3] 73 | 74 | fpsController.direction = directionTowards or fpsController.direction 75 | fpsController.pitch = pitchTowards or fpsController.pitch 76 | 77 | -- turn the cos of the pitch into a sign value, either 1, -1, or 0 78 | local sign = math.cos(fpsController.pitch) 79 | sign = (sign > 0 and 1) or (sign < 0 and -1) or 0 80 | 81 | -- don't let cosPitch ever hit 0, because weird camera glitches will happen 82 | local cosPitch = sign*math.max(math.abs(math.cos(fpsController.pitch)), 0.00001) 83 | 84 | -- convert the direction and pitch into a target point 85 | camera.target[1] = camera.position[1]+math.cos(fpsController.direction)*cosPitch 86 | camera.target[2] = camera.position[2]+math.sin(fpsController.direction)*cosPitch 87 | camera.target[3] = camera.position[3]+math.sin(fpsController.pitch) 88 | 89 | -- update the camera in the shader 90 | camera.updateViewMatrix() 91 | end 92 | 93 | -- recreate the camera's view matrix from its current values 94 | function camera.updateViewMatrix() 95 | camera.viewMatrix:setViewMatrix(camera.position, camera.target, camera.up) 96 | end 97 | 98 | -- recreate the camera's projection matrix from its current values 99 | function camera.updateProjectionMatrix() 100 | camera.projectionMatrix:setProjectionMatrix(camera.fov, camera.nearClip, camera.farClip, camera.aspectRatio) 101 | end 102 | 103 | -- recreate the camera's orthographic projection matrix from its current values 104 | function camera.updateOrthographicMatrix(size) 105 | camera.projectionMatrix:setOrthographicMatrix(camera.fov, size or 5, camera.nearClip, camera.farClip, camera.aspectRatio) 106 | end 107 | 108 | -- simple first person camera movement with WASD 109 | -- put this local function in your love.update to use, passing in dt 110 | function camera.firstPersonMovement(dt) 111 | -- collect inputs 112 | local moveX, moveY = 0, 0 113 | local cameraMoved = false 114 | local speed = 9 115 | if love.keyboard.isDown "w" then moveX = moveX + 1 end 116 | if love.keyboard.isDown "a" then moveY = moveY + 1 end 117 | if love.keyboard.isDown "s" then moveX = moveX - 1 end 118 | if love.keyboard.isDown "d" then moveY = moveY - 1 end 119 | if love.keyboard.isDown "space" then 120 | camera.position[3] = camera.position[3] + speed*dt 121 | cameraMoved = true 122 | end 123 | if love.keyboard.isDown "lshift" then 124 | camera.position[3] = camera.position[3] - speed*dt 125 | cameraMoved = true 126 | end 127 | 128 | -- do some trigonometry on the inputs to make movement relative to camera's direction 129 | -- also to make the player not move faster in diagonal directions 130 | if moveX ~= 0 or moveY ~= 0 then 131 | local angle = math.atan2(moveY, moveX) 132 | camera.position[1] = camera.position[1] + math.cos(fpsController.direction + angle) * speed * dt 133 | camera.position[2] = camera.position[2] + math.sin(fpsController.direction + angle) * speed * dt 134 | cameraMoved = true 135 | end 136 | 137 | -- update the camera's in the shader 138 | -- only if the camera moved, for a slight performance benefit 139 | if cameraMoved then 140 | camera.lookInDirection() 141 | end 142 | end 143 | 144 | -- use this in your love.mousemoved function, passing in the movements 145 | function camera.firstPersonLook(dx,dy) 146 | -- capture the mouse 147 | love.mouse.setRelativeMode(true) 148 | 149 | local sensitivity = 1/300 150 | fpsController.direction = fpsController.direction - dx*sensitivity 151 | fpsController.pitch = math.max(math.min(fpsController.pitch - dy*sensitivity, math.pi*0.5), math.pi*-0.5) 152 | 153 | camera.lookInDirection(camera.position[1],camera.position[2],camera.position[3], fpsController.direction,fpsController.pitch) 154 | end 155 | 156 | return camera 157 | -------------------------------------------------------------------------------- /g3d/collisions.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | local vectors = require(g3d.path .. ".vectors") 6 | local fastSubtract = vectors.subtract 7 | local vectorAdd = vectors.add 8 | local vectorCrossProduct = vectors.crossProduct 9 | local vectorDotProduct = vectors.dotProduct 10 | local vectorNormalize = vectors.normalize 11 | local vectorMagnitude = vectors.magnitude 12 | 13 | ---------------------------------------------------------------------------------------------------- 14 | -- collision detection functions 15 | ---------------------------------------------------------------------------------------------------- 16 | -- 17 | -- none of these functions are required for developing 3D games 18 | -- however these collision functions are very frequently used in 3D games 19 | -- 20 | -- be warned! a lot of this code is butt-ugly 21 | -- using a table per vector would create a bazillion tables and lots of used memory 22 | -- so instead all vectors are all represented using three number variables each 23 | -- this approach ends up making the code look terrible, but collision functions need to be efficient 24 | 25 | local collisions = {} 26 | 27 | -- finds the closest point to the source point on the given line segment 28 | local function closestPointOnLineSegment( 29 | a_x,a_y,a_z, -- point one of line segment 30 | b_x,b_y,b_z, -- point two of line segment 31 | x,y,z -- source point 32 | ) 33 | local ab_x, ab_y, ab_z = b_x - a_x, b_y - a_y, b_z - a_z 34 | local t = vectorDotProduct(x - a_x, y - a_y, z - a_z, ab_x, ab_y, ab_z) / (ab_x^2 + ab_y^2 + ab_z^2) 35 | t = math.min(1, math.max(0, t)) 36 | return a_x + t*ab_x, a_y + t*ab_y, a_z + t*ab_z 37 | end 38 | 39 | -- model - ray intersection 40 | -- based off of triangle - ray collision from excessive's CPML library 41 | -- does a triangle - ray collision for every face in the model to find the shortest collision 42 | -- 43 | -- sources: 44 | -- https://github.com/excessive/cpml/blob/master/modules/intersect.lua 45 | -- http://www.lighthouse3d.com/tutorials/maths/ray-triangle-intersection/ 46 | local tiny = 2.2204460492503131e-16 -- the smallest possible value for a double, "double epsilon" 47 | local function triangleRay( 48 | tri_0_x, tri_0_y, tri_0_z, 49 | tri_1_x, tri_1_y, tri_1_z, 50 | tri_2_x, tri_2_y, tri_2_z, 51 | n_x, n_y, n_z, 52 | src_x, src_y, src_z, 53 | dir_x, dir_y, dir_z 54 | ) 55 | 56 | -- cache these variables for efficiency 57 | local e11,e12,e13 = fastSubtract(tri_1_x,tri_1_y,tri_1_z, tri_0_x,tri_0_y,tri_0_z) 58 | local e21,e22,e23 = fastSubtract(tri_2_x,tri_2_y,tri_2_z, tri_0_x,tri_0_y,tri_0_z) 59 | local h1,h2,h3 = vectorCrossProduct(dir_x,dir_y,dir_z, e21,e22,e23) 60 | local a = vectorDotProduct(h1,h2,h3, e11,e12,e13) 61 | 62 | -- if a is too close to 0, ray does not intersect triangle 63 | if math.abs(a) <= tiny then 64 | return 65 | end 66 | 67 | local s1,s2,s3 = fastSubtract(src_x,src_y,src_z, tri_0_x,tri_0_y,tri_0_z) 68 | local u = vectorDotProduct(s1,s2,s3, h1,h2,h3) / a 69 | 70 | -- ray does not intersect triangle 71 | if u < 0 or u > 1 then 72 | return 73 | end 74 | 75 | local q1,q2,q3 = vectorCrossProduct(s1,s2,s3, e11,e12,e13) 76 | local v = vectorDotProduct(dir_x,dir_y,dir_z, q1,q2,q3) / a 77 | 78 | -- ray does not intersect triangle 79 | if v < 0 or u + v > 1 then 80 | return 81 | end 82 | 83 | -- at this stage we can compute t to find out where 84 | -- the intersection point is on the line 85 | local thisLength = vectorDotProduct(q1,q2,q3, e21,e22,e23) / a 86 | 87 | -- if hit this triangle and it's closer than any other hit triangle 88 | if thisLength >= tiny and (not finalLength or thisLength < finalLength) then 89 | --local norm_x, norm_y, norm_z = vectorCrossProduct(e11,e12,e13, e21,e22,e23) 90 | 91 | return thisLength, src_x + dir_x*thisLength, src_y + dir_y*thisLength, src_z + dir_z*thisLength, n_x,n_y,n_z 92 | end 93 | end 94 | 95 | -- detects a collision between a triangle and a sphere 96 | -- 97 | -- sources: 98 | -- https://wickedengine.net/2020/04/26/capsule-collision-detection/ 99 | local function triangleSphere( 100 | tri_0_x, tri_0_y, tri_0_z, 101 | tri_1_x, tri_1_y, tri_1_z, 102 | tri_2_x, tri_2_y, tri_2_z, 103 | tri_n_x, tri_n_y, tri_n_z, 104 | src_x, src_y, src_z, radius 105 | ) 106 | 107 | -- recalculate surface normal of this triangle 108 | local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z 109 | local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z 110 | local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z)) 111 | 112 | -- distance from src to a vertex on the triangle 113 | local dist = vectorDotProduct(src_x - tri_0_x, src_y - tri_0_y, src_z - tri_0_z, n_x, n_y, n_z) 114 | 115 | -- collision not possible, just return 116 | if dist < -radius or dist > radius then 117 | return 118 | end 119 | 120 | -- itx stands for intersection 121 | local itx_x, itx_y, itx_z = src_x - n_x * dist, src_y - n_y * dist, src_z - n_z * dist 122 | 123 | -- determine whether itx is inside the triangle 124 | -- project it onto the triangle and return if this is the case 125 | local c0_x, c0_y, c0_z = vectorCrossProduct(itx_x - tri_0_x, itx_y - tri_0_y, itx_z - tri_0_z, tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z) 126 | local c1_x, c1_y, c1_z = vectorCrossProduct(itx_x - tri_1_x, itx_y - tri_1_y, itx_z - tri_1_z, tri_2_x - tri_1_x, tri_2_y - tri_1_y, tri_2_z - tri_1_z) 127 | local c2_x, c2_y, c2_z = vectorCrossProduct(itx_x - tri_2_x, itx_y - tri_2_y, itx_z - tri_2_z, tri_0_x - tri_2_x, tri_0_y - tri_2_y, tri_0_z - tri_2_z) 128 | if vectorDotProduct(c0_x, c0_y, c0_z, n_x, n_y, n_z) <= 0 129 | and vectorDotProduct(c1_x, c1_y, c1_z, n_x, n_y, n_z) <= 0 130 | and vectorDotProduct(c2_x, c2_y, c2_z, n_x, n_y, n_z) <= 0 then 131 | n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z 132 | 133 | -- the sphere is inside the triangle, so the normal is zero 134 | -- instead, just return the triangle's normal 135 | if n_x == 0 and n_y == 0 and n_z == 0 then 136 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z 137 | end 138 | 139 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z 140 | end 141 | 142 | -- itx is outside triangle 143 | -- find points on all three line segments that are closest to itx 144 | -- if distance between itx and one of these three closest points is in range, there is an intersection 145 | local radiussq = radius * radius 146 | local smallestDist 147 | 148 | local line1_x, line1_y, line1_z = closestPointOnLineSegment(tri_0_x, tri_0_y, tri_0_z, tri_1_x, tri_1_y, tri_1_z, src_x, src_y, src_z) 149 | local dist = (src_x - line1_x)^2 + (src_y - line1_y)^2 + (src_z - line1_z)^2 150 | if dist <= radiussq then 151 | smallestDist = dist 152 | itx_x, itx_y, itx_z = line1_x, line1_y, line1_z 153 | end 154 | 155 | local line2_x, line2_y, line2_z = closestPointOnLineSegment(tri_1_x, tri_1_y, tri_1_z, tri_2_x, tri_2_y, tri_2_z, src_x, src_y, src_z) 156 | local dist = (src_x - line2_x)^2 + (src_y - line2_y)^2 + (src_z - line2_z)^2 157 | if (smallestDist and dist < smallestDist or not smallestDist) and dist <= radiussq then 158 | smallestDist = dist 159 | itx_x, itx_y, itx_z = line2_x, line2_y, line2_z 160 | end 161 | 162 | local line3_x, line3_y, line3_z = closestPointOnLineSegment(tri_2_x, tri_2_y, tri_2_z, tri_0_x, tri_0_y, tri_0_z, src_x, src_y, src_z) 163 | local dist = (src_x - line3_x)^2 + (src_y - line3_y)^2 + (src_z - line3_z)^2 164 | if (smallestDist and dist < smallestDist or not smallestDist) and dist <= radiussq then 165 | smallestDist = dist 166 | itx_x, itx_y, itx_z = line3_x, line3_y, line3_z 167 | end 168 | 169 | if smallestDist then 170 | n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z 171 | 172 | -- the sphere is inside the triangle, so the normal is zero 173 | -- instead, just return the triangle's normal 174 | if n_x == 0 and n_y == 0 and n_z == 0 then 175 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z 176 | end 177 | 178 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z 179 | end 180 | end 181 | 182 | -- finds the closest point on the triangle from the source point given 183 | -- 184 | -- sources: 185 | -- https://wickedengine.net/2020/04/26/capsule-collision-detection/ 186 | local function trianglePoint( 187 | tri_0_x, tri_0_y, tri_0_z, 188 | tri_1_x, tri_1_y, tri_1_z, 189 | tri_2_x, tri_2_y, tri_2_z, 190 | tri_n_x, tri_n_y, tri_n_z, 191 | src_x, src_y, src_z 192 | ) 193 | 194 | -- recalculate surface normal of this triangle 195 | local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z 196 | local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z 197 | local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z)) 198 | 199 | -- distance from src to a vertex on the triangle 200 | local dist = vectorDotProduct(src_x - tri_0_x, src_y - tri_0_y, src_z - tri_0_z, n_x, n_y, n_z) 201 | 202 | -- itx stands for intersection 203 | local itx_x, itx_y, itx_z = src_x - n_x * dist, src_y - n_y * dist, src_z - n_z * dist 204 | 205 | -- determine whether itx is inside the triangle 206 | -- project it onto the triangle and return if this is the case 207 | local c0_x, c0_y, c0_z = vectorCrossProduct(itx_x - tri_0_x, itx_y - tri_0_y, itx_z - tri_0_z, tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z) 208 | local c1_x, c1_y, c1_z = vectorCrossProduct(itx_x - tri_1_x, itx_y - tri_1_y, itx_z - tri_1_z, tri_2_x - tri_1_x, tri_2_y - tri_1_y, tri_2_z - tri_1_z) 209 | local c2_x, c2_y, c2_z = vectorCrossProduct(itx_x - tri_2_x, itx_y - tri_2_y, itx_z - tri_2_z, tri_0_x - tri_2_x, tri_0_y - tri_2_y, tri_0_z - tri_2_z) 210 | if vectorDotProduct(c0_x, c0_y, c0_z, n_x, n_y, n_z) <= 0 211 | and vectorDotProduct(c1_x, c1_y, c1_z, n_x, n_y, n_z) <= 0 212 | and vectorDotProduct(c2_x, c2_y, c2_z, n_x, n_y, n_z) <= 0 then 213 | n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z 214 | 215 | -- the sphere is inside the triangle, so the normal is zero 216 | -- instead, just return the triangle's normal 217 | if n_x == 0 and n_y == 0 and n_z == 0 then 218 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z 219 | end 220 | 221 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z 222 | end 223 | 224 | -- itx is outside triangle 225 | -- find points on all three line segments that are closest to itx 226 | -- if distance between itx and one of these three closest points is in range, there is an intersection 227 | local line1_x, line1_y, line1_z = closestPointOnLineSegment(tri_0_x, tri_0_y, tri_0_z, tri_1_x, tri_1_y, tri_1_z, src_x, src_y, src_z) 228 | local dist = (src_x - line1_x)^2 + (src_y - line1_y)^2 + (src_z - line1_z)^2 229 | local smallestDist = dist 230 | itx_x, itx_y, itx_z = line1_x, line1_y, line1_z 231 | 232 | local line2_x, line2_y, line2_z = closestPointOnLineSegment(tri_1_x, tri_1_y, tri_1_z, tri_2_x, tri_2_y, tri_2_z, src_x, src_y, src_z) 233 | local dist = (src_x - line2_x)^2 + (src_y - line2_y)^2 + (src_z - line2_z)^2 234 | if smallestDist and dist < smallestDist then 235 | smallestDist = dist 236 | itx_x, itx_y, itx_z = line2_x, line2_y, line2_z 237 | end 238 | 239 | local line3_x, line3_y, line3_z = closestPointOnLineSegment(tri_2_x, tri_2_y, tri_2_z, tri_0_x, tri_0_y, tri_0_z, src_x, src_y, src_z) 240 | local dist = (src_x - line3_x)^2 + (src_y - line3_y)^2 + (src_z - line3_z)^2 241 | if smallestDist and dist < smallestDist then 242 | smallestDist = dist 243 | itx_x, itx_y, itx_z = line3_x, line3_y, line3_z 244 | end 245 | 246 | if smallestDist then 247 | n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z 248 | 249 | -- the sphere is inside the triangle, so the normal is zero 250 | -- instead, just return the triangle's normal 251 | if n_x == 0 and n_y == 0 and n_z == 0 then 252 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z 253 | end 254 | 255 | return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z 256 | end 257 | end 258 | 259 | -- finds the collision point between a triangle and a capsule 260 | -- capsules are defined with two points and a radius 261 | -- 262 | -- sources: 263 | -- https://wickedengine.net/2020/04/26/capsule-collision-detection/ 264 | local function triangleCapsule( 265 | tri_0_x, tri_0_y, tri_0_z, 266 | tri_1_x, tri_1_y, tri_1_z, 267 | tri_2_x, tri_2_y, tri_2_z, 268 | n_x, n_y, n_z, 269 | tip_x, tip_y, tip_z, 270 | base_x, base_y, base_z, 271 | a_x, a_y, a_z, 272 | b_x, b_y, b_z, 273 | capn_x, capn_y, capn_z, 274 | radius 275 | ) 276 | 277 | -- find the normal of this triangle 278 | -- tbd if necessary, this sometimes fixes weird edgecases 279 | local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z 280 | local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z 281 | local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z)) 282 | 283 | local dotOfNormals = math.abs(vectorDotProduct(n_x, n_y, n_z, capn_x, capn_y, capn_z)) 284 | 285 | -- default reference point to an arbitrary point on the triangle 286 | -- for when dotOfNormals is 0, because then the capsule is parallel to the triangle 287 | local ref_x, ref_y, ref_z = tri_0_x, tri_0_y, tri_0_z 288 | 289 | if dotOfNormals > 0 then 290 | -- capsule is not parallel to the triangle's plane 291 | -- find where the capsule's normal vector intersects the triangle's plane 292 | local t = vectorDotProduct(n_x, n_y, n_z, (tri_0_x - base_x) / dotOfNormals, (tri_0_y - base_y) / dotOfNormals, (tri_0_z - base_z) / dotOfNormals) 293 | local plane_itx_x, plane_itx_y, plane_itx_z = base_x + capn_x*t, base_y + capn_y*t, base_z + capn_z*t 294 | local _ 295 | 296 | -- then clamp that plane intersect point onto the triangle itself 297 | -- this is the new reference point 298 | _, ref_x, ref_y, ref_z = trianglePoint( 299 | tri_0_x, tri_0_y, tri_0_z, 300 | tri_1_x, tri_1_y, tri_1_z, 301 | tri_2_x, tri_2_y, tri_2_z, 302 | n_x, n_y, n_z, 303 | plane_itx_x, plane_itx_y, plane_itx_z 304 | ) 305 | end 306 | 307 | -- find the closest point on the capsule line to the reference point 308 | local c_x, c_y, c_z = closestPointOnLineSegment(a_x, a_y, a_z, b_x, b_y, b_z, ref_x, ref_y, ref_z) 309 | 310 | -- do a sphere cast from that closest point to the triangle and return the result 311 | return triangleSphere( 312 | tri_0_x, tri_0_y, tri_0_z, 313 | tri_1_x, tri_1_y, tri_1_z, 314 | tri_2_x, tri_2_y, tri_2_z, 315 | n_x, n_y, n_z, 316 | c_x, c_y, c_z, radius 317 | ) 318 | end 319 | 320 | ---------------------------------------------------------------------------------------------------- 321 | -- function appliers 322 | ---------------------------------------------------------------------------------------------------- 323 | -- these functions apply the collision test functions on the given list of triangles 324 | 325 | -- runs a given intersection function on all of the triangles made up of a given vert table 326 | local function findClosest(self, verts, func, ...) 327 | -- declare the variables that will be returned by the function 328 | local finalLength, where_x, where_y, where_z, norm_x, norm_y, norm_z 329 | 330 | -- cache references to this model's properties for efficiency 331 | local translation_x, translation_y, translation_z, scale_x, scale_y, scale_z = 0, 0, 0, 1, 1, 1 332 | if self then 333 | if self.translation then 334 | translation_x = self.translation[1] 335 | translation_y = self.translation[2] 336 | translation_z = self.translation[3] 337 | end 338 | if self.scale then 339 | scale_x = self.scale[1] 340 | scale_y = self.scale[2] 341 | scale_z = self.scale[3] 342 | end 343 | end 344 | 345 | for v=1, #verts, 3 do 346 | -- apply the function given with the arguments given 347 | -- also supply the points of the current triangle 348 | local n_x, n_y, n_z = vectorNormalize( 349 | verts[v][6]*scale_x, 350 | verts[v][7]*scale_x, 351 | verts[v][8]*scale_x 352 | ) 353 | 354 | local length, wx,wy,wz, nx,ny,nz = func( 355 | verts[v][1]*scale_x + translation_x, 356 | verts[v][2]*scale_y + translation_y, 357 | verts[v][3]*scale_z + translation_z, 358 | verts[v+1][1]*scale_x + translation_x, 359 | verts[v+1][2]*scale_y + translation_y, 360 | verts[v+1][3]*scale_z + translation_z, 361 | verts[v+2][1]*scale_x + translation_x, 362 | verts[v+2][2]*scale_y + translation_y, 363 | verts[v+2][3]*scale_z + translation_z, 364 | n_x, 365 | n_y, 366 | n_z, 367 | ... 368 | ) 369 | 370 | -- if something was hit 371 | -- and either the finalLength is not yet defined or the new length is closer 372 | -- then update the collision information 373 | if length and (not finalLength or length < finalLength) then 374 | finalLength = length 375 | where_x = wx 376 | where_y = wy 377 | where_z = wz 378 | norm_x = nx 379 | norm_y = ny 380 | norm_z = nz 381 | end 382 | end 383 | 384 | -- normalize the normal vector before it is returned 385 | if finalLength then 386 | norm_x, norm_y, norm_z = vectorNormalize(norm_x, norm_y, norm_z) 387 | end 388 | 389 | -- return all the information in a standardized way 390 | return finalLength, where_x, where_y, where_z, norm_x, norm_y, norm_z 391 | end 392 | 393 | -- runs a given intersection function on all of the triangles made up of a given vert table 394 | local function findAny(self, verts, func, ...) 395 | -- cache references to this model's properties for efficiency 396 | local translation_x, translation_y, translation_z, scale_x, scale_y, scale_z = 0, 0, 0, 1, 1, 1 397 | if self then 398 | if self.translation then 399 | translation_x = self.translation[1] 400 | translation_y = self.translation[2] 401 | translation_z = self.translation[3] 402 | end 403 | if self.scale then 404 | scale_x = self.scale[1] 405 | scale_y = self.scale[2] 406 | scale_z = self.scale[3] 407 | end 408 | end 409 | 410 | for v=1, #verts, 3 do 411 | -- apply the function given with the arguments given 412 | -- also supply the points of the current triangle 413 | local n_x, n_y, n_z = vectorNormalize( 414 | verts[v][6]*scale_x, 415 | verts[v][7]*scale_x, 416 | verts[v][8]*scale_x 417 | ) 418 | 419 | local length = func( 420 | verts[v][1]*scale_x + translation_x, 421 | verts[v][2]*scale_y + translation_y, 422 | verts[v][3]*scale_z + translation_z, 423 | verts[v+1][1]*scale_x + translation_x, 424 | verts[v+1][2]*scale_y + translation_y, 425 | verts[v+1][3]*scale_z + translation_z, 426 | verts[v+2][1]*scale_x + translation_x, 427 | verts[v+2][2]*scale_y + translation_y, 428 | verts[v+2][3]*scale_z + translation_z, 429 | n_x, 430 | n_y, 431 | n_z, 432 | ... 433 | ) 434 | 435 | -- if something was hit 436 | -- and either the finalLength is not yet defined or the new length is closer 437 | -- then update the collision information 438 | if length then return true end 439 | end 440 | 441 | return false 442 | end 443 | 444 | ---------------------------------------------------------------------------------------------------- 445 | -- collision functions that apply on lists of vertices 446 | ---------------------------------------------------------------------------------------------------- 447 | 448 | function collisions.rayIntersection(verts, transform, src_x, src_y, src_z, dir_x, dir_y, dir_z) 449 | return findClosest(transform, verts, triangleRay, src_x, src_y, src_z, dir_x, dir_y, dir_z) 450 | end 451 | 452 | function collisions.isPointInside(verts, transform, x, y, z) 453 | return findAny(transform, verts, triangleRay, x, y, z, 0, 0, 1) 454 | end 455 | 456 | function collisions.sphereIntersection(verts, transform, src_x, src_y, src_z, radius) 457 | return findClosest(transform, verts, triangleSphere, src_x, src_y, src_z, radius) 458 | end 459 | 460 | function collisions.closestPoint(verts, transform, src_x, src_y, src_z) 461 | return findClosest(transform, verts, trianglePoint, src_x, src_y, src_z) 462 | end 463 | 464 | function collisions.capsuleIntersection(verts, transform, tip_x, tip_y, tip_z, base_x, base_y, base_z, radius) 465 | -- the normal vector coming out the tip of the capsule 466 | local norm_x, norm_y, norm_z = vectorNormalize(tip_x - base_x, tip_y - base_y, tip_z - base_z) 467 | 468 | -- the base and tip, inset by the radius 469 | -- these two coordinates are the actual extent of the capsule sphere line 470 | local a_x, a_y, a_z = base_x + norm_x*radius, base_y + norm_y*radius, base_z + norm_z*radius 471 | local b_x, b_y, b_z = tip_x - norm_x*radius, tip_y - norm_y*radius, tip_z - norm_z*radius 472 | 473 | return findClosest( 474 | transform, 475 | verts, 476 | triangleCapsule, 477 | tip_x, tip_y, tip_z, 478 | base_x, base_y, base_z, 479 | a_x, a_y, a_z, 480 | b_x, b_y, b_z, 481 | norm_x, norm_y, norm_z, 482 | radius 483 | ) 484 | end 485 | 486 | return collisions 487 | -------------------------------------------------------------------------------- /g3d/g3d.vert: -------------------------------------------------------------------------------- 1 | // written by groverbuger for g3d 2 | // september 2021 3 | // MIT license 4 | 5 | // this vertex shader is what projects 3d vertices in models onto your 2d screen 6 | 7 | uniform mat4 projectionMatrix; // handled by the camera 8 | uniform mat4 viewMatrix; // handled by the camera 9 | uniform mat4 modelMatrix; // models send their own model matrices when drawn 10 | uniform bool isCanvasEnabled; // detect when this model is being rendered to a canvas 11 | 12 | // the vertex normal attribute must be defined, as it is custom unlike the other attributes 13 | attribute vec3 VertexNormal; 14 | 15 | // define some varying vectors that are useful for writing custom fragment shaders 16 | varying vec4 worldPosition; 17 | varying vec4 viewPosition; 18 | varying vec4 screenPosition; 19 | varying vec3 vertexNormal; 20 | varying vec4 vertexColor; 21 | 22 | vec4 position(mat4 transformProjection, vec4 vertexPosition) { 23 | // calculate the positions of the transformed coordinates on the screen 24 | // save each step of the process, as these are often useful when writing custom fragment shaders 25 | worldPosition = modelMatrix * vertexPosition; 26 | viewPosition = viewMatrix * worldPosition; 27 | screenPosition = projectionMatrix * viewPosition; 28 | 29 | // save some data from this vertex for use in fragment shaders 30 | vertexNormal = VertexNormal; 31 | vertexColor = VertexColor; 32 | 33 | // for some reason models are flipped vertically when rendering to a canvas 34 | // so we need to detect when this is being rendered to a canvas, and flip it back 35 | if (isCanvasEnabled) { 36 | screenPosition.y *= -1.0; 37 | } 38 | 39 | return screenPosition; 40 | } 41 | -------------------------------------------------------------------------------- /g3d/init.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | --[[ 6 | __ __ 7 | /'__`\ /\ \ 8 | __ /\_\L\ \ \_\ \ 9 | /'_ `\/_/_\_<_ /'_` \ 10 | /\ \L\ \/\ \L\ \/\ \L\ \ 11 | \ \____ \ \____/\ \___,_\ 12 | \/___L\ \/___/ \/__,_ / 13 | /\____/ 14 | \_/__/ 15 | --]] 16 | 17 | g3d = { 18 | _VERSION = "g3d 1.5.2", 19 | _DESCRIPTION = "Simple and easy 3D engine for LÖVE.", 20 | _URL = "https://github.com/groverburger/g3d", 21 | _LICENSE = [[ 22 | MIT License 23 | 24 | Copyright (c) 2022 groverburger 25 | 26 | Permission is hereby granted, free of charge, to any person obtaining a copy 27 | of this software and associated documentation files (the "Software"), to deal 28 | in the Software without restriction, including without limitation the rights 29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | copies of the Software, and to permit persons to whom the Software is 31 | furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in all 34 | copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 42 | SOFTWARE. 43 | ]], 44 | path = ..., 45 | shaderpath = (...):gsub("%.", "/") .. "/g3d.vert", 46 | } 47 | 48 | -- the shader is what does the heavy lifting, displaying 3D meshes on your 2D monitor 49 | g3d.shader = love.graphics.newShader(g3d.shaderpath) 50 | g3d.newModel = require(g3d.path .. ".model") 51 | g3d.camera = require(g3d.path .. ".camera") 52 | g3d.collisions = require(g3d.path .. ".collisions") 53 | g3d.loadObj = require(g3d.path .. ".objloader") 54 | g3d.vectors = require(g3d.path .. ".vectors") 55 | g3d.camera.updateProjectionMatrix() 56 | g3d.camera.updateViewMatrix() 57 | 58 | -- so that far polygons don't overlap near polygons 59 | love.graphics.setDepthMode("lequal", true) 60 | 61 | -- get rid of g3d from the global namespace and return it instead 62 | local g3d = g3d 63 | _G.g3d = nil 64 | return g3d 65 | -------------------------------------------------------------------------------- /g3d/matrices.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | local vectors = require(g3d.path .. ".vectors") 6 | local vectorCrossProduct = vectors.crossProduct 7 | local vectorDotProduct = vectors.dotProduct 8 | local vectorNormalize = vectors.normalize 9 | 10 | ---------------------------------------------------------------------------------------------------- 11 | -- matrix class 12 | ---------------------------------------------------------------------------------------------------- 13 | -- matrices are 16 numbers in table, representing a 4x4 matrix like so: 14 | -- 15 | -- | 1 2 3 4 | 16 | -- | | 17 | -- | 5 6 7 8 | 18 | -- | | 19 | -- | 9 10 11 12 | 20 | -- | | 21 | -- | 13 14 15 16 | 22 | 23 | local matrix = {} 24 | matrix.__index = matrix 25 | 26 | local function newMatrix() 27 | local self = setmetatable({}, matrix) 28 | 29 | -- initialize a matrix as the identity matrix 30 | self[1], self[2], self[3], self[4] = 1, 0, 0, 0 31 | self[5], self[6], self[7], self[8] = 0, 1, 0, 0 32 | self[9], self[10], self[11], self[12] = 0, 0, 1, 0 33 | self[13], self[14], self[15], self[16] = 0, 0, 0, 1 34 | 35 | return self 36 | end 37 | 38 | -- automatically converts a matrix to a string 39 | -- for printing to console and debugging 40 | function matrix:__tostring() 41 | return ("%f\t%f\t%f\t%f\n%f\t%f\t%f\t%f\n%f\t%f\t%f\t%f\n%f\t%f\t%f\t%f"):format(unpack(self)) 42 | end 43 | 44 | ---------------------------------------------------------------------------------------------------- 45 | -- transformation, projection, and rotation matrices 46 | ---------------------------------------------------------------------------------------------------- 47 | -- the three most important matrices for 3d graphics 48 | -- these three matrices are all you need to write a simple 3d shader 49 | 50 | -- returns a transformation matrix 51 | -- translation, rotation, and scale are all 3d vectors 52 | function matrix:setTransformationMatrix(translation, rotation, scale) 53 | -- translations 54 | self[4] = translation[1] 55 | self[8] = translation[2] 56 | self[12] = translation[3] 57 | 58 | -- rotations 59 | if #rotation == 3 then 60 | -- use 3D rotation vector as euler angles 61 | -- source: https://en.wikipedia.org/wiki/Rotation_matrix 62 | local ca, cb, cc = math.cos(rotation[3]), math.cos(rotation[2]), math.cos(rotation[1]) 63 | local sa, sb, sc = math.sin(rotation[3]), math.sin(rotation[2]), math.sin(rotation[1]) 64 | self[1], self[2], self[3] = ca*cb, ca*sb*sc - sa*cc, ca*sb*cc + sa*sc 65 | self[5], self[6], self[7] = sa*cb, sa*sb*sc + ca*cc, sa*sb*cc - ca*sc 66 | self[9], self[10], self[11] = -sb, cb*sc, cb*cc 67 | else 68 | -- use 4D rotation vector as a quaternion 69 | local qx, qy, qz, qw = rotation[1], rotation[2], rotation[3], rotation[4] 70 | self[1], self[2], self[3] = 1 - 2*qy^2 - 2*qz^2, 2*qx*qy - 2*qz*qw, 2*qx*qz + 2*qy*qw 71 | self[5], self[6], self[7] = 2*qx*qy + 2*qz*qw, 1 - 2*qx^2 - 2*qz^2, 2*qy*qz - 2*qx*qw 72 | self[9], self[10], self[11] = 2*qx*qz - 2*qy*qw, 2*qy*qz + 2*qx*qw, 1 - 2*qx^2 - 2*qy^2 73 | end 74 | 75 | -- scale 76 | local sx, sy, sz = scale[1], scale[2], scale[3] 77 | self[1], self[2], self[3] = self[1] * sx, self[2] * sy, self[3] * sz 78 | self[5], self[6], self[7] = self[5] * sx, self[6] * sy, self[7] * sz 79 | self[9], self[10], self[11] = self[9] * sx, self[10] * sy, self[11] * sz 80 | 81 | -- fourth row is not used, just set it to the fourth row of the identity matrix 82 | self[13], self[14], self[15], self[16] = 0, 0, 0, 1 83 | end 84 | 85 | function matrix:getScale() 86 | -- does not account for negative scaling 87 | local sx = vectorMagnitude(self[1], self[5], self[9]) 88 | local sy = vectorMagnitude(self[2], self[6], self[10]) 89 | local sz = vectorMagnitude(self[3], self[7], self[11]) 90 | return sx, sy, sz 91 | end 92 | 93 | -- transpose of the camera (look at) matrix 94 | function matrix:lookAtFrom(pos, target, up, orig_scale) 95 | self[4] = pos[1] 96 | self[8] = pos[2] 97 | self[12] = pos[3] 98 | 99 | local sx, sy, sz 100 | if orig_scale then 101 | sx, sy, sz = unpack(orig_scale) 102 | else 103 | sx, sy, sz = self:getScale() 104 | end 105 | 106 | -- forward, side, up directions 107 | local f_x, f_y, f_z = vectorNormalize(pos[1]-target[1], pos[2]-target[2], pos[3]-target[3]) 108 | local s_x, s_y, s_z = vectorNormalize(vectorCrossProduct(up[1],up[2],up[3], f_x,f_y,f_z)) 109 | local u_x, u_y, u_z = vectorCrossProduct(f_x,f_y,f_z, s_x,s_y,s_z) 110 | 111 | self[1], self[2], self[3] = f_x*sx, s_x*sy, u_x*sz 112 | self[5], self[6], self[7] = f_y*sx, s_y*sy, u_y*sz 113 | self[9], self[10], self[11] = f_z*sx, s_z*sy, u_z*sz 114 | end 115 | 116 | ---------------------------------------------------------------------------------------------------- 117 | -- camera transformations 118 | ---------------------------------------------------------------------------------------------------- 119 | 120 | -- returns a perspective projection matrix 121 | -- (things farther away appear smaller) 122 | -- all arguments are scalars aka normal numbers 123 | -- aspectRatio is defined as window width divided by window height 124 | function matrix:setProjectionMatrix(fov, near, far, aspectRatio) 125 | local top = near * math.tan(fov/2) 126 | local bottom = -1*top 127 | local right = top * aspectRatio 128 | local left = -1*right 129 | 130 | self[1], self[2], self[3], self[4] = 2*near/(right-left), 0, (right+left)/(right-left), 0 131 | self[5], self[6], self[7], self[8] = 0, 2*near/(top-bottom), (top+bottom)/(top-bottom), 0 132 | self[9], self[10], self[11], self[12] = 0, 0, -1*(far+near)/(far-near), -2*far*near/(far-near) 133 | self[13], self[14], self[15], self[16] = 0, 0, -1, 0 134 | end 135 | 136 | -- returns an orthographic projection matrix 137 | -- (things farther away are the same size as things closer) 138 | -- all arguments are scalars aka normal numbers 139 | -- aspectRatio is defined as window width divided by window height 140 | function matrix:setOrthographicMatrix(fov, size, near, far, aspectRatio) 141 | local top = size * math.tan(fov/2) 142 | local bottom = -1*top 143 | local right = top * aspectRatio 144 | local left = -1*right 145 | 146 | self[1], self[2], self[3], self[4] = 2/(right-left), 0, 0, -1*(right+left)/(right-left) 147 | self[5], self[6], self[7], self[8] = 0, 2/(top-bottom), 0, -1*(top+bottom)/(top-bottom) 148 | self[9], self[10], self[11], self[12] = 0, 0, -2/(far-near), -(far+near)/(far-near) 149 | self[13], self[14], self[15], self[16] = 0, 0, 0, 1 150 | end 151 | 152 | -- returns a view matrix 153 | -- eye, target, and up are all 3d vectors 154 | function matrix:setViewMatrix(eye, target, up) 155 | local z1, z2, z3 = vectorNormalize(eye[1] - target[1], eye[2] - target[2], eye[3] - target[3]) 156 | local x1, x2, x3 = vectorNormalize(vectorCrossProduct(up[1], up[2], up[3], z1, z2, z3)) 157 | local y1, y2, y3 = vectorCrossProduct(z1, z2, z3, x1, x2, x3) 158 | 159 | self[1], self[2], self[3], self[4] = x1, x2, x3, -1*vectorDotProduct(x1, x2, x3, eye[1], eye[2], eye[3]) 160 | self[5], self[6], self[7], self[8] = y1, y2, y3, -1*vectorDotProduct(y1, y2, y3, eye[1], eye[2], eye[3]) 161 | self[9], self[10], self[11], self[12] = z1, z2, z3, -1*vectorDotProduct(z1, z2, z3, eye[1], eye[2], eye[3]) 162 | self[13], self[14], self[15], self[16] = 0, 0, 0, 1 163 | end 164 | 165 | return newMatrix 166 | -------------------------------------------------------------------------------- /g3d/model.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | local newMatrix = require(g3d.path .. ".matrices") 6 | local loadObjFile = require(g3d.path .. ".objloader") 7 | local collisions = require(g3d.path .. ".collisions") 8 | local vectors = require(g3d.path .. ".vectors") 9 | local camera = require(g3d.path .. ".camera") 10 | local vectorCrossProduct = vectors.crossProduct 11 | local vectorNormalize = vectors.normalize 12 | 13 | ---------------------------------------------------------------------------------------------------- 14 | -- define a model class 15 | ---------------------------------------------------------------------------------------------------- 16 | 17 | local model = {} 18 | model.__index = model 19 | 20 | -- define some default properties that every model should inherit 21 | -- that being the standard vertexFormat and basic 3D shader 22 | model.vertexFormat = { 23 | {"VertexPosition", "float", 3}, 24 | {"VertexTexCoord", "float", 2}, 25 | {"VertexNormal", "float", 3}, 26 | {"VertexColor", "byte", 4}, 27 | } 28 | model.shader = g3d.shader 29 | 30 | -- this returns a new instance of the model class 31 | -- a model must be given a .obj file or equivalent lua table, and a texture 32 | -- translation, rotation, and scale are all 3d vectors and are all optional 33 | local function newModel(verts, texture, translation, rotation, scale) 34 | local self = setmetatable({}, model) 35 | 36 | -- if verts is a string, use it as a path to a .obj file 37 | -- otherwise verts is a table, use it as a model defintion 38 | if type(verts) == "string" then 39 | verts = loadObjFile(verts) 40 | end 41 | 42 | -- if texture is a string, use it as a path to an image file 43 | -- otherwise texture is already an image, so don't bother 44 | if type(texture) == "string" then 45 | texture = love.graphics.newImage(texture) 46 | end 47 | 48 | -- initialize my variables 49 | self.verts = verts 50 | self.texture = texture 51 | self.mesh = love.graphics.newMesh(self.vertexFormat, self.verts, "triangles") 52 | self.mesh:setTexture(self.texture) 53 | self.matrix = newMatrix() 54 | if type(scale) == "number" then scale = {scale, scale, scale} end 55 | self:setTransform(translation or {0,0,0}, rotation or {0,0,0}, scale or {1,1,1}) 56 | 57 | return self 58 | end 59 | 60 | -- populate model's normals in model's mesh automatically 61 | -- if true is passed in, then the normals are all flipped 62 | function model:makeNormals(isFlipped) 63 | for i=1, #self.verts, 3 do 64 | if isFlipped then 65 | self.verts[i+1], self.verts[i+2] = self.verts[i+2], self.verts[i+1] 66 | end 67 | 68 | local vp = self.verts[i] 69 | local v = self.verts[i+1] 70 | local vn = self.verts[i+2] 71 | 72 | local n_1, n_2, n_3 = vectorNormalize(vectorCrossProduct(v[1]-vp[1], v[2]-vp[2], v[3]-vp[3], vn[1]-v[1], vn[2]-v[2], vn[3]-v[3])) 73 | vp[6], v[6], vn[6] = n_1, n_1, n_1 74 | vp[7], v[7], vn[7] = n_2, n_2, n_2 75 | vp[8], v[8], vn[8] = n_3, n_3, n_3 76 | end 77 | 78 | self.mesh = love.graphics.newMesh(self.vertexFormat, self.verts, "triangles") 79 | self.mesh:setTexture(self.texture) 80 | end 81 | 82 | -- move and rotate given two 3d vectors 83 | function model:setTransform(translation, rotation, scale) 84 | self.translation = translation or self.translation 85 | self.rotation = rotation or self.rotation 86 | self.scale = scale or self.scale 87 | self:updateMatrix() 88 | end 89 | 90 | -- move given one 3d vector 91 | function model:setTranslation(tx,ty,tz) 92 | self.translation[1] = tx 93 | self.translation[2] = ty 94 | self.translation[3] = tz 95 | self:updateMatrix() 96 | end 97 | 98 | -- rotate given one 3d vector 99 | -- using euler angles 100 | function model:setRotation(rx,ry,rz) 101 | self.rotation[1] = rx 102 | self.rotation[2] = ry 103 | self.rotation[3] = rz 104 | self.rotation[4] = nil 105 | self:updateMatrix() 106 | end 107 | 108 | -- create a quaternion from an axis and an angle 109 | function model:setAxisAngleRotation(x,y,z,angle) 110 | x,y,z = vectorNormalize(x,y,z) 111 | angle = angle / 2 112 | 113 | self.rotation[1] = x * math.sin(angle) 114 | self.rotation[2] = y * math.sin(angle) 115 | self.rotation[3] = z * math.sin(angle) 116 | self.rotation[4] = math.cos(angle) 117 | 118 | self:updateMatrix() 119 | end 120 | 121 | -- rotate given one quaternion 122 | function model:setQuaternionRotation(x,y,z,w) 123 | self.rotation[1] = x 124 | self.rotation[2] = y 125 | self.rotation[3] = z 126 | self.rotation[4] = w 127 | self:updateMatrix() 128 | end 129 | 130 | -- resize model's matrix based on a given 3d vector 131 | function model:setScale(sx,sy,sz) 132 | self.scale[1] = sx 133 | self.scale[2] = sy or sx 134 | self.scale[3] = sz or sx 135 | self:updateMatrix() 136 | end 137 | 138 | -- update the model's transformation matrix 139 | function model:updateMatrix() 140 | self.matrix:setTransformationMatrix(self.translation, self.rotation, self.scale) 141 | end 142 | 143 | -- align's the model matrix to a given point 144 | -- up vector is assumed to be normalized 145 | function model:lookAtFrom(pos, target, up) 146 | local pos = pos or self.translation 147 | self.matrix:lookAtFrom(pos, target, up or {0,0,1}, self.scale) 148 | end 149 | 150 | function model:lookAt(target, up) 151 | self.matrix:lookAtFrom(self.translation, target, up or {0,0,1}, self.scale) 152 | end 153 | 154 | 155 | 156 | 157 | -- draw the model 158 | function model:draw(shader) 159 | local shader = shader or self.shader 160 | love.graphics.setShader(shader) 161 | shader:send("modelMatrix", self.matrix) 162 | shader:send("viewMatrix", camera.viewMatrix) 163 | shader:send("projectionMatrix", camera.projectionMatrix) 164 | if shader:hasUniform "isCanvasEnabled" then 165 | shader:send("isCanvasEnabled", love.graphics.getCanvas() ~= nil) 166 | end 167 | love.graphics.draw(self.mesh) 168 | love.graphics.setShader() 169 | end 170 | 171 | -- the fallback function if ffi was not loaded 172 | function model:compress() 173 | print("[g3d warning] Compression requires FFI!\n" .. debug.traceback()) 174 | end 175 | 176 | -- makes models use less memory when loaded in ram 177 | -- by storing the vertex data in an array of vertix structs instead of lua tables 178 | -- requires ffi 179 | -- note: throws away the model's verts table 180 | local success, ffi = pcall(require, "ffi") 181 | if success then 182 | ffi.cdef([[ 183 | struct vertex { 184 | float x, y, z; 185 | float u, v; 186 | float nx, ny, nz; 187 | uint8_t r, g, b, a; 188 | } 189 | ]]) 190 | 191 | function model:compress() 192 | local data = love.data.newByteData(ffi.sizeof("struct vertex") * #self.verts) 193 | local datapointer = ffi.cast("struct vertex *", data:getFFIPointer()) 194 | 195 | for i, vert in ipairs(self.verts) do 196 | local dataindex = i - 1 197 | datapointer[dataindex].x = vert[1] 198 | datapointer[dataindex].y = vert[2] 199 | datapointer[dataindex].z = vert[3] 200 | datapointer[dataindex].u = vert[4] or 0 201 | datapointer[dataindex].v = vert[5] or 0 202 | datapointer[dataindex].nx = vert[6] or 0 203 | datapointer[dataindex].ny = vert[7] or 0 204 | datapointer[dataindex].nz = vert[8] or 0 205 | datapointer[dataindex].r = (vert[9] or 1)*255 206 | datapointer[dataindex].g = (vert[10] or 1)*255 207 | datapointer[dataindex].b = (vert[11] or 1)*255 208 | datapointer[dataindex].a = (vert[12] or 1)*255 209 | end 210 | 211 | self.mesh:release() 212 | self.mesh = love.graphics.newMesh(self.vertexFormat, #self.verts, "triangles") 213 | self.mesh:setVertices(data) 214 | self.mesh:setTexture(self.texture) 215 | self.verts = nil 216 | end 217 | end 218 | 219 | function model:rayIntersection(...) 220 | return collisions.rayIntersection(self.verts, self, ...) 221 | end 222 | 223 | function model:isPointInside(...) 224 | return collisions.isPointInside(self.verts, self, ...) 225 | end 226 | 227 | function model:sphereIntersection(...) 228 | return collisions.sphereIntersection(self.verts, self, ...) 229 | end 230 | 231 | function model:closestPoint(...) 232 | return collisions.closestPoint(self.verts, self, ...) 233 | end 234 | 235 | function model:capsuleIntersection(...) 236 | return collisions.capsuleIntersection(self.verts, self, ...) 237 | end 238 | 239 | return newModel 240 | -------------------------------------------------------------------------------- /g3d/objloader.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | ---------------------------------------------------------------------------------------------------- 6 | -- simple obj loader 7 | ---------------------------------------------------------------------------------------------------- 8 | 9 | -- give path of file 10 | -- returns a lua table representation 11 | return function (path, uFlip, vFlip) 12 | local positions, uvs, normals = {}, {}, {} 13 | local result = {} 14 | 15 | -- go line by line through the file 16 | for line in love.filesystem.lines(path) do 17 | local words = {} 18 | 19 | -- split the line into words 20 | for word in line:gmatch "([^%s]+)" do 21 | table.insert(words, word) 22 | end 23 | 24 | local firstWord = words[1] 25 | 26 | if firstWord == "v" then 27 | -- if the first word in this line is a "v", then this defines a vertex's position 28 | 29 | table.insert(positions, {tonumber(words[2]), tonumber(words[3]), tonumber(words[4])}) 30 | elseif firstWord == "vt" then 31 | -- if the first word in this line is a "vt", then this defines a texture coordinate 32 | 33 | local u, v = tonumber(words[2]), tonumber(words[3]) 34 | 35 | -- optionally flip these texture coordinates 36 | if uFlip then u = 1 - u end 37 | if vFlip then v = 1 - v end 38 | 39 | table.insert(uvs, {u, v}) 40 | elseif firstWord == "vn" then 41 | -- if the first word in this line is a "vn", then this defines a vertex normal 42 | table.insert(normals, {tonumber(words[2]), tonumber(words[3]), tonumber(words[4])}) 43 | elseif firstWord == "f" then 44 | 45 | -- if the first word in this line is a "f", then this is a face 46 | -- a face takes three point definitions 47 | -- the arguments a point definition takes are vertex, vertex texture, vertex normal in that order 48 | 49 | local vertices = {} 50 | for i = 2, #words do 51 | local v, vt, vn = words[i]:match "(%d*)/(%d*)/(%d*)" 52 | v, vt, vn = tonumber(v), tonumber(vt), tonumber(vn) 53 | table.insert(vertices, { 54 | v and positions[v][1] or 0, 55 | v and positions[v][2] or 0, 56 | v and positions[v][3] or 0, 57 | vt and uvs[vt][1] or 0, 58 | vt and uvs[vt][2] or 0, 59 | vn and normals[vn][1] or 0, 60 | vn and normals[vn][2] or 0, 61 | vn and normals[vn][3] or 0, 62 | }) 63 | end 64 | 65 | -- triangulate the face if it's not already a triangle 66 | if #vertices > 3 then 67 | -- choose a central vertex 68 | local centralVertex = vertices[1] 69 | 70 | -- connect the central vertex to each of the other vertices to create triangles 71 | for i = 2, #vertices - 1 do 72 | table.insert(result, centralVertex) 73 | table.insert(result, vertices[i]) 74 | table.insert(result, vertices[i + 1]) 75 | end 76 | else 77 | for i = 1, #vertices do 78 | table.insert(result, vertices[i]) 79 | end 80 | end 81 | 82 | end 83 | end 84 | 85 | return result 86 | end 87 | -------------------------------------------------------------------------------- /g3d/vectors.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | ---------------------------------------------------------------------------------------------------- 6 | -- vector functions 7 | ---------------------------------------------------------------------------------------------------- 8 | -- some basic vector functions that don't use tables 9 | -- because these functions will happen often, this is done to avoid frequent memory allocation 10 | 11 | local vectors = {} 12 | 13 | function vectors.subtract(v1,v2,v3, v4,v5,v6) 14 | return v1-v4, v2-v5, v3-v6 15 | end 16 | 17 | function vectors.add(v1,v2,v3, v4,v5,v6) 18 | return v1+v4, v2+v5, v3+v6 19 | end 20 | 21 | function vectors.scalarMultiply(scalar, v1,v2,v3) 22 | return v1*scalar, v2*scalar, v3*scalar 23 | end 24 | 25 | function vectors.crossProduct(a1,a2,a3, b1,b2,b3) 26 | return a2*b3 - a3*b2, a3*b1 - a1*b3, a1*b2 - a2*b1 27 | end 28 | 29 | function vectors.dotProduct(a1,a2,a3, b1,b2,b3) 30 | return a1*b1 + a2*b2 + a3*b3 31 | end 32 | 33 | function vectors.normalize(x,y,z) 34 | local mag = math.sqrt(x^2 + y^2 + z^2) 35 | if mag ~= 0 then 36 | return x/mag, y/mag, z/mag 37 | else 38 | return 0, 0, 0 39 | end 40 | end 41 | 42 | function vectors.magnitude(x,y,z) 43 | return math.sqrt(x^2 + y^2 + z^2) 44 | end 45 | 46 | return vectors 47 | -------------------------------------------------------------------------------- /main.lua: -------------------------------------------------------------------------------- 1 | -- written by groverbuger for g3d 2 | -- september 2021 3 | -- MIT license 4 | 5 | local g3d = require "g3d" 6 | local earth = g3d.newModel("assets/sphere.obj", "assets/earth.png", {4,0,0}) 7 | local moon = g3d.newModel("assets/sphere.obj", "assets/moon.png", {4,5,0}, nil, 0.5) 8 | local background = g3d.newModel("assets/sphere.obj", "assets/starfield.png", nil, nil, 500) 9 | local timer = 0 10 | 11 | function love.update(dt) 12 | timer = timer + dt 13 | moon:setTranslation(math.cos(timer)*5 + 4, math.sin(timer)*5, 0) 14 | moon:setRotation(0, 0, timer - math.pi/2) 15 | g3d.camera.firstPersonMovement(dt) 16 | if love.keyboard.isDown "escape" then 17 | love.event.push "quit" 18 | end 19 | end 20 | 21 | function love.draw() 22 | earth:draw() 23 | moon:draw() 24 | background:draw() 25 | end 26 | 27 | function love.mousemoved(x,y, dx,dy) 28 | g3d.camera.firstPersonLook(dx,dy) 29 | end 30 | --------------------------------------------------------------------------------