├── .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 | 
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 | 
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 | 
62 |
63 | [Lead Haul](https://hydrogen-maniac.itch.io/lead-haul) by YouDoYouBuddy
64 | 
65 |
66 | [Plan Meow](https://sacemakesgame.itch.io/plan-meow) by SaceMakesGame
67 | 
68 |
69 | [First Person Test](https://github.com/groverburger/g3d_fps) by groverburger
70 | 
71 |
72 | [g3d voxel engine](https://github.com/groverburger/g3d_voxel) by groverburger
73 | 
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 |
--------------------------------------------------------------------------------