├── .gitignore ├── mesh ├── moz.mtl ├── mesh404.mtl ├── untitled.mtl ├── untitled2.mtl ├── snake.mtl ├── untitled3.mtl ├── dump-vertices.scm ├── untitled.obj ├── untitled2.obj ├── vectors.scm ├── snake.obj ├── teapot.obj ├── mesh404.obj ├── obj-loader.scm └── moz.obj ├── test.js ├── example.css ├── README ├── example4.js ├── tmp.html ├── example3.js ├── heap.js ├── cursor.js ├── renderer_raphael.js ├── test.html ├── example.html ├── example4.html ├── example3.html ├── example2.html ├── example.js ├── std.js ├── example2.js ├── index.js ├── renderer.js ├── style.css ├── cursor.html ├── dom3d.js ├── main-raphael.js ├── untitled2.js ├── vector.js ├── renderer_css.js ├── index.html ├── snake.js ├── mesh404.js ├── teapot.js └── moz.js /.gitignore: -------------------------------------------------------------------------------- 1 | .#* 2 | -------------------------------------------------------------------------------- /mesh/moz.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /mesh/mesh404.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /mesh/untitled.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /mesh/untitled2.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /mesh/snake.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 1 3 | newmtl (null).002 4 | Ns 96.078431 5 | Ka 0.000000 0.000000 0.000000 6 | Kd 0.640000 0.640000 0.640000 7 | Ks 0.500000 0.500000 0.500000 8 | Ni 1.000000 9 | d 1.000000 10 | illum 2 11 | 12 | 13 | -------------------------------------------------------------------------------- /mesh/untitled3.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: '' 2 | # Material Count: 1 3 | newmtl gold 4 | Ns 96.078431 5 | Ka 0.000000 0.000000 0.000000 6 | Kd 0.640000 0.640000 0.640000 7 | Ks 0.500000 0.500000 0.500000 8 | Ni 1.000000 9 | d 1.000000 10 | illum 2 11 | 12 | 13 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | 2 | $(function() { 3 | 4 | make_renderer(null, 100, 100); 5 | 6 | dom3d.current_eye($v(0,0,-15)); 7 | dom3d.current_light(vec_unit($v(-1.0, 0.0, -.2))); 8 | dom3d.current_color($c(200, 255, 200)); 9 | 10 | dom3d.current_renderer().render2d( 11 | 'canvas', 12 | [$v(20, 20), $v(50, 120), $v(120, 30)], 13 | $c(0, 255, 0)); 14 | 15 | }); -------------------------------------------------------------------------------- /example.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | overflow: hidden; 6 | } 7 | 8 | ul { 9 | list-style: none; 10 | } 11 | 12 | li { 13 | background-color: rgb(0, 100, 255); 14 | padding: 1em; 15 | width: 150px; 16 | height: 3em; 17 | margin: 1em; 18 | z-index: 1000; 19 | -moz-transition: -moz-transform .5s; 20 | } 21 | 22 | li:hover { 23 | -moz-transition: -moz-transform .5s; 24 | } 25 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 2 | dom3d: 3d with HTML/CSS 3 | 4 | This code is still very much experimental. The API will certainly change quickly. 5 | 6 | Runs in Firefox, Chrome, Safari, and Opera. 7 | 8 | dom3d.js is where the API is exposed and interfaces between the use and the renderer. 9 | renderer.js is where the base renderer is defined. 10 | renderer_css.js is the CSS renderer. 11 | renderer_raphael.js is the Raphael/SVG renderer. 12 | dump-vertices.scm is a Scheme script to parse a .obj model into a javascript mesh that dom3d can load. -------------------------------------------------------------------------------- /example4.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | $(function() { 4 | 5 | make_renderer(); 6 | 7 | dom3d.current_eye($v(0,0,-4.2)); 8 | dom3d.current_light(vec_unit($v(-1.0, 0.0, -.2))); 9 | dom3d.current_color($c(255, 100, 0)); 10 | 11 | function rotate(p) { 12 | return _vec_3drotateY(p, Math.PI); 13 | } 14 | 15 | for(var i=0; i 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /example3.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | $(function() { 4 | 5 | make_renderer(); 6 | 7 | dom3d.current_eye($v(0,0,-10)); 8 | dom3d.current_light(vec_unit($v(-1.0, 0.0, -.2))); 9 | dom3d.current_color($c(200, 255, 200)); 10 | 11 | var start = $v(0.0, 0.0, 15.0); 12 | 13 | function rotate(p) { 14 | return _vec_3drotateX(p, Math.PI); 15 | } 16 | 17 | for(var i=0; i heap[1]) { 20 | if(!heap[LEFT]) { 21 | heap[LEFT] = [tri, z, null, null]; 22 | } 23 | else { 24 | _heap_insert(heap[LEFT], tri, z); 25 | } 26 | } 27 | else { 28 | if(!heap[RIGHT]) { 29 | heap[RIGHT] = [tri, z, null, null]; 30 | } 31 | else { 32 | _heap_insert(heap[RIGHT], tri, z); 33 | } 34 | } 35 | } 36 | 37 | function heap_depth_first(heap, func) { 38 | if(heap[LEFT]) { 39 | heap_depth_first(heap[LEFT], func); 40 | } 41 | 42 | func(heap[0]); 43 | 44 | if(heap[RIGHT]) { 45 | heap_depth_first(heap[RIGHT], func); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /cursor.js: -------------------------------------------------------------------------------- 1 | 2 | $(function() { 3 | 4 | make_renderer(null, 100, 100); 5 | 6 | dom3d.current_eye($v(0,0,-15)); 7 | dom3d.current_light(vec_unit($v(-1.0, 0.0, -.2))); 8 | dom3d.current_color($c(200, 255, 200)); 9 | 10 | untitled2.yaw = 0.0; 11 | untitled2.pitch = 0.0; 12 | 13 | function update() { 14 | untitled2.yaw += .05; 15 | untitled2.pitch += .05; 16 | } 17 | 18 | function frame() { 19 | dom3d.clear('canvas'); 20 | dom3d.render('canvas', untitled2); 21 | } 22 | 23 | setInterval(function() { 24 | update(); 25 | frame(); 26 | }, 50); 27 | 28 | var canvas = $('#canvas, svg'); 29 | $(window).mousemove(function(e) { 30 | canvas.css({ 'position': 'absolute', 31 | 'left': e.pageX - 30.0, 32 | 'top': e.pageY - 25.0 }); 33 | }); 34 | 35 | $('a').hover( 36 | function() { 37 | dom3d.current_color($c(255, 0, 0)); 38 | }, 39 | function() { 40 | dom3d.current_color($c(200, 255, 200)); 41 | } 42 | ); 43 | 44 | }); -------------------------------------------------------------------------------- /mesh/dump-vertices.scm: -------------------------------------------------------------------------------- 1 | #!/usr/bin/gsi-script 2 | 3 | (include "obj-loader.scm") 4 | 5 | (define name (cadr (command-line))) 6 | 7 | (define obj (obj-load name #f #t)) 8 | 9 | (define (print-vertex vertex) 10 | (print "$v(" 11 | (car vertex) 12 | "," 13 | (cadr vertex) 14 | "," 15 | (caddr vertex) 16 | ")")) 17 | 18 | (define (random-int upper) 19 | (inexact->exact (floor (* (random-real) upper)))) 20 | 21 | (with-output-to-file (string-append name ".js") 22 | (lambda () 23 | 24 | (print (string-append "var " name " = dom3d.make_mesh([")) 25 | 26 | (for-each (lambda (chunk) 27 | (let loop ((lst (reverse (obj-chunk-indices chunk)))) 28 | (if (not (null? lst)) 29 | (begin 30 | 31 | (print "[") 32 | (print-vertex (lookup-vertex obj (car lst))) 33 | (print ",") 34 | (print-vertex (lookup-vertex obj (cadr lst))) 35 | (print ",") 36 | (print-vertex (lookup-vertex obj (caddr lst))) 37 | (print "],\n") 38 | 39 | 40 | (loop (cdddr lst)))))) 41 | (obj-chunks obj)) 42 | 43 | (print "]);"))) 44 | 45 | -------------------------------------------------------------------------------- /renderer_raphael.js: -------------------------------------------------------------------------------- 1 | 2 | (function() { 3 | 4 | var $raphael; 5 | 6 | function init(width_or_canvas, height) { 7 | var width = width_or_canvas; 8 | var canvas; 9 | 10 | if(typeof width_or_canvas == 'string') { 11 | var el = $('#' + width_or_canvas); 12 | 13 | var canvas = width_or_canvas; 14 | width = el.width(); 15 | height = el.height(); 16 | } 17 | 18 | if($raphael) { 19 | $raphael.setSize(width, height); 20 | } 21 | else if(canvas) { 22 | $raphael = Raphael(canvas, width, height); 23 | } 24 | else { 25 | $raphael = Raphael(0, 0, width, height); 26 | } 27 | } 28 | 29 | function clear(canvas) { 30 | $raphael.clear(); 31 | } 32 | 33 | function destroy(canvas) { 34 | $raphael.remove(); 35 | $raphael = null; 36 | } 37 | 38 | function render2d(canvas, points, color) { 39 | var line = 'M' + points[0][X] + ' ' + points[0][Y] + 40 | 'L' + points[1][X] + ' ' + points[1][Y] + 41 | 'L' + points[2][X] + ' ' + points[2][Y] + 42 | 'L' + points[0][X] + ' ' + points[0][Y] 43 | var p = $raphael.path(line); 44 | 45 | var colorstr = 'rgb(' + color[R] + ',' + color[G] + ',' + color[B] + ')'; 46 | p.attr('stroke', colorstr); 47 | p.attr('fill', colorstr); 48 | return; 49 | } 50 | 51 | function RendererRaphael() { 52 | this.init = init; 53 | this.render2d = render2d; 54 | this.clear = clear; 55 | this.destroy = destroy; 56 | this.type = 'raphael'; 57 | } 58 | 59 | RendererRaphael.prototype = Renderer.prototype; 60 | window.RendererRaphael = RendererRaphael; 61 | })(); -------------------------------------------------------------------------------- /mesh/untitled.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.57 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib untitled.mtl 4 | o Mball.002_Mesh.001 5 | v 1.914155 2.141936 0.114591 6 | v 1.500226 0.705093 0.496253 7 | v 0.259366 1.581561 1.222891 8 | v 0.682915 2.803631 -0.575472 9 | v -0.031638 2.471841 -0.429300 10 | v 0.555930 -0.359430 1.244115 11 | v 2.013662 1.685702 0.212285 12 | v 0.731722 -1.597789 -0.192404 13 | v 0.078641 -0.547910 -1.039774 14 | v 0.980068 -0.494729 -1.218231 15 | v 0.732662 1.722848 -1.045381 16 | v 0.947903 -1.251778 0.894421 17 | v -0.110360 0.565300 -0.209177 18 | v -0.039119 1.696869 -0.741613 19 | v 1.419251 0.747588 -0.411712 20 | v 0.497574 0.753818 -0.755961 21 | v 1.337059 2.876390 0.228443 22 | v -0.496115 1.632681 0.239541 23 | v 1.957090 -0.274814 -0.125711 24 | v -0.118077 -1.257898 0.245478 25 | v 1.534585 -0.811301 -0.780925 26 | v 1.159457 1.882145 1.344960 27 | v 0.364512 0.752105 0.882962 28 | v 1.602195 -1.255165 0.033122 29 | v 1.528077 2.028435 -0.741491 30 | v -0.437940 -0.386788 0.308773 31 | v 0.322705 2.481590 1.024301 32 | v 1.615099 -0.390992 0.872460 33 | v -0.138894 2.521279 0.460508 34 | usemtl (null) 35 | s off 36 | f 16 13 18 37 | f 6 26 20 38 | f 28 2 6 39 | f 5 4 14 40 | f 4 17 25 41 | f 11 15 16 42 | f 12 20 8 43 | f 25 1 7 44 | f 18 23 3 45 | f 9 8 20 46 | f 23 13 26 47 | f 2 23 6 48 | f 21 24 8 49 | f 23 26 6 50 | f 16 15 10 51 | f 4 11 14 52 | f 13 23 18 53 | f 17 4 27 54 | f 19 15 2 55 | f 21 19 24 56 | f 10 21 8 57 | f 17 1 25 58 | f 27 29 18 59 | f 18 3 27 60 | f 28 6 12 61 | f 26 13 9 62 | f 1 17 22 63 | f 18 5 14 64 | f 19 28 24 65 | f 27 4 29 66 | f 2 22 23 67 | f 29 5 18 68 | f 15 25 7 69 | f 26 9 20 70 | f 4 5 29 71 | f 28 12 24 72 | f 18 14 16 73 | f 22 3 23 74 | f 16 10 9 75 | f 2 7 22 76 | f 9 13 16 77 | f 12 6 20 78 | f 7 1 22 79 | f 24 12 8 80 | f 19 10 15 81 | f 14 11 16 82 | f 9 10 8 83 | f 19 2 28 84 | f 4 25 11 85 | f 25 15 11 86 | f 27 22 17 87 | f 22 27 3 88 | f 10 19 21 89 | f 2 15 7 90 | -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 26 | 27 |
28 | 38 | 39 |
40 |
41 | 42 |
43 | 44 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | Other examples: 22 | 23 | main 24 | pole 25 | dragging 26 | teapot 27 | 404 28 | cursor 29 | 30 |
31 | CSS 32 | SVG/Raphael 33 |
canvas/webgl coming soon
34 |
35 |
36 | 37 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /example4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 33 | 34 |
35 | CSS 36 | SVG/Raphael 37 |
canvas/webgl coming soon
38 |
39 | 40 |
41 |
42 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /example3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 33 | 34 |
35 | CSS 36 | SVG/Raphael 37 |
canvas/webgl coming soon
38 |
39 | 40 |
41 |
42 | 43 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /mesh/untitled2.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.57 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib untitled2.mtl 4 | o Mball.002_Mesh 5 | v -4.808797 -5.678728 4.498321 6 | v -4.861530 2.665381 -3.640716 7 | v 12.252654 -1.003467 5.140471 8 | v 1.624468 -5.060263 6.740629 9 | v 10.059834 5.125776 -3.478954 10 | v 13.869772 5.770115 0.394245 11 | v -0.138806 0.453659 -6.745212 12 | v 5.103397 2.515850 -3.468291 13 | v 9.828438 6.975859 0.420077 14 | v 13.390021 3.227999 4.708065 15 | v 6.118319 -1.700064 4.691437 16 | v -0.679367 -6.738543 5.679765 17 | v -2.376280 4.123231 5.079822 18 | v 10.072382 4.018204 5.258657 19 | v -5.909987 3.744347 0.437121 20 | v -0.792963 5.896070 -0.942670 21 | v 4.079731 -6.899427 0.368682 22 | v -8.025169 -1.391089 1.731331 23 | v 12.701148 -3.753480 0.344063 24 | v 16.202295 1.531639 0.280955 25 | v -3.365018 -1.266676 7.111258 26 | v 5.222921 2.383513 4.327806 27 | v 0.017767 0.607175 7.447097 28 | v 4.408403 4.428747 0.374372 29 | v -0.624668 -8.883871 0.394246 30 | v -5.879218 -1.541728 -4.902107 31 | v 1.612830 -4.902934 -6.037051 32 | v 12.330495 2.426388 -5.079631 33 | v 12.649042 -1.311369 -3.926484 34 | v -4.718349 -5.593613 -3.818463 35 | v -0.578788 -6.792700 -4.859627 36 | v -5.893767 -6.765849 0.312148 37 | v 5.973919 -1.611104 -4.023604 38 | usemtl (null) 39 | s off 40 | f 17 12 25 41 | f 18 1 21 42 | f 4 17 11 43 | f 26 31 30 44 | f 27 17 31 45 | f 17 27 33 46 | f 33 28 29 47 | f 18 13 15 48 | f 24 8 16 49 | f 28 5 9 50 | f 26 30 32 51 | f 4 23 21 52 | f 10 9 14 53 | f 19 20 3 54 | f 18 26 32 55 | f 23 22 13 56 | f 20 19 29 57 | f 11 22 23 58 | f 10 6 9 59 | f 33 29 19 60 | f 33 19 17 61 | f 21 1 12 62 | f 23 13 21 63 | f 7 33 27 64 | f 11 14 22 65 | f 15 13 16 66 | f 2 26 15 67 | f 2 7 26 68 | f 16 2 15 69 | f 19 3 11 70 | f 16 7 2 71 | f 3 14 11 72 | f 5 28 8 73 | f 5 8 24 74 | f 1 18 32 75 | f 14 24 22 76 | f 17 19 11 77 | f 5 24 9 78 | f 29 28 20 79 | f 17 4 12 80 | f 26 18 15 81 | f 8 33 7 82 | f 3 10 14 83 | f 28 6 20 84 | f 30 31 32 85 | f 32 31 25 86 | f 6 28 9 87 | f 13 24 16 88 | f 26 7 27 89 | f 10 3 20 90 | f 24 14 9 91 | f 22 24 13 92 | f 8 7 16 93 | f 31 17 25 94 | f 1 32 12 95 | f 12 32 25 96 | f 4 21 12 97 | f 11 23 4 98 | f 26 27 31 99 | f 13 18 21 100 | f 20 6 10 101 | f 8 28 33 102 | -------------------------------------------------------------------------------- /example2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 33 | 34 |
35 | CSS 36 | SVG/Raphael 37 |
canvas/webgl coming soon
38 |
39 | 40 |
41 |
42 | 43 | 48 | 49 |
50 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | 2 | $(function() { 3 | 4 | var offset = $v(0, 0); 5 | var header = $('.header'); 6 | 7 | make_renderer(); 8 | 9 | dom3d.current_eye($v(0,0,-15)); 10 | dom3d.current_light(vec_unit($v(-1.0, 0.5, -.2))); 11 | dom3d.current_color($c(200, 255, 200)); 12 | 13 | var start = $v(0.0, 0.0, 15.0); 14 | 15 | function rotate(p) { 16 | return _vec_3drotateY(p, Math.PI); 17 | } 18 | 19 | for(var i=0; i 0) 75 | $(this).addClass('selected'); 76 | }); 77 | 78 | function install_resize() { 79 | $(window).resize(function() { 80 | init(); 81 | }); 82 | } 83 | 84 | window.make_renderer = make_renderer; 85 | window.install_resize = install_resize; 86 | window.fix_canvas = fix_canvas; 87 | }); -------------------------------------------------------------------------------- /example2.js: -------------------------------------------------------------------------------- 1 | 2 | $(function() { 3 | 4 | var offset = $v(0, 0); 5 | var header = $('.header'); 6 | 7 | make_renderer(); 8 | 9 | dom3d.current_eye($v(0,0,-15)); 10 | dom3d.current_light(vec_unit($v(-1.0, .5, -.2))); 11 | dom3d.current_color($c(200, 255, 200)); 12 | 13 | var start = $v(0.0, 0.0, 15.0); 14 | 15 | function rotate(p) { 16 | return _vec_3drotateY(p, Math.PI); 17 | } 18 | 19 | for(var i=0; i 2d projection 7 | function project2d(points, frustum) { 8 | function proj(point, frustum) { 9 | var x = point[X] / point[Z]; 10 | var y = point[Y] / point[Z]; 11 | 12 | x = (frustum.xmax - x) / (frustum.xmax - frustum.xmin); 13 | y = (frustum.ymax - y) / (frustum.ymax - frustum.ymin); 14 | 15 | return $v(x * dom3d.current_width(), y * dom3d.current_height()); 16 | } 17 | 18 | return [proj(points[0], frustum), 19 | proj(points[1], frustum), 20 | proj(points[2], frustum)]; 21 | } 22 | 23 | // 2d -> 3d projection 24 | function project3d(points, z, frustum) { 25 | var x = points[X] / dom3d.current_width(); 26 | x = frustum.xmax - (x * (frustum.xmax - frustum.xmin)); 27 | 28 | var y = points[Y] / dom3d.current_height(); 29 | y = frustum.ymax - (y * (frustum.ymax - frustum.ymin)); 30 | 31 | return $v(x * z, y * z, z); 32 | } 33 | 34 | function test(canvas) { 35 | this.render2d(canvas, 36 | [$v(0, 0), $v(100, 100), $v(100, 0)], 37 | $c(0, 255, 0)); 38 | 39 | this.render2d(canvas, 40 | [$v(50, 200), $v(50, 250), $v(100, 225)], 41 | $c(0, 0, 255)); 42 | } 43 | 44 | // default 3d rendering function projects points into 2d space in 45 | // software and uses render2d to render them 46 | function render3d(canvas, points, eye, light, frustum) { 47 | var p_eye = [vec_subtract(points[0], eye), 48 | vec_subtract(points[1], eye), 49 | vec_subtract(points[2], eye)]; 50 | 51 | var tri_ca = vec_subtract(p_eye[2], p_eye[0]); 52 | var tri_cb = vec_subtract(p_eye[2], p_eye[1]); 53 | 54 | var normal_eye = vec_cross(tri_ca, tri_cb); 55 | var angle = vec_dot(p_eye[0], normal_eye); 56 | 57 | // don't render back faces of triangles 58 | if(angle >= 0) { 59 | this.remove && this.remove(points); 60 | return; 61 | } 62 | 63 | // lighting 64 | var p_ba = vec_subtract(points[1], points[0]); 65 | var p_ca = vec_subtract(points[2], points[0]); 66 | var normal = vec_unit(vec_cross(p_ba, p_ca)); 67 | 68 | var color = points.color || dom3d.current_color(); 69 | 70 | var angle = vec_dot(normal, light); 71 | var ambient = .3; 72 | var shade = Math.min(1.0, Math.max(0.0, angle)); 73 | shade = Math.min(1.0, shade + ambient); 74 | 75 | var points2d = this.project2d(p_eye, frustum); 76 | points2d.ref = points.ref; 77 | 78 | this.render2d( 79 | canvas, 80 | points2d, 81 | $c(Math.floor(color[R] * shade), 82 | Math.floor(color[G] * shade), 83 | Math.floor(color[B] * shade)) 84 | ) 85 | } 86 | 87 | function render2d(canvas, point, color) { 88 | } 89 | 90 | function clear(canvas) { 91 | } 92 | 93 | function init() { 94 | } 95 | 96 | function destroy() { 97 | } 98 | 99 | function Renderer() { 100 | }; 101 | 102 | Renderer.prototype = { 103 | init: init, 104 | clear: clear, 105 | destroy: destroy, 106 | project2d: project2d, 107 | project3d: project3d, 108 | render3d: render3d, 109 | render2d: render2d, 110 | test: test 111 | } 112 | 113 | window.Renderer = Renderer; 114 | })(); -------------------------------------------------------------------------------- /mesh/vectors.scm: -------------------------------------------------------------------------------- 1 | 2 | (declare (block) 3 | (standard-bindings) 4 | (extended-bindings)) 5 | 6 | (define (make-vec2d x y) (f64vector x y)) 7 | (define vec2d? f64vector?) 8 | (define (vec2d-copy v) (f64vector-copy v)) 9 | (define (vec2d-x v) (f64vector-ref v 0)) 10 | (define (vec2d-y v) (f64vector-ref v 1)) 11 | 12 | (define (vec2d-add v1 v2) 13 | (make-vec2d (fl+ (vec2d-x v1) (vec2d-x v2)) 14 | (fl+ (vec2d-y v1) (vec2d-y v2)))) 15 | 16 | (define (vec2d-sub v1 v2) 17 | (make-vec2d (fl- (vec2d-x v1) (vec2d-x v2)) 18 | (fl- (vec2d-y v1) (vec2d-y v2)))) 19 | 20 | (define (vec2d-length v1) 21 | (flsqrt (fl+ (fl* (vec2d-x v1) (vec2d-x v1)) 22 | (fl* (vec2d-y v1) (vec2d-y v1))))) 23 | 24 | (define (vec2d-scalar-mul v1 f) 25 | (make-vec2d (fl* (vec2d-x v1) f) 26 | (fl* (vec2d-y v1) f))) 27 | 28 | (define (make-vec3d x y z) 29 | (declare (inlining-limit 10000)) 30 | (f64vector x y z)) 31 | (define vec3d? f64vector?) 32 | (define (vec3d-copy v) (f64vector-copy v)) 33 | (define (vec3d-x v) (f64vector-ref v 0)) 34 | (define (vec3d-y v) (f64vector-ref v 1)) 35 | (define (vec3d-z v) (f64vector-ref v 2)) 36 | (define (vec3d-x-set! v f) (f64vector-set! v 0 f)) 37 | (define (vec3d-y-set! v f) (f64vector-set! v 1 f)) 38 | (define (vec3d-z-set! v f) (f64vector-set! v 2 f)) 39 | 40 | (define (make-vec4d x y z w) 41 | (declare (inlining-limit 10000)) 42 | (f64vector x y z w)) 43 | (define vec4d? f64vector?) 44 | (define (vec4d-copy v) (f64vector-copy v)) 45 | (define (vec4d-x v) (f64vector-ref v 0)) 46 | (define (vec4d-y v) (f64vector-ref v 1)) 47 | (define (vec4d-z v) (f64vector-ref v 2)) 48 | (define (vec4d-w v) (f64vector-ref v 3)) 49 | (define (vec4d-x-set! v f) (f64vector-set! v 0 f)) 50 | (define (vec4d-y-set! v f) (f64vector-set! v 1 f)) 51 | (define (vec4d-z-set! v f) (f64vector-set! v 2 f)) 52 | (define (vec4d-w-set! v f) (f64vector-set! v 3 f)) 53 | 54 | (define (vec3d-op v1 v2 op) 55 | (make-vec3d (op (vec3d-x v1) (vec3d-x v2)) 56 | (op (vec3d-y v1) (vec3d-y v2)) 57 | (op (vec3d-z v1) (vec3d-z v2)))) 58 | 59 | (define (vec3d-add v1 v2) 60 | (declare (inlining-limit 10000)) 61 | (vec3d-op v1 v2 fl+)) 62 | 63 | (define (vec3d-sub v1 v2) 64 | (declare (inlining-limit 10000)) 65 | (vec3d-op v1 v2 fl-)) 66 | 67 | (define (vec3d-component-mul v1 v2) 68 | (declare (inlining-limit 10000)) 69 | (vec3d-op v1 v2 fl*)) 70 | 71 | (define (vec3d-scalar-mul v1 f) 72 | (make-vec3d (fl* (vec3d-x v1) f) 73 | (fl* (vec3d-y v1) f) 74 | (fl* (vec3d-z v1) f))) 75 | 76 | (define (vec3d-length v1) 77 | (declare (inlining-limit 10000)) 78 | (flsqrt (vec3d-dot v1 v1))) 79 | 80 | (define (vec3d-unit v1) 81 | (declare (inlining-limit 10000)) 82 | (vec3d-scalar-mul v1 (fl/ (vec3d-length v1)))) 83 | 84 | (define (vec3d-dot v1 v2) 85 | (declare (inlining-limit 10000)) 86 | (fl+ (fl* (vec3d-x v1) (vec3d-x v2)) 87 | (fl* (vec3d-y v1) (vec3d-y v2)) 88 | (fl* (vec3d-z v1) (vec3d-z v2)))) 89 | 90 | (define (vec3d-cross v1 v2) 91 | (declare (inlining-limit 10000)) 92 | (let ((v1-x (vec3d-x v1)) (v2-x (vec3d-x v2)) 93 | (v1-y (vec3d-y v1)) (v2-y (vec3d-y v2)) 94 | (v1-z (vec3d-z v1)) (v2-z (vec3d-z v2))) 95 | (make-vec3d (fl- (fl* v1-y v2-z) 96 | (fl* v1-z v2-y)) 97 | (fl- (fl* v1-z v2-x) 98 | (fl* v1-x v2-z)) 99 | (fl- (fl* v1-x v2-y) 100 | (fl* v1-y v2-x))))) 101 | 102 | (define (vec4d-add v1 v2) 103 | (declare (inlining-limit 10000)) 104 | (make-vec4d (fl+ (vec4d-x v1) (vec4d-x v2)) 105 | (fl+ (vec4d-y v1) (vec4d-y v2)) 106 | (fl+ (vec4d-z v1) (vec4d-z v2)) 107 | (fl+ (vec4d-w v1) (vec4d-w v2)))) 108 | 109 | (define (vec4d-component-mul v1 v2) 110 | (declare (inlining-limit 10000)) 111 | (make-vec4d (fl* (vec4d-x v1) (vec4d-x v2)) 112 | (fl* (vec4d-y v1) (vec4d-y v2)) 113 | (fl* (vec4d-z v1) (vec4d-z v2)) 114 | (fl* (vec4d-w v1) (vec4d-w v2)))) 115 | -------------------------------------------------------------------------------- /mesh/snake.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.57 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib snake.mtl 4 | o Mesh_Cube.008_Cube.009 5 | v 0.918569 0.982082 2.099515 6 | v 0.918568 0.982081 -0.021245 7 | v -1.027143 0.982082 -0.021245 8 | v -1.027144 0.982082 2.099515 9 | v -1.027144 -1.005973 -0.021244 10 | v -1.027144 -1.005971 2.099516 11 | v 0.918568 -1.005973 -0.021244 12 | v 0.918567 -1.005972 2.099516 13 | v 0.972856 0.994029 5.585581 14 | v 0.972856 0.994029 3.464820 15 | v -0.972856 0.994029 3.464820 16 | v -0.972856 0.994030 5.585581 17 | v -0.972856 -0.994025 3.464822 18 | v -0.972856 -0.994023 5.585582 19 | v 0.972856 -0.994025 3.464822 20 | v 0.972855 -0.994024 5.585582 21 | v 0.851872 0.870413 7.358609 22 | v 0.851871 0.870412 5.501587 23 | v -0.851871 0.870413 7.358609 24 | v -0.851871 0.870413 5.501587 25 | v -0.851871 -0.870405 5.501588 26 | v -0.851872 -0.870404 7.358610 27 | v 0.851871 -0.870405 5.501588 28 | v 0.851871 -0.870405 7.358610 29 | v 0.889675 0.909040 8.958823 30 | v 0.889674 0.909039 7.019393 31 | v -0.889674 0.909040 7.019393 32 | v -0.889674 0.909041 8.958823 33 | v -0.889675 -0.909030 7.019394 34 | v -0.889675 -0.909029 8.958825 35 | v 0.889674 -0.909030 7.019394 36 | v 0.889674 -0.909030 8.958825 37 | v 0.723310 0.739056 10.390221 38 | v 0.723310 0.739056 8.813455 39 | v -0.723310 0.739057 10.390221 40 | v -0.723310 0.739056 8.813455 41 | v -0.723310 -0.739044 8.813455 42 | v -0.723310 -0.739043 10.390221 43 | v 0.723310 -0.739044 8.813455 44 | v 0.723309 -0.739043 10.390221 45 | v 0.830579 0.848661 12.057287 46 | v 0.830579 0.848660 10.246682 47 | v -0.830579 0.848661 12.057287 48 | v -0.830579 0.848660 10.246682 49 | v -0.830579 -0.848647 10.246684 50 | v -0.830579 -0.848646 12.057289 51 | v 0.830579 -0.848647 10.246684 52 | v 0.830578 -0.848647 12.057289 53 | v 0.860570 0.870989 13.513883 54 | v 0.860569 0.870988 11.630155 55 | v -0.867675 0.870989 11.630155 56 | v -0.867675 0.870990 13.513883 57 | v -0.867675 -0.894865 11.630157 58 | v -0.867675 -0.894864 13.513885 59 | v 0.860569 -0.894865 11.630157 60 | v 0.860569 -0.894865 13.513885 61 | v 0.610035 0.737971 14.978752 62 | v 0.610035 0.737970 13.378822 63 | v -0.857837 0.737971 14.978752 64 | v -0.857837 0.737970 13.378822 65 | v -0.857837 -0.761845 13.378823 66 | v -0.857837 -0.761843 14.978753 67 | v 0.610035 -0.761845 13.378823 68 | v 0.610034 -0.761844 14.978753 69 | v 0.800222 0.861688 3.754872 70 | v 0.800221 0.861686 1.890974 71 | v -0.909828 0.861689 3.754872 72 | v -0.909828 0.861687 1.890974 73 | v -0.909828 -0.885576 1.890976 74 | v -0.909828 -0.885575 3.754873 75 | v 0.800221 -0.885576 1.890976 76 | v 0.800221 -0.885576 3.754873 77 | usemtl (null).002 78 | s off 79 | f 1 2 3 80 | f 1 3 4 81 | f 5 6 4 82 | f 5 4 3 83 | f 7 8 5 84 | f 8 6 5 85 | f 2 1 7 86 | f 1 8 7 87 | f 1 4 8 88 | f 4 6 8 89 | f 2 7 5 90 | f 2 5 3 91 | f 9 10 11 92 | f 9 11 12 93 | f 13 14 12 94 | f 13 12 11 95 | f 15 16 13 96 | f 16 14 13 97 | f 10 9 15 98 | f 9 16 15 99 | f 9 12 16 100 | f 12 14 16 101 | f 10 15 13 102 | f 10 13 11 103 | f 17 18 19 104 | f 18 20 19 105 | f 21 22 19 106 | f 21 19 20 107 | f 23 24 21 108 | f 24 22 21 109 | f 18 17 23 110 | f 17 24 23 111 | f 17 19 22 112 | f 17 22 24 113 | f 18 23 21 114 | f 18 21 20 115 | f 25 26 27 116 | f 25 27 28 117 | f 29 30 28 118 | f 29 28 27 119 | f 31 32 29 120 | f 32 30 29 121 | f 26 25 31 122 | f 25 32 31 123 | f 25 28 30 124 | f 25 30 32 125 | f 26 31 29 126 | f 26 29 27 127 | f 33 34 35 128 | f 34 36 35 129 | f 37 38 35 130 | f 37 35 36 131 | f 39 40 37 132 | f 40 38 37 133 | f 34 33 39 134 | f 33 40 39 135 | f 33 35 40 136 | f 35 38 40 137 | f 34 39 37 138 | f 34 37 36 139 | f 41 42 43 140 | f 42 44 43 141 | f 45 46 43 142 | f 45 43 44 143 | f 47 48 45 144 | f 48 46 45 145 | f 42 41 47 146 | f 41 48 47 147 | f 41 43 46 148 | f 41 46 48 149 | f 42 47 45 150 | f 42 45 44 151 | f 49 50 51 152 | f 49 51 52 153 | f 53 54 52 154 | f 53 52 51 155 | f 55 56 53 156 | f 56 54 53 157 | f 50 49 55 158 | f 49 56 55 159 | f 49 52 54 160 | f 49 54 56 161 | f 50 55 53 162 | f 50 53 51 163 | f 57 58 59 164 | f 58 60 59 165 | f 61 62 59 166 | f 61 59 60 167 | f 63 64 61 168 | f 64 62 61 169 | f 58 57 63 170 | f 57 64 63 171 | f 57 59 64 172 | f 59 62 64 173 | f 58 63 61 174 | f 58 61 60 175 | f 65 66 67 176 | f 66 68 67 177 | f 69 70 67 178 | f 69 67 68 179 | f 71 72 69 180 | f 72 70 69 181 | f 66 65 71 182 | f 65 72 71 183 | f 65 67 70 184 | f 65 70 72 185 | f 66 71 69 186 | f 66 69 68 187 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | margin: 0; 4 | } 5 | 6 | body p { 7 | width: 50em; 8 | } 9 | 10 | .header { 11 | background-color: #361a11; 12 | color: white; 13 | padding: 2em; 14 | } 15 | 16 | .header a, 17 | .header a:active, 18 | .header a:visited { 19 | display: inline-block; 20 | padding: 1em; 21 | background-color: #bd5294; 22 | color: white; 23 | margin-left: 1em; 24 | } 25 | 26 | .content { 27 | margin: 1em 2em; 28 | } 29 | 30 | .clear { 31 | clear: both; 32 | } 33 | 34 | ._dom3d { 35 | position: absolute; 36 | top: 0; 37 | opacity: 1; 38 | left: 0; 39 | width: 1px; 40 | height: 1px; 41 | background-color: red; 42 | background-position: bottom left; 43 | background-repeat: no-repeat; 44 | overflow: hidden; 45 | -moz-transition-duration: 3s; 46 | -moz-transition-property: top, opacity; 47 | -webkit-transition-duration: 3s; 48 | -webkit-transition-property: top, opacity; 49 | -o-transition-duration: 3s; 50 | -o-transition-property: top, opacity; 51 | } 52 | 53 | ._dom3d.border { 54 | border: 1px solid red; 55 | } 56 | 57 | ._dom3d.off:nth-of-type(2n) { 58 | top: 100px; 59 | opacity: 0; 60 | -moz-transition-duration: 3s; 61 | -moz-transition-property: top, opacity; 62 | -webkit-transition-duration: 3s; 63 | -webkit-transition-property: top, opacity; 64 | -o-transition-duration: 3s; 65 | -o-transition-property: top, opacity; 66 | } 67 | 68 | ._dom3d.off:nth-of-type(2n + 1) { 69 | top: -100px; 70 | opacity: 0; 71 | -moz-transition-duration: 3s; 72 | -moz-transition-property: top, opacity; 73 | -webkit-transition-duration: 3s; 74 | -webkit-transition-property: top, opacity; 75 | -o-transition-duration: 3s; 76 | -o-transition-property: top, opacity; 77 | } 78 | 79 | .off-code { 80 | display: none; 81 | } 82 | 83 | #main #canvas { 84 | position: fixed; 85 | top: 100px; 86 | right: 0; 87 | width: 600px; 88 | height: 300px; 89 | } 90 | 91 | #main #controls { 92 | position: fixed; 93 | top: 500px; 94 | width: 300px; 95 | right: 0; 96 | padding: 1em; 97 | background-color: #361a11; 98 | color: white; 99 | } 100 | 101 | #canvas2 { 102 | position: fixed; 103 | top: 0; 104 | left: 0; 105 | margin-left: 150px; 106 | } 107 | 108 | /* #boxes:before { */ 109 | /* display: block; */ 110 | /* width: 100px; */ 111 | /* height: 100px; */ 112 | /* position: absolute; */ 113 | /* top: 0; */ 114 | /* left: 0; */ 115 | /* border: 1px solid green; */ 116 | /* content: ' '; */ 117 | /* } */ 118 | 119 | .example { 120 | float: left; 121 | margin-right: 7em; 122 | width: 50px; 123 | height: 50px; 124 | background-image: 125 | -o-linear-gradient(-45deg, red 50%, transparent 0); 126 | background-image: 127 | -moz-linear-gradient(-45deg, red 50%, transparent 0); 128 | background-image: 129 | -webkit-gradient(linear, 130 | 0 0, 131 | 50 50, 132 | from(red), 133 | color-stop(.5, red), 134 | color-stop(.5, transparent), 135 | to(transparent)) 136 | } 137 | 138 | .example2 { 139 | -moz-transform: skew(30deg); 140 | -webkit-transform: skew(30deg); 141 | -o-transform: skew(30deg); 142 | } 143 | 144 | .example3 { 145 | -moz-transform: rotate(.78rad); 146 | -moz-transform-origin: bottom left; 147 | -webkit-transform: rotate(.78rad); 148 | -webkit-transform-origin: bottom left; 149 | -o-transform: rotate(.78rad); 150 | -o-transform-origin: bottom left; 151 | } 152 | 153 | .example4 { 154 | width: 0px; 155 | height: 0px; 156 | border-style: solid; 157 | border-width: 75px 75px; 158 | border-color: red transparent transparent red; 159 | margin: 15em; 160 | padding: 0; 161 | font-size: 0; 162 | /* background-image: */ 163 | 164 | /* -moz-linear-gradient(-45deg, red 50%, transparent 0); */ 165 | -moz-transform: rotate(.2rad); 166 | -moz-transform-origin: top left; 167 | } 168 | 169 | .last { 170 | margin-top: 5em; 171 | } 172 | 173 | .nav { 174 | float: left; 175 | } 176 | 177 | .render-options { 178 | float: right; 179 | } 180 | 181 | .render-options a, 182 | .render-options a:visited { 183 | display: inline-block; 184 | padding: 1em; 185 | color: white; 186 | border: 1px solid #bd5294; 187 | background-color: transparent; 188 | } 189 | 190 | .render-options a.selected { 191 | background-color: #bd5294; 192 | } 193 | 194 | .render-options div { 195 | display: inline-block; 196 | font-style: italic; 197 | font-size: .75em; 198 | width: 7em; 199 | margin-left: 1em; 200 | vertical-align: bottom; 201 | } -------------------------------------------------------------------------------- /cursor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 30 | 31 | 32 |
33 | 43 | 44 |
45 |
46 | 47 |
48 |

49 | Lorem ipsum dolor sit amet, consectetur 50 | adipiscing elit. Fusce imperdiet pellentesque orci dignissim 51 | tempor. Nunc at quam nisi, sit amet aliquet est. Nulla tortor 52 | massa, auctor a euismod iaculis, vulputate in tellus. Integer 53 | imperdiet nibh a libero porta commodo. Sed diam diam, tempor et 54 | scelerisque vitae, pharetra sed ligula. Aliquam fermentum 55 | scelerisque molestie. Ut sit amet enim in nisi convallis 56 | pulvinar mattis sed metus. Ut et sem odio. Class aptent taciti 57 | sociosqu ad litora torquent per conubia nostra, per inceptos 58 | himenaeos. Donec sed quam quis felis varius 59 | scelerisque. Pellentesque vel ultrices eros. Phasellus 60 | sollicitudin dapibus interdum. 61 |

62 | 63 |

64 | Ut vel euismod nisl. Donec nec adipiscing augue. Quisque aliquet 65 | suscipit elit in eleifend. Quisque a porta arcu. Duis sollicitudin 66 | ipsum pharetra metus ullamcorper semper. Vivamus luctus leo eget quam 67 | ullamcorper non sagittis metus auctor. Sed iaculis adipiscing nisi, at 68 | aliquam ligula interdum ac. Vestibulum sollicitudin, justo sed 69 | tincidunt sollicitudin, lacus felis porttitor ligula, ac vulputate 70 | nibh ipsum et lorem. Pellentesque ullamcorper aliquam tellus vitae 71 | accumsan. Nullam dictum dolor mollis nunc venenatis sed condimentum 72 | ipsum fermentum. Etiam nec aliquam quam. Morbi ipsum dolor, tempor id 73 | ultrices at, luctus eu felis. Nulla rhoncus arcu sagittis ante varius 74 | volutpat. Nam et felis sit amet nunc iaculis scelerisque. Nunc id elit 75 | in erat vestibulum placerat sit amet id metus. 76 |

77 | 78 |

79 | Etiam sodales mi nec ligula commodo porta. Cras 80 | pulvinar placerat lorem vitae eleifend. Nunc sodales est in 81 | sem accumsan vulputate. Nullam ante lacus, consectetur non 82 | malesuada nec, pharetra at mi. Sed vitae nisl risus. Sed dui 83 | quam, euismod vel pharetra ut, vulputate non tellus. Class 84 | aptent taciti sociosqu ad litora torquent per conubia nostra, 85 | per inceptos himenaeos. Quisque ac enim a ligula cursus 86 | adipiscing ut a orci. Sed quam mauris, blandit sed volutpat 87 | eget, commodo id sem. Maecenas eros velit, suscipit eu 88 | venenatis accumsan, pellentesque vitae neque. Fusce semper 89 | condimentum turpis, ut accumsan arcu pulvinar eu. Integer 90 | lacinia condimentum sapien vel tempor. Pellentesque a nisl vel 91 | ante aliquet suscipit. Nulla id sem id diam vehicula lacinia 92 | eu tincidunt ligula. Sed non tellus eget nisi hendrerit 93 | faucibus a ut tortor. Suspendisse nec dolor in sapien feugiat 94 | mollis. Nulla lobortis, lectus et consequat dictum, lorem enim 95 | rhoncus libero, vulputate blandit erat erat eget nisi. Integer 96 | non nisl purus, vitae pellentesque dui. 97 |

98 |
99 | 100 |
101 | 102 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /dom3d.js: -------------------------------------------------------------------------------- 1 | 2 | (function() { 3 | 4 | function make_parameter(default_val) { 5 | var _val = default_val; 6 | return function(val) { 7 | if(val) 8 | _val = val; 9 | return _val; 10 | }; 11 | } 12 | 13 | // settings 14 | var current_width = make_parameter(); 15 | var current_height = make_parameter(); 16 | 17 | var current_renderer = make_parameter(); 18 | var current_color = make_parameter($c(0, 0, 0)); 19 | var current_eye = make_parameter(); 20 | var current_frustum = make_parameter(); 21 | var current_light = make_parameter(); 22 | 23 | // setup 24 | 25 | function init(width_or_canvas, height) { 26 | if(typeof width_or_canvas == 'string') { 27 | var el = $('#' + width_or_canvas); 28 | current_width(el.width()); 29 | current_height(el.height()); 30 | } 31 | else { 32 | current_width(width_or_canvas); 33 | current_height(height); 34 | } 35 | 36 | current_renderer().init(width_or_canvas, height); 37 | } 38 | 39 | function render(canvas, mesh) { 40 | var eye = dom3d.current_eye(); 41 | var data = mesh.data; 42 | var len = data.length; 43 | var renderer = current_renderer(); 44 | 45 | var heap = make_heap(); 46 | 47 | for(var i=0; i 2d projection 35 | function project(point, frustum) { 36 | // x/z and y/z 37 | var x = point.e(1) / point.e(3); 38 | var y = point.e(2) / point.e(3); 39 | 40 | x = (frustum.xmax - x) / (frustum.xmax - frustum.xmin); 41 | y = (frustum.ymax - y) / (frustum.ymax - frustum.ymin); 42 | 43 | return $V([x * current_width(), 44 | y * current_height()]); 45 | } 46 | 47 | function project_triangle(tri, frustum) { 48 | return [project(tri[0], frustum), 49 | project(tri[1], frustum), 50 | project(tri[2], frustum)]; 51 | } 52 | 53 | // 3d rendering 54 | function clear_tris() { 55 | paper.clear(); 56 | } 57 | 58 | function draw_tri(tri, eye, light, frustum) { 59 | var p_eye = [tri.points[0].subtract(eye), 60 | tri.points[1].subtract(eye), 61 | tri.points[2].subtract(eye)]; 62 | 63 | var tri_ca = p_eye[2].subtract(p_eye[0]); 64 | var tri_cb = p_eye[2].subtract(p_eye[1]); 65 | 66 | var normal_eye = tri_ca.cross(tri_cb); 67 | var angle = p_eye[0].dot(normal_eye); 68 | 69 | // don't render back faces of triangles 70 | if(angle >= 0) 71 | return; 72 | 73 | // lighting 74 | var normal = tri.points[1].subtract(tri.points[0]).cross( 75 | tri.points[2].subtract(tri.points[0]) 76 | ).toUnitVector(); 77 | 78 | var angle = normal.dot(light); 79 | var ambient = .3; 80 | var shade = Math.min(1.0, Math.max(0.0, angle)); 81 | shade = Math.min(1.0, shade + ambient); 82 | 83 | var color = 'rgb(' + 84 | Math.floor(tri.r * shade) + ',' + 85 | Math.floor(tri.g * shade) + ',' + 86 | Math.floor(tri.b * shade) + ')'; 87 | 88 | // 2d projection 89 | var points = project_triangle(p_eye, 90 | frustum); 91 | 92 | var p = paper.path('M' + points[0].e(1) + ' ' + points[0].e(2) + 93 | 'L' + points[1].e(1) + ' ' + points[1].e(2) + 94 | 'L' + points[2].e(1) + ' ' + points[2].e(2) + 95 | 'L' + points[0].e(1) + ' ' + points[0].e(2)); 96 | p.attr({ 'fill': color, 97 | 'stroke': color }); 98 | } 99 | 100 | // utility 101 | function random_int(upper) { 102 | return Math.floor(Math.random() * upper); 103 | } 104 | 105 | function random_real(upper) { 106 | return Math.random() * upper; 107 | } 108 | 109 | function random_3dvec(upper, lower) { 110 | lower = lower || 0; 111 | upper = upper - lower; 112 | return $V([random_real(upper) + lower, 113 | random_real(upper) + lower, 114 | random_real(upper) + lower]); 115 | } 116 | 117 | // main stuff 118 | 119 | width = 800; 120 | height = 600; 121 | 122 | var paper = Raphael(0, 0, current_width(), current_height()); 123 | var eye = $V([0,0,-8]); 124 | var light = $V([-1.0, -1.0, -1.0]).toUnitVector(); 125 | var frustum = make_frustum(60.0, 126 | current_width() / current_height(), 127 | 1.0, 128 | 1000.0); 129 | 130 | // window.tris = [ 131 | // make_triangle([$V([0, 0, 0]), 132 | // $V([0, 20, 0]), 133 | // $V([20, 0, 0])], 134 | // 0, 255, 0), 135 | 136 | // make_triangle([$V([20, 0, 0]), 137 | // $V([40, 10, 0]), 138 | // $V([40, -20, 0])], 139 | // 255, 0, 0), 140 | 141 | // make_triangle([$V([40, -20, 0]), 142 | // $V([-10, 0, 0]), 143 | // $V([20, 0, 0])], 144 | // 255, 0, 0) 145 | 146 | // ]; 147 | 148 | 149 | function update(points, dist) { 150 | function lp(p) { 151 | return p.rotate(dist, $L([0,0,0], [0,1,1])); 152 | } 153 | 154 | return [lp(points[0]), lp(points[1]), lp(points[2])]; 155 | } 156 | 157 | setInterval(function() { 158 | clear_tris(); 159 | 160 | if('tris' in window) { 161 | var tris = window.tris; 162 | for(var i=0; i= 2 && (arr[Y] = y); 28 | len >= 3 && (arr[Z] = z); 29 | len == 4 && (arr[W] = w); 30 | return arr; 31 | } 32 | 33 | function vec_equals(v1, v2) { 34 | function fleq(x, y) { 35 | if(isNaN(x) && isNaN(y)) 36 | return true; 37 | 38 | return Math.abs(x - y) < .0000000001; 39 | } 40 | 41 | return (fleq(v1[X], v2[X]) && 42 | fleq(v1[Y], v2[Y]) && 43 | fleq(v1[Z], v2[Z]) && 44 | fleq(v1[W], v2[W])); 45 | } 46 | 47 | function vec_copy(v1) { 48 | if("Float32Array" in window && v1 instanceof Float32Array) { 49 | var buffer = new ArrayBuffer(4*v1.length); 50 | var arr = new Float32Array(buffer); 51 | arr[X] = v1[X]; 52 | arr[Y] = v1[Y]; 53 | arr[Z] = v1[Z]; 54 | arr[W] = v1[W]; 55 | return arr; 56 | } 57 | return Array.prototype.slice.call(v1); 58 | } 59 | 60 | function vec_pure_operation(op) { 61 | return function(v1, v2) { 62 | v1 = vec_copy(v1); 63 | op(v1, v2); 64 | return v1; 65 | } 66 | } 67 | 68 | function _vec_subtract(v1, v2) { 69 | v1[X] = v1[X] - v2[X]; 70 | v1.length >= 2 && (v1[Y] = v1[Y] - v2[Y]); 71 | v1.length >= 3 && (v1[Z] = v1[Z] - v2[Z]); 72 | v1.length == 4 && (v1[W] = v1[W] - v2[W]); 73 | } 74 | var vec_subtract = vec_pure_operation(_vec_subtract); 75 | 76 | function _vec_multiply(v1, v2) { 77 | v1[X] = v1[X] * v2[X]; 78 | v1.length >= 2 && (v1[Y] = v1[Y] * v2[Y]); 79 | v1.length >= 3 && (v1[Z] = v1[Z] * v2[Z]); 80 | v1.length == 4 && (v1[W] = v1[W] * v2[W]); 81 | } 82 | var vec_multiply = vec_pure_operation(_vec_multiply); 83 | 84 | function _vec_add(v1, v2) { 85 | v1[X] = v1[X] + v2[X], 86 | v1.length >= 2 && (v1[Y] = v1[Y] + v2[Y]); 87 | v1.length >= 3 && (v1[Z] = v1[Z] + v2[Z]); 88 | v1.length == 4 && (v1[W] = v1[W] + v2[W]); 89 | } 90 | var vec_add = vec_pure_operation(_vec_add); 91 | 92 | function vec_dot(v1, v2) { 93 | return (v1[X] * v2[X] + 94 | (v1.length >= 2 ? v1[Y] * v2[Y] : 0) + 95 | (v1.length >= 3 ? v1[Z] * v2[Z] : 0) + 96 | (v1.length == 4 ? v1[W] * v2[W] : 0)); 97 | } 98 | 99 | function _vec_cross(v1, v2) { 100 | if(v1.length < 3) 101 | return; 102 | 103 | var x = v1[Y] * v2[Z] - v1[Z] * v2[Y]; 104 | var y = v1[Z] * v2[X] - v1[X] * v2[Z]; 105 | var z = v1[X] * v2[Y] - v1[Y] * v2[X]; 106 | v1[X] = x; 107 | v1[Y] = y; 108 | v1[Z] = z; 109 | } 110 | var vec_cross = vec_pure_operation(_vec_cross); 111 | 112 | function vec_length(v1) { 113 | return Math.sqrt(v1[X]*v1[X] + 114 | v1[Y]*v1[Y] + 115 | (v1.length >= 3 ? v1[Z]*v1[Z] : 0) + 116 | (v1.length == 4 ? v1[W]*v1[W] : 0)); 117 | } 118 | 119 | function _vec_2drotate(v1, angle) { 120 | var x = v1[X] * Math.cos(angle) - v1[Y] * Math.sin(angle); 121 | var y = v1[X] * Math.sin(angle) + v1[Y] * Math.cos(angle); 122 | v1[X] = x; 123 | v1[Y] = y; 124 | } 125 | var vec_2drotate = vec_pure_operation(_vec_2drotate); 126 | 127 | function _vec_3drotateX(v1, angle) { 128 | var y = v1[Y] * Math.cos(angle) - v1[Z] * Math.sin(angle); 129 | var z = v1[Y] * Math.sin(angle) + v1[Z] * Math.cos(angle); 130 | v1[Y] = y; 131 | v1[Z] = z; 132 | } 133 | var vec_3drotateX = vec_pure_operation(_vec_3drotateX); 134 | 135 | function _vec_3drotateY(v1, angle) { 136 | var x = v1[Z] * Math.sin(angle) + v1[X] * Math.cos(angle); 137 | var z = v1[Z] * Math.cos(angle) - v1[X] * Math.sin(angle); 138 | v1[X] = x; 139 | v1[Z] = z; 140 | } 141 | var vec_3drotateY = vec_pure_operation(_vec_3drotateY); 142 | 143 | function _vec_3drotateZ(v1, angle) { 144 | var x = v1[X] * Math.cos(angle) - v1[Y] * Math.sin(angle); 145 | var y = v1[X] * Math.sin(angle) + v1[Y] * Math.cos(angle); 146 | v1[X] = x; 147 | v1[Y] = y; 148 | } 149 | var vec_3drotateZ = vec_pure_operation(_vec_3drotateZ); 150 | 151 | function _vec_unit(v1) { 152 | var len = vec_length(v1); 153 | v1[X] = v1[X] / len; 154 | v1[Y] = v1[Y] / len; 155 | v1[Z] = v1[Z] / len; 156 | } 157 | var vec_unit = vec_pure_operation(_vec_unit); 158 | 159 | // matrix 160 | // TODO: optimize this 161 | 162 | function $m() { 163 | return Array.prototype.slice.call(arguments); 164 | } 165 | 166 | function matrix_x(m1, m2) { 167 | var res = []; 168 | 169 | for(var row=0; row -.000001) 26 | return 0.0; 27 | return v; 28 | } 29 | 30 | // refs are references to a dom node instance 31 | 32 | function make_ref(canvas, force) { 33 | if(_use_refs || force) { 34 | var node = document.createElement('div'); 35 | node.className = '_dom3d'; 36 | document.getElementById(canvas).appendChild(node); 37 | return node; 38 | } 39 | return null; 40 | } 41 | 42 | // render api 43 | 44 | function clear(canvas, cleanup) { 45 | zIndex = 0; 46 | 47 | var cleanup = cleanup || !_use_refs; 48 | var container = document.getElementById(canvas); 49 | var len = container.childNodes.length; 50 | 51 | // Make sure to pass `cleanup` if you will be creating new 52 | // points each frame and thus new dom nodes 53 | if(cleanup) { 54 | var i = 0; 55 | while(container.childNodes.length > i) { 56 | var node = container.childNodes[i]; 57 | if(node.className == '_dom3d') { 58 | container.removeChild(node); 59 | } 60 | else { 61 | i++; 62 | } 63 | } 64 | } 65 | else { 66 | for(var i=0; i -1; 146 | var _chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; 147 | var _opera = navigator.userAgent.toLowerCase().indexOf('opera') > -1; 148 | 149 | function get_background(color, scale) { 150 | var color = 'rgb(' + 151 | color[R].toFixed() + ',' + 152 | color[G].toFixed() + ',' + 153 | color[B].toFixed() + ')'; 154 | 155 | if(_chrome) { 156 | var angle = -Math.atan2(scale[X], scale[Y]); 157 | return '-webkit-linear-gradient(' + e(angle) + 'rad, ' + color + ' 50%, transparent 0)'; 158 | } 159 | else if(_webkit) { 160 | // hack: safari only supports webkit-gradient, so we have 161 | // to calculate the start/stop points 162 | var end = $v(scale[X], -scale[Y]); 163 | _vec_2drotate(end, Math.PI/2); 164 | 165 | var start = $v(-(end[X] - scale[X]) / 2.0, 166 | (scale[Y] - end[Y]) / 2.0); 167 | 168 | _vec_add(end, start); 169 | 170 | return '-webkit-gradient(linear, ' + 171 | Math.floor(start[X]) + ' ' + Math.floor(start[Y]) + ', ' + 172 | Math.floor(end[X]) + ' ' + Math.floor(end[Y]) + ', ' + 173 | 'from(' + color + '), ' + 174 | 'color-stop(.5, ' + color + '), ' + 175 | 'color-stop(.5, transparent), ' + 176 | 'to(transparent))'; 177 | } 178 | else if(_opera) { 179 | var angle = -Math.atan2(scale[X], scale[Y]); 180 | return '-o-linear-gradient(' + e(angle) + 'rad, ' + color + ' 50%, transparent 0)'; 181 | } 182 | else { 183 | var angle = -Math.atan2(scale[X], scale[Y]); 184 | return '-moz-linear-gradient(' + e(angle) + 'rad, ' + color + ' 50%, transparent 0)'; 185 | } 186 | } 187 | 188 | function RendererCSS() { 189 | this.render2d = render2d; 190 | this.remove = remove; 191 | this.make_ref = make_ref; 192 | this.use_refs = use_refs; 193 | this.use_matrix = use_matrix; 194 | this.clear = clear; 195 | this.type = 'css'; 196 | }; 197 | 198 | RendererCSS.prototype = Renderer.prototype; 199 | window.RendererCSS = RendererCSS; 200 | })(); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 32 | 33 |
34 | CSS 35 | SVG/Raphael 36 |
canvas/webgl coming soon
37 |
38 | 39 |
40 |
41 | 42 |
43 |

dom3d: rendering 3d with CSS3

44 | 45 |

46 | Fork me on github! 47 |

48 | 49 |

50 | 51 | James Long works 52 | for Mozilla and can be reached at 53 | jlongster@jlongster.com 54 | 55 |

56 | 57 |

58 | Here is a 3d object. It is rendered with pure HTML and CSS 59 | using 2d 60 | transforms. These let you specify a transform 61 | property on a DOM element composed 62 | of translate, rotate, 63 | skew, and scale functions. 64 |

65 | 66 |

67 | To achieve the 3d effect, I project the 3d triangles into 2d 68 | screen space using javascript, and then calculate the necessary 69 | transform value to display the 2d triangle. 70 | 71 |

72 | 73 |
74 |
75 | CSS Effects: 76 |
Border
77 |
Off
78 |
Stop
79 | 80 |
.off:nth-of-type(2n) {
 81 |     top: 100px;
 82 |     opacity: 0;
 83 |     -moz-transition: all 2s;
 84 | }
85 |
86 | 87 |

88 | So without any SVG or canvas, you can have real-time 3d objects 89 | in modern browsers! What's the benefit? Well, you don't have to 90 | deal with a canvas, and you can click on links underneath 91 | it. Maybe this is just a cool hack, maybe not? 92 |

93 | 94 |

What's the point?

95 | 96 |

97 | This is mainly just a cool hack, but I think there's use cases 98 | for quick 3d effects on websites. There are a few benefits to this 99 | approach: you get to manipulate the elements with normal CSS, 100 | and you can overlay 3d objects onto pages and still let the 101 | user interact with the page. 102 |

103 | 104 |

105 | I'm interested to see what others think of this hack and see 106 | how far it can go. I'd like to see this library turn into a 107 | quick 3d effects library that supports HTML/CSS, SVG, canvas, and webgl. 108 |

109 | 110 |

How's it work?

111 | 112 |

113 | A 2d triangle is really a quad, but imagine cutting the quad 114 | from two opposite corners and taking only the left 115 | triangle. That's essentially what I do, by way of the CSS3 background 116 | linear-gradient 117 | property. It aligns the background with two opposite corners and 118 | makes one side completely transparent. 119 |

120 | 121 |

122 | Here's an example (only showing the -moz properties, but dom3d 123 | supports -webkit and -o too): 124 | 125 |

background-image: -moz-linear-gradient(-45deg, red 50%, transparent 0);
126 | 127 |
128 |
129 |

130 | 131 |

132 | It turns out that you can render any 2d triangle with the 133 | right translate, rotate, skew, 134 | and scale 135 | settings for the transform CSS property. 136 | 137 |

-moz-transform: skew(30deg);
138 |
-moz-transform: rotate(50deg) skew(-30deg) scale(1.5, .7);
139 |
140 |

141 | 142 |

143 | So you just have to project all the 3d triangles onto the 2d 144 | screen space, and manipulate the DOM triangles to render them 145 | according to the 2d coordinates. 146 |

147 | 148 |

149 | Here is example CSS from a rendered triangle: 150 | 151 |

152 |           -moz-transform: translate(442.176px, 306.35px) rotate(2.12662rad) skew(2.7961rad) scale(197.767, 180.506);
153 |           background: -moz-linear-gradient(45deg, rgb(87, 111, 121) 50%, transparent 0pt);
154 |         
155 |

156 | 157 | 158 |

Notes

159 | 160 |

161 | CSS3 isn't fully supported yet across all browsers, but dom3d 162 | supports Firefox, Chrome, Safari, and Opera. I think IE9 163 | support is possible too. 164 |

165 | 166 |

167 | Obviously there are issues with seams. This is due to 168 | anti-aliasing that is done on the edges. Different browsers 169 | have slightly different effects. 170 |

171 | 172 |

173 | In Firefox 4, there is also a glitch where if I re-use DOM 174 | elements between frames, you can see the other edge of the DOM 175 | elements briefly. The example above creates new DOM elements 176 | per frame, but if you turn on any of the options to the right 177 | it'll switch to re-using DOM nodes and you'll see the 178 | effect. Firefox 6 (nightly) does not have this glitch. 179 |

180 | 181 |

182 | Various browsers will have glitches with this hack, as it's 183 | really a severe and gross hack. Or maybe just a good test case? 184 |

185 | 186 |
187 | 188 | 201 | 202 | 203 | -------------------------------------------------------------------------------- /mesh/mesh404.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.57 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib mesh404.mtl 4 | o Text_Mesh 5 | v 2.353512 -1.335113 3.879344 6 | v 1.834005 -1.335113 3.879344 7 | v 1.834005 -0.847741 3.879344 8 | v 1.214524 -0.847741 3.879344 9 | v 0.912817 -0.369294 3.879344 10 | v 1.782233 1.246355 3.879344 11 | v 1.996462 1.246355 3.879344 12 | v 2.353512 0.889306 3.879344 13 | v 2.353512 -0.372865 3.879344 14 | v 2.587379 -0.372865 3.879344 15 | v 2.587379 -0.822747 3.879344 16 | v 2.353512 -0.822747 3.879344 17 | v 1.834005 0.462631 3.879344 18 | v 1.423398 -0.397858 3.879344 19 | v 1.834005 -0.397858 3.879344 20 | v 0.707513 1.246355 3.879344 21 | v 0.707513 -0.979849 3.879344 22 | v 0.323685 -1.335113 3.879344 23 | v -0.822444 -1.335113 3.879344 24 | v -0.822444 0.891091 3.879344 25 | v -0.436831 1.246355 3.879344 26 | v 0.166583 0.755412 3.879344 27 | v -0.279729 0.755412 3.879344 28 | v -0.279729 -0.845955 3.879344 29 | v 0.166583 -0.845955 3.879344 30 | v -1.247333 -1.335113 3.879344 31 | v -1.766840 -1.335113 3.879344 32 | v -1.766840 -0.847741 3.879344 33 | v -2.386321 -0.847741 3.879344 34 | v -2.688028 -0.369294 3.879344 35 | v -1.818612 1.246355 3.879344 36 | v -1.604383 1.246355 3.879344 37 | v -1.247333 0.889306 3.879344 38 | v -1.247333 -0.372865 3.879344 39 | v -1.013466 -0.372865 3.879344 40 | v -1.013466 -0.822747 3.879344 41 | v -1.247333 -0.822747 3.879344 42 | v -1.766840 0.462631 3.879344 43 | v -2.177447 -0.397858 3.879344 44 | v -1.766840 -0.397858 3.879344 45 | v 2.353512 -1.335113 -3.879344 46 | v 1.834005 -1.335113 -3.879344 47 | v 1.834005 -0.847741 -3.879344 48 | v 1.214524 -0.847741 -3.879344 49 | v 0.912817 -0.369294 -3.879344 50 | v 1.782233 1.246355 -3.879344 51 | v 1.996462 1.246355 -3.879344 52 | v 2.353512 0.889306 -3.879344 53 | v 2.353512 -0.372865 -3.879344 54 | v 2.587379 -0.372865 -3.879344 55 | v 2.587379 -0.822747 -3.879344 56 | v 2.353512 -0.822747 -3.879344 57 | v 1.834005 0.462631 -3.879344 58 | v 1.423398 -0.397858 -3.879344 59 | v 1.834005 -0.397858 -3.879344 60 | v 0.707513 1.246355 -3.879344 61 | v 0.707513 -0.979849 -3.879344 62 | v 0.323685 -1.335113 -3.879344 63 | v -0.822444 -1.335113 -3.879344 64 | v -0.822444 0.891091 -3.879344 65 | v -0.436831 1.246355 -3.879344 66 | v 0.166583 0.755412 -3.879344 67 | v -0.279729 0.755412 -3.879344 68 | v -0.279729 -0.845955 -3.879344 69 | v 0.166583 -0.845955 -3.879344 70 | v -1.247333 -1.335113 -3.879344 71 | v -1.766840 -1.335113 -3.879344 72 | v -1.766840 -0.847741 -3.879344 73 | v -2.386321 -0.847741 -3.879344 74 | v -2.688028 -0.369294 -3.879344 75 | v -1.818612 1.246355 -3.879344 76 | v -1.604383 1.246355 -3.879344 77 | v -1.247333 0.889306 -3.879344 78 | v -1.247333 -0.372865 -3.879344 79 | v -1.013466 -0.372865 -3.879344 80 | v -1.013466 -0.822747 -3.879344 81 | v -1.247333 -0.822747 -3.879344 82 | v -1.766840 0.462631 -3.879344 83 | v -2.177447 -0.397858 -3.879344 84 | v -1.766840 -0.397858 -3.879344 85 | v -1.247333 -1.335113 -3.879344 86 | v -1.247333 -1.335113 3.879344 87 | v -1.766840 -1.335113 -3.879344 88 | v -1.766840 -1.335113 3.879344 89 | v -1.766840 -0.847741 -3.879344 90 | v -1.766840 -0.847741 3.879344 91 | v -2.386321 -0.847741 -3.879344 92 | v -2.386321 -0.847741 3.879344 93 | v -2.688028 -0.369294 -3.879344 94 | v -2.688028 -0.369294 3.879344 95 | v -1.818612 1.246355 -3.879344 96 | v -1.818612 1.246355 3.879344 97 | v -1.604383 1.246355 -3.879344 98 | v -1.604383 1.246355 3.879344 99 | v -1.247333 0.889306 -3.879344 100 | v -1.247333 0.889306 3.879344 101 | v -1.247333 -0.372865 -3.879344 102 | v -1.247333 -0.372865 3.879344 103 | v -1.013466 -0.372865 -3.879344 104 | v -1.013466 -0.372865 3.879344 105 | v -1.013466 -0.822747 -3.879344 106 | v -1.013466 -0.822747 3.879344 107 | v -1.247333 -0.822747 -3.879344 108 | v -1.247333 -0.822747 3.879344 109 | v -1.766840 0.462631 -3.879344 110 | v -1.766840 0.462631 3.879344 111 | v -2.177447 -0.397858 -3.879344 112 | v -2.177447 -0.397858 3.879344 113 | v -1.766840 -0.397858 -3.879344 114 | v -1.766840 -0.397858 3.879344 115 | v 0.707513 1.246355 -3.879344 116 | v 0.707513 1.246355 3.879344 117 | v 0.707513 -0.979849 -3.879344 118 | v 0.707513 -0.979849 3.879344 119 | v 0.323685 -1.335113 -3.879344 120 | v 0.323685 -1.335113 3.879344 121 | v -0.822444 -1.335113 -3.879344 122 | v -0.822444 -1.335113 3.879344 123 | v -0.822444 0.891091 -3.879344 124 | v -0.822444 0.891091 3.879344 125 | v -0.436831 1.246355 -3.879344 126 | v -0.436831 1.246355 3.879344 127 | v 0.166583 0.755412 -3.879344 128 | v 0.166583 0.755412 3.879344 129 | v -0.279729 0.755412 -3.879344 130 | v -0.279729 0.755412 3.879344 131 | v -0.279729 -0.845955 -3.879344 132 | v -0.279729 -0.845955 3.879344 133 | v 0.166583 -0.845955 -3.879344 134 | v 0.166583 -0.845955 3.879344 135 | v 2.353512 -1.335113 -3.879344 136 | v 2.353512 -1.335113 3.879344 137 | v 1.834005 -1.335113 -3.879344 138 | v 1.834005 -1.335113 3.879344 139 | v 1.834005 -0.847741 -3.879344 140 | v 1.834005 -0.847741 3.879344 141 | v 1.214524 -0.847741 -3.879344 142 | v 1.214524 -0.847741 3.879344 143 | v 0.912817 -0.369294 -3.879344 144 | v 0.912817 -0.369294 3.879344 145 | v 1.782233 1.246355 -3.879344 146 | v 1.782233 1.246355 3.879344 147 | v 1.996462 1.246355 -3.879344 148 | v 1.996462 1.246355 3.879344 149 | v 2.353512 0.889306 -3.879344 150 | v 2.353512 0.889306 3.879344 151 | v 2.353512 -0.372865 -3.879344 152 | v 2.353512 -0.372865 3.879344 153 | v 2.587379 -0.372865 -3.879344 154 | v 2.587379 -0.372865 3.879344 155 | v 2.587379 -0.822747 -3.879344 156 | v 2.587379 -0.822747 3.879344 157 | v 2.353512 -0.822747 -3.879344 158 | v 2.353512 -0.822747 3.879344 159 | v 1.834005 0.462631 -3.879344 160 | v 1.834005 0.462631 3.879344 161 | v 1.423398 -0.397858 -3.879344 162 | v 1.423398 -0.397858 3.879344 163 | v 1.834005 -0.397858 -3.879344 164 | v 1.834005 -0.397858 3.879344 165 | usemtl (null) 166 | s off 167 | f 5 7 6 168 | f 5 13 7 169 | f 13 8 7 170 | f 13 9 8 171 | f 5 14 13 172 | f 15 9 13 173 | f 4 14 5 174 | f 15 10 9 175 | f 15 11 10 176 | f 4 15 14 177 | f 4 12 15 178 | f 12 11 15 179 | f 4 3 12 180 | f 3 1 12 181 | f 2 1 3 182 | f 20 16 21 183 | f 20 23 16 184 | f 23 22 16 185 | f 22 17 16 186 | f 19 23 20 187 | f 19 24 23 188 | f 25 17 22 189 | f 19 25 24 190 | f 19 17 25 191 | f 19 18 17 192 | f 30 32 31 193 | f 30 38 32 194 | f 38 33 32 195 | f 38 34 33 196 | f 30 39 38 197 | f 40 34 38 198 | f 29 39 30 199 | f 40 35 34 200 | f 40 36 35 201 | f 29 40 39 202 | f 29 37 40 203 | f 37 36 40 204 | f 29 28 37 205 | f 28 26 37 206 | f 27 26 28 207 | f 47 45 46 208 | f 53 45 47 209 | f 48 53 47 210 | f 49 53 48 211 | f 54 45 53 212 | f 49 55 53 213 | f 54 44 45 214 | f 50 55 49 215 | f 51 55 50 216 | f 55 44 54 217 | f 52 44 55 218 | f 51 52 55 219 | f 43 44 52 220 | f 41 43 52 221 | f 41 42 43 222 | f 56 60 61 223 | f 63 60 56 224 | f 62 63 56 225 | f 57 62 56 226 | f 63 59 60 227 | f 64 59 63 228 | f 57 65 62 229 | f 65 59 64 230 | f 57 59 65 231 | f 58 59 57 232 | f 72 70 71 233 | f 78 70 72 234 | f 73 78 72 235 | f 74 78 73 236 | f 79 70 78 237 | f 74 80 78 238 | f 79 69 70 239 | f 75 80 74 240 | f 76 80 75 241 | f 80 69 79 242 | f 77 69 80 243 | f 76 77 80 244 | f 68 69 77 245 | f 66 68 77 246 | f 66 67 68 247 | s 1 248 | f 160 156 155 249 | f 160 155 159 250 | f 158 160 159 251 | f 158 159 157 252 | f 156 158 157 253 | f 156 157 155 254 | f 154 132 131 255 | f 154 131 153 256 | f 152 154 153 257 | f 152 153 151 258 | f 150 152 151 259 | f 150 151 149 260 | f 148 150 149 261 | f 148 149 147 262 | f 146 148 147 263 | f 146 147 145 264 | f 144 146 145 265 | f 144 145 143 266 | f 142 144 143 267 | f 142 143 141 268 | f 140 142 141 269 | f 140 141 139 270 | f 138 140 139 271 | f 138 139 137 272 | f 136 138 137 273 | f 136 137 135 274 | f 134 136 135 275 | f 134 135 133 276 | f 132 134 133 277 | f 132 133 131 278 | f 130 124 123 279 | f 130 123 129 280 | f 128 130 129 281 | f 128 129 127 282 | f 126 128 127 283 | f 126 127 125 284 | f 124 126 125 285 | f 124 125 123 286 | f 122 112 111 287 | f 122 111 121 288 | f 120 122 121 289 | f 120 121 119 290 | f 118 120 119 291 | f 118 119 117 292 | f 116 118 117 293 | f 116 117 115 294 | f 114 116 115 295 | f 114 115 113 296 | f 112 114 113 297 | f 112 113 111 298 | f 110 106 105 299 | f 110 105 109 300 | f 108 110 109 301 | f 108 109 107 302 | f 106 108 107 303 | f 106 107 105 304 | f 104 82 81 305 | f 104 81 103 306 | f 102 104 103 307 | f 102 103 101 308 | f 100 102 101 309 | f 100 101 99 310 | f 98 100 99 311 | f 98 99 97 312 | f 96 98 97 313 | f 96 97 95 314 | f 94 96 95 315 | f 94 95 93 316 | f 92 94 93 317 | f 92 93 91 318 | f 90 92 91 319 | f 90 91 89 320 | f 88 90 89 321 | f 88 89 87 322 | f 86 88 87 323 | f 86 87 85 324 | f 84 86 85 325 | f 84 85 83 326 | f 82 84 83 327 | f 82 83 81 328 | -------------------------------------------------------------------------------- /snake.js: -------------------------------------------------------------------------------- 1 | var snake = dom3d.make_mesh([[$v(.918569,.982082,2.099515),$v(.918568,.982081,-.021245),$v(-1.027143,.982082,-.021245)], 2 | [$v(.918569,.982082,2.099515),$v(-1.027143,.982082,-.021245),$v(-1.027144,.982082,2.099515)], 3 | [$v(-1.027144,-1.005973,-.021244),$v(-1.027144,-1.005971,2.099516),$v(-1.027144,.982082,2.099515)], 4 | [$v(-1.027144,-1.005973,-.021244),$v(-1.027144,.982082,2.099515),$v(-1.027143,.982082,-.021245)], 5 | [$v(.918568,-1.005973,-.021244),$v(.918567,-1.005972,2.099516),$v(-1.027144,-1.005973,-.021244)], 6 | [$v(.918567,-1.005972,2.099516),$v(-1.027144,-1.005971,2.099516),$v(-1.027144,-1.005973,-.021244)], 7 | [$v(.918568,.982081,-.021245),$v(.918569,.982082,2.099515),$v(.918568,-1.005973,-.021244)], 8 | [$v(.918569,.982082,2.099515),$v(.918567,-1.005972,2.099516),$v(.918568,-1.005973,-.021244)], 9 | [$v(.918569,.982082,2.099515),$v(-1.027144,.982082,2.099515),$v(.918567,-1.005972,2.099516)], 10 | [$v(-1.027144,.982082,2.099515),$v(-1.027144,-1.005971,2.099516),$v(.918567,-1.005972,2.099516)], 11 | [$v(.918568,.982081,-.021245),$v(.918568,-1.005973,-.021244),$v(-1.027144,-1.005973,-.021244)], 12 | [$v(.918568,.982081,-.021245),$v(-1.027144,-1.005973,-.021244),$v(-1.027143,.982082,-.021245)], 13 | [$v(.972856,.994029,5.585581),$v(.972856,.994029,3.46482),$v(-.972856,.994029,3.46482)], 14 | [$v(.972856,.994029,5.585581),$v(-.972856,.994029,3.46482),$v(-.972856,.99403,5.585581)], 15 | [$v(-.972856,-.994025,3.464822),$v(-.972856,-.994023,5.585582),$v(-.972856,.99403,5.585581)], 16 | [$v(-.972856,-.994025,3.464822),$v(-.972856,.99403,5.585581),$v(-.972856,.994029,3.46482)], 17 | [$v(.972856,-.994025,3.464822),$v(.972855,-.994024,5.585582),$v(-.972856,-.994025,3.464822)], 18 | [$v(.972855,-.994024,5.585582),$v(-.972856,-.994023,5.585582),$v(-.972856,-.994025,3.464822)], 19 | [$v(.972856,.994029,3.46482),$v(.972856,.994029,5.585581),$v(.972856,-.994025,3.464822)], 20 | [$v(.972856,.994029,5.585581),$v(.972855,-.994024,5.585582),$v(.972856,-.994025,3.464822)], 21 | [$v(.972856,.994029,5.585581),$v(-.972856,.99403,5.585581),$v(.972855,-.994024,5.585582)], 22 | [$v(-.972856,.99403,5.585581),$v(-.972856,-.994023,5.585582),$v(.972855,-.994024,5.585582)], 23 | [$v(.972856,.994029,3.46482),$v(.972856,-.994025,3.464822),$v(-.972856,-.994025,3.464822)], 24 | [$v(.972856,.994029,3.46482),$v(-.972856,-.994025,3.464822),$v(-.972856,.994029,3.46482)], 25 | [$v(.851872,.870413,7.358609),$v(.851871,.870412,5.501587),$v(-.851871,.870413,7.358609)], 26 | [$v(.851871,.870412,5.501587),$v(-.851871,.870413,5.501587),$v(-.851871,.870413,7.358609)], 27 | [$v(-.851871,-.870405,5.501588),$v(-.851872,-.870404,7.35861),$v(-.851871,.870413,7.358609)], 28 | [$v(-.851871,-.870405,5.501588),$v(-.851871,.870413,7.358609),$v(-.851871,.870413,5.501587)], 29 | [$v(.851871,-.870405,5.501588),$v(.851871,-.870405,7.35861),$v(-.851871,-.870405,5.501588)], 30 | [$v(.851871,-.870405,7.35861),$v(-.851872,-.870404,7.35861),$v(-.851871,-.870405,5.501588)], 31 | [$v(.851871,.870412,5.501587),$v(.851872,.870413,7.358609),$v(.851871,-.870405,5.501588)], 32 | [$v(.851872,.870413,7.358609),$v(.851871,-.870405,7.35861),$v(.851871,-.870405,5.501588)], 33 | [$v(.851872,.870413,7.358609),$v(-.851871,.870413,7.358609),$v(-.851872,-.870404,7.35861)], 34 | [$v(.851872,.870413,7.358609),$v(-.851872,-.870404,7.35861),$v(.851871,-.870405,7.35861)], 35 | [$v(.851871,.870412,5.501587),$v(.851871,-.870405,5.501588),$v(-.851871,-.870405,5.501588)], 36 | [$v(.851871,.870412,5.501587),$v(-.851871,-.870405,5.501588),$v(-.851871,.870413,5.501587)], 37 | [$v(.889675,.90904,8.958823),$v(.889674,.909039,7.019393),$v(-.889674,.90904,7.019393)], 38 | [$v(.889675,.90904,8.958823),$v(-.889674,.90904,7.019393),$v(-.889674,.909041,8.958823)], 39 | [$v(-.889675,-.90903,7.019394),$v(-.889675,-.909029,8.958825),$v(-.889674,.909041,8.958823)], 40 | [$v(-.889675,-.90903,7.019394),$v(-.889674,.909041,8.958823),$v(-.889674,.90904,7.019393)], 41 | [$v(.889674,-.90903,7.019394),$v(.889674,-.90903,8.958825),$v(-.889675,-.90903,7.019394)], 42 | [$v(.889674,-.90903,8.958825),$v(-.889675,-.909029,8.958825),$v(-.889675,-.90903,7.019394)], 43 | [$v(.889674,.909039,7.019393),$v(.889675,.90904,8.958823),$v(.889674,-.90903,7.019394)], 44 | [$v(.889675,.90904,8.958823),$v(.889674,-.90903,8.958825),$v(.889674,-.90903,7.019394)], 45 | [$v(.889675,.90904,8.958823),$v(-.889674,.909041,8.958823),$v(-.889675,-.909029,8.958825)], 46 | [$v(.889675,.90904,8.958823),$v(-.889675,-.909029,8.958825),$v(.889674,-.90903,8.958825)], 47 | [$v(.889674,.909039,7.019393),$v(.889674,-.90903,7.019394),$v(-.889675,-.90903,7.019394)], 48 | [$v(.889674,.909039,7.019393),$v(-.889675,-.90903,7.019394),$v(-.889674,.90904,7.019393)], 49 | [$v(.72331,.739056,10.390221),$v(.72331,.739056,8.813455),$v(-.72331,.739057,10.390221)], 50 | [$v(.72331,.739056,8.813455),$v(-.72331,.739056,8.813455),$v(-.72331,.739057,10.390221)], 51 | [$v(-.72331,-.739044,8.813455),$v(-.72331,-.739043,10.390221),$v(-.72331,.739057,10.390221)], 52 | [$v(-.72331,-.739044,8.813455),$v(-.72331,.739057,10.390221),$v(-.72331,.739056,8.813455)], 53 | [$v(.72331,-.739044,8.813455),$v(.723309,-.739043,10.390221),$v(-.72331,-.739044,8.813455)], 54 | [$v(.723309,-.739043,10.390221),$v(-.72331,-.739043,10.390221),$v(-.72331,-.739044,8.813455)], 55 | [$v(.72331,.739056,8.813455),$v(.72331,.739056,10.390221),$v(.72331,-.739044,8.813455)], 56 | [$v(.72331,.739056,10.390221),$v(.723309,-.739043,10.390221),$v(.72331,-.739044,8.813455)], 57 | [$v(.72331,.739056,10.390221),$v(-.72331,.739057,10.390221),$v(.723309,-.739043,10.390221)], 58 | [$v(-.72331,.739057,10.390221),$v(-.72331,-.739043,10.390221),$v(.723309,-.739043,10.390221)], 59 | [$v(.72331,.739056,8.813455),$v(.72331,-.739044,8.813455),$v(-.72331,-.739044,8.813455)], 60 | [$v(.72331,.739056,8.813455),$v(-.72331,-.739044,8.813455),$v(-.72331,.739056,8.813455)], 61 | [$v(.830579,.848661,12.057287),$v(.830579,.84866,10.246682),$v(-.830579,.848661,12.057287)], 62 | [$v(.830579,.84866,10.246682),$v(-.830579,.84866,10.246682),$v(-.830579,.848661,12.057287)], 63 | [$v(-.830579,-.848647,10.246684),$v(-.830579,-.848646,12.057289),$v(-.830579,.848661,12.057287)], 64 | [$v(-.830579,-.848647,10.246684),$v(-.830579,.848661,12.057287),$v(-.830579,.84866,10.246682)], 65 | [$v(.830579,-.848647,10.246684),$v(.830578,-.848647,12.057289),$v(-.830579,-.848647,10.246684)], 66 | [$v(.830578,-.848647,12.057289),$v(-.830579,-.848646,12.057289),$v(-.830579,-.848647,10.246684)], 67 | [$v(.830579,.84866,10.246682),$v(.830579,.848661,12.057287),$v(.830579,-.848647,10.246684)], 68 | [$v(.830579,.848661,12.057287),$v(.830578,-.848647,12.057289),$v(.830579,-.848647,10.246684)], 69 | [$v(.830579,.848661,12.057287),$v(-.830579,.848661,12.057287),$v(-.830579,-.848646,12.057289)], 70 | [$v(.830579,.848661,12.057287),$v(-.830579,-.848646,12.057289),$v(.830578,-.848647,12.057289)], 71 | [$v(.830579,.84866,10.246682),$v(.830579,-.848647,10.246684),$v(-.830579,-.848647,10.246684)], 72 | [$v(.830579,.84866,10.246682),$v(-.830579,-.848647,10.246684),$v(-.830579,.84866,10.246682)], 73 | [$v(.86057,.870989,13.513883),$v(.860569,.870988,11.630155),$v(-.867675,.870989,11.630155)], 74 | [$v(.86057,.870989,13.513883),$v(-.867675,.870989,11.630155),$v(-.867675,.87099,13.513883)], 75 | [$v(-.867675,-.894865,11.630157),$v(-.867675,-.894864,13.513885),$v(-.867675,.87099,13.513883)], 76 | [$v(-.867675,-.894865,11.630157),$v(-.867675,.87099,13.513883),$v(-.867675,.870989,11.630155)], 77 | [$v(.860569,-.894865,11.630157),$v(.860569,-.894865,13.513885),$v(-.867675,-.894865,11.630157)], 78 | [$v(.860569,-.894865,13.513885),$v(-.867675,-.894864,13.513885),$v(-.867675,-.894865,11.630157)], 79 | [$v(.860569,.870988,11.630155),$v(.86057,.870989,13.513883),$v(.860569,-.894865,11.630157)], 80 | [$v(.86057,.870989,13.513883),$v(.860569,-.894865,13.513885),$v(.860569,-.894865,11.630157)], 81 | [$v(.86057,.870989,13.513883),$v(-.867675,.87099,13.513883),$v(-.867675,-.894864,13.513885)], 82 | [$v(.86057,.870989,13.513883),$v(-.867675,-.894864,13.513885),$v(.860569,-.894865,13.513885)], 83 | [$v(.860569,.870988,11.630155),$v(.860569,-.894865,11.630157),$v(-.867675,-.894865,11.630157)], 84 | [$v(.860569,.870988,11.630155),$v(-.867675,-.894865,11.630157),$v(-.867675,.870989,11.630155)], 85 | [$v(.610035,.737971,14.978752),$v(.610035,.73797,13.378822),$v(-.857837,.737971,14.978752)], 86 | [$v(.610035,.73797,13.378822),$v(-.857837,.73797,13.378822),$v(-.857837,.737971,14.978752)], 87 | [$v(-.857837,-.761845,13.378823),$v(-.857837,-.761843,14.978753),$v(-.857837,.737971,14.978752)], 88 | [$v(-.857837,-.761845,13.378823),$v(-.857837,.737971,14.978752),$v(-.857837,.73797,13.378822)], 89 | [$v(.610035,-.761845,13.378823),$v(.610034,-.761844,14.978753),$v(-.857837,-.761845,13.378823)], 90 | [$v(.610034,-.761844,14.978753),$v(-.857837,-.761843,14.978753),$v(-.857837,-.761845,13.378823)], 91 | [$v(.610035,.73797,13.378822),$v(.610035,.737971,14.978752),$v(.610035,-.761845,13.378823)], 92 | [$v(.610035,.737971,14.978752),$v(.610034,-.761844,14.978753),$v(.610035,-.761845,13.378823)], 93 | [$v(.610035,.737971,14.978752),$v(-.857837,.737971,14.978752),$v(.610034,-.761844,14.978753)], 94 | [$v(-.857837,.737971,14.978752),$v(-.857837,-.761843,14.978753),$v(.610034,-.761844,14.978753)], 95 | [$v(.610035,.73797,13.378822),$v(.610035,-.761845,13.378823),$v(-.857837,-.761845,13.378823)], 96 | [$v(.610035,.73797,13.378822),$v(-.857837,-.761845,13.378823),$v(-.857837,.73797,13.378822)], 97 | [$v(.800222,.861688,3.754872),$v(.800221,.861686,1.890974),$v(-.909828,.861689,3.754872)], 98 | [$v(.800221,.861686,1.890974),$v(-.909828,.861687,1.890974),$v(-.909828,.861689,3.754872)], 99 | [$v(-.909828,-.885576,1.890976),$v(-.909828,-.885575,3.754873),$v(-.909828,.861689,3.754872)], 100 | [$v(-.909828,-.885576,1.890976),$v(-.909828,.861689,3.754872),$v(-.909828,.861687,1.890974)], 101 | [$v(.800221,-.885576,1.890976),$v(.800221,-.885576,3.754873),$v(-.909828,-.885576,1.890976)], 102 | [$v(.800221,-.885576,3.754873),$v(-.909828,-.885575,3.754873),$v(-.909828,-.885576,1.890976)], 103 | [$v(.800221,.861686,1.890974),$v(.800222,.861688,3.754872),$v(.800221,-.885576,1.890976)], 104 | [$v(.800222,.861688,3.754872),$v(.800221,-.885576,3.754873),$v(.800221,-.885576,1.890976)], 105 | [$v(.800222,.861688,3.754872),$v(-.909828,.861689,3.754872),$v(-.909828,-.885575,3.754873)], 106 | [$v(.800222,.861688,3.754872),$v(-.909828,-.885575,3.754873),$v(.800221,-.885576,3.754873)], 107 | [$v(.800221,.861686,1.890974),$v(.800221,-.885576,1.890976),$v(-.909828,-.885576,1.890976)], 108 | [$v(.800221,.861686,1.890974),$v(-.909828,-.885576,1.890976),$v(-.909828,.861687,1.890974)], 109 | ]); -------------------------------------------------------------------------------- /mesh/obj-loader.scm: -------------------------------------------------------------------------------- 1 | 2 | (declare (block) 3 | (standard-bindings) 4 | (extended-bindings)) 5 | 6 | (include "srfi-1.scm") 7 | (include "vectors.scm") 8 | 9 | ;;;; util 10 | 11 | (define (read-map #!optional f) 12 | (unfold eof-object? 13 | (lambda (x) (if f (f x) x)) 14 | (lambda (x) (read)) 15 | (read))) 16 | 17 | (define (enforce-length name len lst) 18 | (if (eq? (length lst) len) 19 | lst 20 | (error name "assert-length failed"))) 21 | 22 | (define (quad v1 v2 v3 v4) 23 | (list v1 v2 v3 v1 v3 v4)) 24 | 25 | (define (vec3d-list->vector . args) 26 | (let ((v (make-vector (* (length args) 3)))) 27 | (let loop ((tail args) 28 | (i 0)) 29 | (if (null? tail) 30 | v 31 | (let ((vec (car tail))) 32 | (vector-set! v (* i 3) (vec3d-x vec)) 33 | (vector-set! v (+ (* i 3) 1) (vec3d-y vec)) 34 | (vector-set! v (+ (* i 3) 2) (vec3d-z vec)) 35 | (loop (cdr tail) (+ i 1))))))) 36 | 37 | ;;;; materials 38 | 39 | (define-type material 40 | id: 7A56AB3B-C6D4-4C8C-9BB8-9845CFE1CF07 41 | constructor: really-make-material 42 | ambient 43 | diffuse 44 | specular) 45 | 46 | (define (make-material) 47 | (really-make-material #f #f #f)) 48 | 49 | (define (mtl-parse-ambient) 50 | (apply make-vec4d 51 | (append (enforce-length "ambient" 3 52 | (read-map exact->inexact)) 53 | '(1.)))) 54 | 55 | (define (mtl-parse-diffuse) 56 | (apply make-vec4d 57 | (append (enforce-length "diffuse" 3 58 | (read-map exact->inexact)) 59 | '(1.)))) 60 | 61 | (define (mtl-parse-specular) 62 | (apply make-vec4d 63 | (append (enforce-length "specular" 3 64 | (read-map exact->inexact)) 65 | '(1.)))) 66 | 67 | (define (mtl-parse-line mtls mtl-name line) 68 | (with-input-from-string line 69 | (lambda () 70 | (let* ((type (read)) 71 | (name mtl-name) 72 | (mtl (table-ref mtls name #f))) 73 | (case type 74 | ((newmtl) 75 | (let ((new-name (read))) 76 | (table-set! mtls new-name (make-material)) 77 | (set! name new-name))) 78 | ((Ka) (material-ambient-set! mtl (mtl-parse-ambient))) 79 | ((Kd) (material-diffuse-set! mtl (mtl-parse-diffuse))) 80 | ((Ks) (material-specular-set! mtl (mtl-parse-specular)))) 81 | name)))) 82 | 83 | (define (mtl-load file) 84 | (let ((file (string-append file ".mtl"))) 85 | (if (file-exists? file) 86 | (with-input-from-file file 87 | (lambda () 88 | (let ((mtls (make-table))) 89 | (let loop ((current-mat #f)) 90 | (let ((line (read-line))) 91 | (if (not (eof-object? line)) 92 | (begin 93 | (loop (mtl-parse-line mtls 94 | current-mat 95 | line)))))) 96 | mtls))) 97 | (make-table)))) 98 | 99 | ;;;; objects 100 | 101 | (define-type bounding-box 102 | id: 5F2D3F2A-BCE3-40B0-992C-F665CBA4B68F 103 | constructor: really-make-bounding-box 104 | min-x 105 | max-x 106 | min-y 107 | max-y 108 | min-z 109 | max-z) 110 | 111 | (define-type obj-chunk 112 | id: 9B813D93-5965-432C-AF69-31955C9D9506 113 | constructor: really-make-obj-chunk 114 | num-indices 115 | indices 116 | mat 117 | bounding-box) 118 | 119 | (define-type obj 120 | id: 8E600AD2-9106-405C-82DF-0D700BE0E5D9 121 | constructor: really-make-obj 122 | num-vertices 123 | vertices 124 | normals 125 | chunks 126 | bounding-box 127 | bounding-box-mesh) 128 | 129 | (define (make-bounding-box) 130 | (really-make-bounding-box 0. 0. 0. 0. 0. 0.)) 131 | 132 | (define (make-chunk mat) 133 | (really-make-obj-chunk #f '() mat (make-bounding-box))) 134 | 135 | (define (make-obj) 136 | (really-make-obj #f '() '() '() (make-bounding-box) #f)) 137 | 138 | (define (copy-obj obj) 139 | (really-make-obj 140 | (obj-num-vertices obj) 141 | (obj-vertices obj) 142 | (obj-normals obj) 143 | (obj-chunks obj) 144 | (obj-bounding-box obj) 145 | (obj-bounding-box-mesh obj))) 146 | 147 | (define (obj-parse-vertex) 148 | (enforce-length "vertex" 3 (read-map exact->inexact))) 149 | 150 | (define (obj-parse-normal) 151 | (let ((v (vec3d-unit 152 | (apply make-vec3d 153 | (enforce-length "normal" 3 154 | (read-map exact->inexact)))))) 155 | (list (vec3d-x v) (vec3d-y v) (vec3d-z v)))) 156 | 157 | (define (obj-parse-face) 158 | (enforce-length "face" 3 (read-map (lambda (n) (- n 1))))) 159 | 160 | (define (update-bounding-box box x y z) 161 | (if (< x (bounding-box-min-x box)) 162 | (bounding-box-min-x-set! box x) 163 | (if (> x (bounding-box-max-x box)) 164 | (bounding-box-max-x-set! box x))) 165 | 166 | (if (< y (bounding-box-min-y box)) 167 | (bounding-box-min-y-set! box y) 168 | (if (> y (bounding-box-max-y box)) 169 | (bounding-box-max-y-set! box y))) 170 | 171 | (if (< z (bounding-box-min-z box)) 172 | (bounding-box-min-z-set! box z) 173 | (if (> z (bounding-box-max-z box)) 174 | (bounding-box-max-z-set! box z)))) 175 | 176 | (define (lookup-vertex obj index) 177 | (let ((vertices (list->vector 178 | (reverse (obj-vertices obj))))) 179 | (list 180 | (vector-ref vertices (* index 3)) 181 | (vector-ref vertices (+ (* index 3) 1)) 182 | (vector-ref vertices (+ (* index 3) 2))))) 183 | 184 | (define (obj-parse-line obj chunk mtls line) 185 | (define (appendd lst lst2) 186 | (append (reverse lst) lst2)) 187 | 188 | (with-input-from-string line 189 | (lambda () 190 | (let ((type (read))) 191 | (case type 192 | ((v) 193 | (let ((v (obj-parse-vertex))) 194 | (apply update-bounding-box 195 | (cons (obj-bounding-box obj) v)) 196 | (obj-vertices-set! 197 | obj 198 | (appendd v (obj-vertices obj))))) 199 | ((vn) 200 | (obj-normals-set! 201 | obj 202 | (appendd (obj-parse-normal) 203 | (obj-normals obj)))) 204 | ((f) 205 | (let ((face (obj-parse-face))) 206 | (for-each (lambda (v) 207 | (apply update-bounding-box 208 | (cons (obj-chunk-bounding-box chunk) 209 | (lookup-vertex obj v)))) 210 | face) 211 | (obj-chunk-indices-set! 212 | chunk 213 | (appendd face 214 | (obj-chunk-indices chunk))))) 215 | ((usemtl) 216 | (let ((name (read))) 217 | (table-ref mtls name #f)))))))) 218 | 219 | (define (flip-and-vectorize data) 220 | (list->vector (reverse data))) 221 | 222 | (define (make-bounding-box-mesh obj avoid-c-vectors?) 223 | (define-macro (bb attr) 224 | `(,(string->symbol 225 | (string-append "bounding-box-" (symbol->string attr))) 226 | bbox)) 227 | 228 | (let* ((bbox (obj-bounding-box obj)) 229 | (data 230 | (apply vec3d-list->vector 231 | (append 232 | ;; Create counter-clockwise quads for each side of the 233 | ;; bounding box 234 | 235 | ;; min-x plane 236 | (quad (make-vec3d (bb min-x) (bb min-y) (bb min-z)) 237 | (make-vec3d (bb min-x) (bb min-y) (bb max-z)) 238 | (make-vec3d (bb min-x) (bb max-y) (bb max-z)) 239 | (make-vec3d (bb min-x) (bb max-y) (bb min-z))) 240 | 241 | ;; max-x plane 242 | (quad (make-vec3d (bb max-x) (bb min-y) (bb min-z)) 243 | (make-vec3d (bb max-x) (bb max-y) (bb min-z)) 244 | (make-vec3d (bb max-x) (bb max-y) (bb max-z)) 245 | (make-vec3d (bb max-x) (bb min-y) (bb max-z))) 246 | 247 | ;; min-z plane 248 | (quad (make-vec3d (bb min-x) (bb min-y) (bb min-z)) 249 | (make-vec3d (bb min-x) (bb max-y) (bb min-z)) 250 | (make-vec3d (bb max-x) (bb max-y) (bb min-z)) 251 | (make-vec3d (bb max-x) (bb min-y) (bb min-z))) 252 | 253 | ;; max-z plane 254 | (quad (make-vec3d (bb min-x) (bb min-y) (bb max-z)) 255 | (make-vec3d (bb max-x) (bb min-y) (bb max-z)) 256 | (make-vec3d (bb max-x) (bb max-y) (bb max-z)) 257 | (make-vec3d (bb min-x) (bb max-y) (bb max-z))) 258 | 259 | ;; min-y plane 260 | (quad (make-vec3d (bb min-x) (bb min-y) (bb min-z)) 261 | (make-vec3d (bb max-x) (bb min-y) (bb min-z)) 262 | (make-vec3d (bb max-x) (bb min-y) (bb max-z)) 263 | (make-vec3d (bb min-x) (bb min-y) (bb max-z))) 264 | 265 | ;; max-y plane 266 | (quad (make-vec3d (bb min-x) (bb max-y) (bb min-z)) 267 | (make-vec3d (bb min-x) (bb max-y) (bb max-z)) 268 | (make-vec3d (bb max-x) (bb max-y) (bb max-z)) 269 | (make-vec3d (bb max-x) (bb max-y) (bb min-z))))))) 270 | (if avoid-c-vectors? 271 | data 272 | (vector->float-array data)))) 273 | 274 | (define (obj-finalize obj avoid-c-vectors?) 275 | (if (not avoid-c-vectors?) 276 | (begin 277 | (obj-num-vertices-set! obj (length (obj-vertices obj))) 278 | (obj-vertices-set! obj (flip-and-vectorize (obj-vertices obj))) 279 | (obj-normals-set! obj (flip-and-vectorize (obj-normals obj))) 280 | (obj-vertices-set! obj 281 | (vector->float-array (obj-vertices obj))) 282 | (obj-normals-set! obj 283 | (vector->float-array (obj-normals obj))))) 284 | (obj-bounding-box-mesh-set! 285 | obj 286 | (make-bounding-box-mesh obj avoid-c-vectors?))) 287 | 288 | (define (obj-chunk-finalize chunk avoid-c-vectors?) 289 | (if (not avoid-c-vectors?) 290 | (begin 291 | (obj-chunk-num-indices-set! chunk (length (obj-chunk-indices chunk))) 292 | (obj-chunk-indices-set! chunk (flip-and-vectorize 293 | (obj-chunk-indices chunk))) 294 | (obj-chunk-indices-set! chunk 295 | (vector->unsigned-int16-array (obj-chunk-indices chunk)))))) 296 | 297 | (define (obj-load file #!optional compressed? avoid-c-vectors?) 298 | (if compressed? 299 | (let ((mesh (decompress (string-append file ".obj.gso")))) 300 | (for-each (lambda (el) 301 | (obj-chunk-finalize el avoid-c-vectors?)) 302 | (obj-chunks mesh)) 303 | (obj-finalize mesh avoid-c-vectors?) 304 | mesh) 305 | (with-input-from-file (string-append file ".obj") 306 | (lambda () 307 | (let ((mesh (make-obj)) 308 | (mtls (mtl-load file))) 309 | (let loop ((acc '()) 310 | (chunk (make-chunk #f))) 311 | (let ((line (read-line))) 312 | (if (not (eof-object? line)) 313 | (let ((res (obj-parse-line mesh chunk mtls line))) 314 | (if (material? res) 315 | (begin 316 | (obj-chunk-finalize chunk avoid-c-vectors?) 317 | (loop (cons chunk acc) 318 | (make-chunk res))) 319 | (loop acc chunk))) 320 | (begin 321 | (obj-chunk-finalize chunk avoid-c-vectors?) 322 | (obj-chunks-set! mesh (cons chunk acc)))))) 323 | (obj-finalize mesh avoid-c-vectors?) 324 | mesh))))) 325 | 326 | ;;;; compressor 327 | 328 | (define (compress filename mesh) 329 | (with-output-to-file filename 330 | (lambda () 331 | (let* ((v (object->u8vector mesh)) 332 | (len (u8vector-length v)) 333 | (len-u8 (object->u8vector len)) 334 | (boot (u8vector-length len-u8))) 335 | (write-u8 boot) 336 | (write-subu8vector len-u8 0 boot) 337 | (write-subu8vector v 0 (u8vector-length v)))))) 338 | 339 | (define (decompress filename) 340 | (with-input-from-file filename 341 | (lambda () 342 | (let* ((boot (read-u8)) 343 | (len-u8 (make-u8vector boot))) 344 | (read-subu8vector len-u8 0 boot) 345 | (let* ((len (u8vector->object len-u8)) 346 | (v (make-u8vector len))) 347 | (read-subu8vector v 0 len) 348 | (u8vector->object v)))))) 349 | -------------------------------------------------------------------------------- /mesh/moz.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.57 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib moz.mtl 4 | o Text_Mesh 5 | v 1.115643 -0.006326 0.750000 6 | v 1.115643 -0.224918 0.750000 7 | v 0.975744 -0.224918 0.750000 8 | v 0.975744 0.335137 0.750000 9 | v 1.082969 0.440521 0.750000 10 | v 1.373811 0.440521 0.750000 11 | v 1.373811 -0.224918 0.750000 12 | v 1.234373 -0.224918 0.750000 13 | v 1.234373 -0.006326 0.750000 14 | v 1.115643 0.120227 0.750000 15 | v 1.234373 0.120227 0.750000 16 | v 1.234373 0.313968 0.750000 17 | v 1.115643 0.313968 0.750000 18 | v 0.915919 -0.224918 0.750000 19 | v 0.581359 -0.224918 0.750000 20 | v 0.581359 0.440521 0.750000 21 | v 0.720797 0.440521 0.750000 22 | v 0.720797 -0.098825 0.750000 23 | v 0.915919 -0.098825 0.750000 24 | v 0.521533 -0.224918 0.750000 25 | v 0.186973 -0.224918 0.750000 26 | v 0.186973 0.440521 0.750000 27 | v 0.326411 0.440521 0.750000 28 | v 0.326411 -0.098825 0.750000 29 | v 0.521533 -0.098825 0.750000 30 | v 0.081128 -0.098825 0.750000 31 | v 0.127148 -0.098825 0.750000 32 | v 0.127148 -0.224918 0.750000 33 | v -0.104329 -0.224918 0.750000 34 | v -0.104329 -0.098825 0.750000 35 | v -0.058310 -0.098825 0.750000 36 | v -0.058310 0.314428 0.750000 37 | v -0.104329 0.314428 0.750000 38 | v -0.104329 0.440521 0.750000 39 | v 0.127148 0.440521 0.750000 40 | v 0.127148 0.314428 0.750000 41 | v 0.081128 0.314428 0.750000 42 | v -0.171518 -0.224918 0.750000 43 | v -0.527707 -0.224918 0.750000 44 | v -0.527707 -0.114472 0.750000 45 | v -0.326603 0.313968 0.750000 46 | v -0.513901 0.313968 0.750000 47 | v -0.513901 0.440521 0.750000 48 | v -0.206032 0.440521 0.750000 49 | v -0.164615 0.335137 0.750000 50 | v -0.363418 -0.098825 0.750000 51 | v -0.171518 -0.098825 0.750000 52 | v -0.990662 -0.224918 0.750000 53 | v -0.990662 0.440521 0.750000 54 | v -0.588913 0.440521 0.750000 55 | v -0.588913 -0.224918 0.750000 56 | v -0.850763 0.313968 0.750000 57 | v -0.850763 -0.098825 0.750000 58 | v -0.728352 -0.098825 0.750000 59 | v -0.728352 0.313968 0.750000 60 | v -1.312337 0.109182 0.750000 61 | v -1.220298 0.440521 0.750000 62 | v -1.059231 0.440521 0.750000 63 | v -1.059231 -0.224918 0.750000 64 | v -1.188085 -0.224918 0.750000 65 | v -1.188085 0.189256 0.750000 66 | v -1.291628 -0.224918 0.750000 67 | v -1.333045 -0.224918 0.750000 68 | v -1.436589 0.189256 0.750000 69 | v -1.436589 -0.224918 0.750000 70 | v -1.565443 -0.224918 0.750000 71 | v -1.565443 0.440521 0.750000 72 | v -1.404376 0.440521 0.750000 73 | v 1.115643 -0.006326 -0.750000 74 | v 1.115643 -0.224918 -0.750000 75 | v 0.975744 -0.224918 -0.750000 76 | v 0.975744 0.335137 -0.750000 77 | v 1.082969 0.440521 -0.750000 78 | v 1.373811 0.440521 -0.750000 79 | v 1.373811 -0.224918 -0.750000 80 | v 1.234373 -0.224918 -0.750000 81 | v 1.234373 -0.006326 -0.750000 82 | v 1.115643 0.120227 -0.750000 83 | v 1.234373 0.120227 -0.750000 84 | v 1.234373 0.313968 -0.750000 85 | v 1.115643 0.313968 -0.750000 86 | v 0.915919 -0.224918 -0.750000 87 | v 0.581359 -0.224918 -0.750000 88 | v 0.581359 0.440521 -0.750000 89 | v 0.720797 0.440521 -0.750000 90 | v 0.720797 -0.098825 -0.750000 91 | v 0.915919 -0.098825 -0.750000 92 | v 0.521533 -0.224918 -0.750000 93 | v 0.186973 -0.224918 -0.750000 94 | v 0.186973 0.440521 -0.750000 95 | v 0.326411 0.440521 -0.750000 96 | v 0.326411 -0.098825 -0.750000 97 | v 0.521533 -0.098825 -0.750000 98 | v 0.081128 -0.098825 -0.750000 99 | v 0.127148 -0.098825 -0.750000 100 | v 0.127148 -0.224918 -0.750000 101 | v -0.104329 -0.224918 -0.750000 102 | v -0.104329 -0.098825 -0.750000 103 | v -0.058310 -0.098825 -0.750000 104 | v -0.058310 0.314428 -0.750000 105 | v -0.104329 0.314428 -0.750000 106 | v -0.104329 0.440521 -0.750000 107 | v 0.127148 0.440521 -0.750000 108 | v 0.127148 0.314428 -0.750000 109 | v 0.081128 0.314428 -0.750000 110 | v -0.171518 -0.224918 -0.750000 111 | v -0.527707 -0.224918 -0.750000 112 | v -0.527707 -0.114472 -0.750000 113 | v -0.326603 0.313968 -0.750000 114 | v -0.513901 0.313968 -0.750000 115 | v -0.513901 0.440521 -0.750000 116 | v -0.206032 0.440521 -0.750000 117 | v -0.164615 0.335137 -0.750000 118 | v -0.363418 -0.098825 -0.750000 119 | v -0.171518 -0.098825 -0.750000 120 | v -0.990662 -0.224918 -0.750000 121 | v -0.990662 0.440521 -0.750000 122 | v -0.588913 0.440521 -0.750000 123 | v -0.588913 -0.224918 -0.750000 124 | v -0.850763 0.313968 -0.750000 125 | v -0.850763 -0.098825 -0.750000 126 | v -0.728352 -0.098825 -0.750000 127 | v -0.728352 0.313968 -0.750000 128 | v -1.312337 0.109182 -0.750000 129 | v -1.220298 0.440521 -0.750000 130 | v -1.059231 0.440521 -0.750000 131 | v -1.059231 -0.224918 -0.750000 132 | v -1.188085 -0.224918 -0.750000 133 | v -1.188085 0.189256 -0.750000 134 | v -1.291628 -0.224918 -0.750000 135 | v -1.333045 -0.224918 -0.750000 136 | v -1.436589 0.189256 -0.750000 137 | v -1.436589 -0.224918 -0.750000 138 | v -1.565443 -0.224918 -0.750000 139 | v -1.565443 0.440521 -0.750000 140 | v -1.404376 0.440521 -0.750000 141 | v -1.312337 0.109182 -0.750000 142 | v -1.312337 0.109182 0.750000 143 | v -1.220298 0.440521 -0.750000 144 | v -1.220298 0.440521 0.750000 145 | v -1.059231 0.440521 -0.750000 146 | v -1.059231 0.440521 0.750000 147 | v -1.059231 -0.224918 -0.750000 148 | v -1.059231 -0.224918 0.750000 149 | v -1.188085 -0.224918 -0.750000 150 | v -1.188085 -0.224918 0.750000 151 | v -1.188085 0.189256 -0.750000 152 | v -1.188085 0.189256 0.750000 153 | v -1.291628 -0.224918 -0.750000 154 | v -1.291628 -0.224918 0.750000 155 | v -1.333045 -0.224918 -0.750000 156 | v -1.333045 -0.224918 0.750000 157 | v -1.436589 0.189256 -0.750000 158 | v -1.436589 0.189256 0.750000 159 | v -1.436589 -0.224918 -0.750000 160 | v -1.436589 -0.224918 0.750000 161 | v -1.565443 -0.224918 -0.750000 162 | v -1.565443 -0.224918 0.750000 163 | v -1.565443 0.440521 -0.750000 164 | v -1.565443 0.440521 0.750000 165 | v -1.404376 0.440521 -0.750000 166 | v -1.404376 0.440521 0.750000 167 | v -0.990662 -0.224918 -0.750000 168 | v -0.990662 -0.224918 0.750000 169 | v -0.990662 0.440521 -0.750000 170 | v -0.990662 0.440521 0.750000 171 | v -0.588913 0.440521 -0.750000 172 | v -0.588913 0.440521 0.750000 173 | v -0.588913 -0.224918 -0.750000 174 | v -0.588913 -0.224918 0.750000 175 | v -0.850763 0.313968 -0.750000 176 | v -0.850763 0.313968 0.750000 177 | v -0.850763 -0.098825 -0.750000 178 | v -0.850763 -0.098825 0.750000 179 | v -0.728352 -0.098825 -0.750000 180 | v -0.728352 -0.098825 0.750000 181 | v -0.728352 0.313968 -0.750000 182 | v -0.728352 0.313968 0.750000 183 | v -0.171518 -0.224918 -0.750000 184 | v -0.171518 -0.224918 0.750000 185 | v -0.527707 -0.224918 -0.750000 186 | v -0.527707 -0.224918 0.750000 187 | v -0.527707 -0.114472 -0.750000 188 | v -0.527707 -0.114472 0.750000 189 | v -0.326603 0.313968 -0.750000 190 | v -0.326603 0.313968 0.750000 191 | v -0.513901 0.313968 -0.750000 192 | v -0.513901 0.313968 0.750000 193 | v -0.513901 0.440521 -0.750000 194 | v -0.513901 0.440521 0.750000 195 | v -0.206032 0.440521 -0.750000 196 | v -0.206032 0.440521 0.750000 197 | v -0.164615 0.335137 -0.750000 198 | v -0.164615 0.335137 0.750000 199 | v -0.363418 -0.098825 -0.750000 200 | v -0.363418 -0.098825 0.750000 201 | v -0.171518 -0.098825 -0.750000 202 | v -0.171518 -0.098825 0.750000 203 | v 0.081128 -0.098825 -0.750000 204 | v 0.081128 -0.098825 0.750000 205 | v 0.127148 -0.098825 -0.750000 206 | v 0.127148 -0.098825 0.750000 207 | v 0.127148 -0.224918 -0.750000 208 | v 0.127148 -0.224918 0.750000 209 | v -0.104329 -0.224918 -0.750000 210 | v -0.104329 -0.224918 0.750000 211 | v -0.104329 -0.098825 -0.750000 212 | v -0.104329 -0.098825 0.750000 213 | v -0.058310 -0.098825 -0.750000 214 | v -0.058310 -0.098825 0.750000 215 | v -0.058310 0.314428 -0.750000 216 | v -0.058310 0.314428 0.750000 217 | v -0.104329 0.314428 -0.750000 218 | v -0.104329 0.314428 0.750000 219 | v -0.104329 0.440521 -0.750000 220 | v -0.104329 0.440521 0.750000 221 | v 0.127148 0.440521 -0.750000 222 | v 0.127148 0.440521 0.750000 223 | v 0.127148 0.314428 -0.750000 224 | v 0.127148 0.314428 0.750000 225 | v 0.081128 0.314428 -0.750000 226 | v 0.081128 0.314428 0.750000 227 | v 0.521533 -0.224918 -0.750000 228 | v 0.521533 -0.224918 0.750000 229 | v 0.186973 -0.224918 -0.750000 230 | v 0.186973 -0.224918 0.750000 231 | v 0.186973 0.440521 -0.750000 232 | v 0.186973 0.440521 0.750000 233 | v 0.326411 0.440521 -0.750000 234 | v 0.326411 0.440521 0.750000 235 | v 0.326411 -0.098825 -0.750000 236 | v 0.326411 -0.098825 0.750000 237 | v 0.521533 -0.098825 -0.750000 238 | v 0.521533 -0.098825 0.750000 239 | v 0.915919 -0.224918 -0.750000 240 | v 0.915919 -0.224918 0.750000 241 | v 0.581359 -0.224918 -0.750000 242 | v 0.581359 -0.224918 0.750000 243 | v 0.581359 0.440521 -0.750000 244 | v 0.581359 0.440521 0.750000 245 | v 0.720797 0.440521 -0.750000 246 | v 0.720797 0.440521 0.750000 247 | v 0.720797 -0.098825 -0.750000 248 | v 0.720797 -0.098825 0.750000 249 | v 0.915919 -0.098825 -0.750000 250 | v 0.915919 -0.098825 0.750000 251 | v 1.115643 -0.006326 -0.750000 252 | v 1.115643 -0.006326 0.750000 253 | v 1.115643 -0.224918 -0.750000 254 | v 1.115643 -0.224918 0.750000 255 | v 0.975744 -0.224918 -0.750000 256 | v 0.975744 -0.224918 0.750000 257 | v 0.975744 0.335137 -0.750000 258 | v 0.975744 0.335137 0.750000 259 | v 1.082969 0.440521 -0.750000 260 | v 1.082969 0.440521 0.750000 261 | v 1.373811 0.440521 -0.750000 262 | v 1.373811 0.440521 0.750000 263 | v 1.373811 -0.224918 -0.750000 264 | v 1.373811 -0.224918 0.750000 265 | v 1.234373 -0.224918 -0.750000 266 | v 1.234373 -0.224918 0.750000 267 | v 1.234373 -0.006326 -0.750000 268 | v 1.234373 -0.006326 0.750000 269 | v 1.115643 0.120227 -0.750000 270 | v 1.115643 0.120227 0.750000 271 | v 1.234373 0.120227 -0.750000 272 | v 1.234373 0.120227 0.750000 273 | v 1.234373 0.313968 -0.750000 274 | v 1.234373 0.313968 0.750000 275 | v 1.115643 0.313968 -0.750000 276 | v 1.115643 0.313968 0.750000 277 | usemtl (null) 278 | s off 279 | f 4 6 5 280 | f 4 13 6 281 | f 13 12 6 282 | f 12 7 6 283 | f 3 13 4 284 | f 3 10 13 285 | f 11 7 12 286 | f 3 1 10 287 | f 1 11 10 288 | f 1 9 11 289 | f 9 7 11 290 | f 2 1 3 291 | f 8 7 9 292 | f 15 17 16 293 | f 15 18 17 294 | f 15 19 18 295 | f 15 14 19 296 | f 21 23 22 297 | f 21 24 23 298 | f 21 25 24 299 | f 21 20 25 300 | f 33 35 34 301 | f 33 36 35 302 | f 32 36 33 303 | f 31 37 32 304 | f 37 36 32 305 | f 31 26 37 306 | f 29 31 30 307 | f 29 26 31 308 | f 29 27 26 309 | f 29 28 27 310 | f 42 44 43 311 | f 42 45 44 312 | f 42 41 45 313 | f 41 46 45 314 | f 40 46 41 315 | f 40 47 46 316 | f 40 38 47 317 | f 39 38 40 318 | f 48 52 49 319 | f 52 50 49 320 | f 52 55 50 321 | f 55 51 50 322 | f 48 53 52 323 | f 54 51 55 324 | f 48 54 53 325 | f 48 51 54 326 | f 66 68 67 327 | f 66 64 68 328 | f 64 56 68 329 | f 56 58 57 330 | f 56 61 58 331 | f 61 59 58 332 | f 66 65 64 333 | f 63 56 64 334 | f 56 62 61 335 | f 60 59 61 336 | f 63 62 56 337 | f 74 72 73 338 | f 81 72 74 339 | f 80 81 74 340 | f 75 80 74 341 | f 81 71 72 342 | f 78 71 81 343 | f 75 79 80 344 | f 69 71 78 345 | f 79 69 78 346 | f 77 69 79 347 | f 75 77 79 348 | f 70 71 69 349 | f 75 76 77 350 | f 85 83 84 351 | f 86 83 85 352 | f 87 83 86 353 | f 82 83 87 354 | f 91 89 90 355 | f 92 89 91 356 | f 93 89 92 357 | f 88 89 93 358 | f 103 101 102 359 | f 104 101 103 360 | f 104 100 101 361 | f 105 99 100 362 | f 104 105 100 363 | f 94 99 105 364 | f 99 97 98 365 | f 94 97 99 366 | f 95 97 94 367 | f 96 97 95 368 | f 112 110 111 369 | f 113 110 112 370 | f 109 110 113 371 | f 114 109 113 372 | f 114 108 109 373 | f 115 108 114 374 | f 106 108 115 375 | f 106 107 108 376 | f 120 116 117 377 | f 118 120 117 378 | f 123 120 118 379 | f 119 123 118 380 | f 121 116 120 381 | f 119 122 123 382 | f 122 116 121 383 | f 119 116 122 384 | f 136 134 135 385 | f 132 134 136 386 | f 124 132 136 387 | f 126 124 125 388 | f 129 124 126 389 | f 127 129 126 390 | f 133 134 132 391 | f 124 131 132 392 | f 130 124 129 393 | f 127 128 129 394 | f 130 131 124 395 | s 1 396 | f 272 266 265 397 | f 272 265 271 398 | f 270 272 271 399 | f 270 271 269 400 | f 268 270 269 401 | f 268 269 267 402 | f 266 268 267 403 | f 266 267 265 404 | f 264 248 247 405 | f 264 247 263 406 | f 262 264 263 407 | f 262 263 261 408 | f 260 262 261 409 | f 260 261 259 410 | f 258 260 259 411 | f 258 259 257 412 | f 256 258 257 413 | f 256 257 255 414 | f 254 256 255 415 | f 254 255 253 416 | f 252 254 253 417 | f 252 253 251 418 | f 250 252 251 419 | f 250 251 249 420 | f 248 250 249 421 | f 248 249 247 422 | f 246 236 235 423 | f 246 235 245 424 | f 244 246 245 425 | f 244 245 243 426 | f 242 244 243 427 | f 242 243 241 428 | f 240 242 241 429 | f 240 241 239 430 | f 238 240 239 431 | f 238 239 237 432 | f 236 238 237 433 | f 236 237 235 434 | f 234 224 223 435 | f 234 223 233 436 | f 232 234 233 437 | f 232 233 231 438 | f 230 232 231 439 | f 230 231 229 440 | f 228 230 229 441 | f 228 229 227 442 | f 226 228 227 443 | f 226 227 225 444 | f 224 226 225 445 | f 224 225 223 446 | f 222 200 199 447 | f 222 199 221 448 | f 220 222 221 449 | f 220 221 219 450 | f 218 220 219 451 | f 218 219 217 452 | f 216 218 217 453 | f 216 217 215 454 | f 214 216 215 455 | f 214 215 213 456 | f 212 214 213 457 | f 212 213 211 458 | f 210 212 211 459 | f 210 211 209 460 | f 208 210 209 461 | f 208 209 207 462 | f 206 208 207 463 | f 206 207 205 464 | f 204 206 205 465 | f 204 205 203 466 | f 202 204 203 467 | f 202 203 201 468 | f 200 202 201 469 | f 200 201 199 470 | f 198 180 179 471 | f 198 179 197 472 | f 196 198 197 473 | f 196 197 195 474 | f 194 196 195 475 | f 194 195 193 476 | f 192 194 193 477 | f 192 193 191 478 | f 190 192 191 479 | f 190 191 189 480 | f 188 190 189 481 | f 188 189 187 482 | f 186 188 187 483 | f 186 187 185 484 | f 184 186 185 485 | f 184 185 183 486 | f 182 184 183 487 | f 182 183 181 488 | f 180 182 181 489 | f 180 181 179 490 | f 178 172 171 491 | f 178 171 177 492 | f 176 178 177 493 | f 176 177 175 494 | f 174 176 175 495 | f 174 175 173 496 | f 172 174 173 497 | f 172 173 171 498 | f 170 164 163 499 | f 170 163 169 500 | f 168 170 169 501 | f 168 169 167 502 | f 166 168 167 503 | f 166 167 165 504 | f 164 166 165 505 | f 164 165 163 506 | f 162 138 137 507 | f 162 137 161 508 | f 160 162 161 509 | f 160 161 159 510 | f 158 160 159 511 | f 158 159 157 512 | f 156 158 157 513 | f 156 157 155 514 | f 154 156 155 515 | f 154 155 153 516 | f 152 154 153 517 | f 152 153 151 518 | f 150 152 151 519 | f 150 151 149 520 | f 148 150 149 521 | f 148 149 147 522 | f 146 148 147 523 | f 146 147 145 524 | f 144 146 145 525 | f 144 145 143 526 | f 142 144 143 527 | f 142 143 141 528 | f 140 142 141 529 | f 140 141 139 530 | f 138 140 139 531 | f 138 139 137 532 | -------------------------------------------------------------------------------- /mesh404.js: -------------------------------------------------------------------------------- 1 | var mesh404 = dom3d.make_mesh([[$v(.912817,-.369294,3.879344),$v(1.996462,1.246355,3.879344),$v(1.782233,1.246355,3.879344)], 2 | [$v(.912817,-.369294,3.879344),$v(1.834005,.462631,3.879344),$v(1.996462,1.246355,3.879344)], 3 | [$v(1.834005,.462631,3.879344),$v(2.353512,.889306,3.879344),$v(1.996462,1.246355,3.879344)], 4 | [$v(1.834005,.462631,3.879344),$v(2.353512,-.372865,3.879344),$v(2.353512,.889306,3.879344)], 5 | [$v(.912817,-.369294,3.879344),$v(1.423398,-.397858,3.879344),$v(1.834005,.462631,3.879344)], 6 | [$v(1.834005,-.397858,3.879344),$v(2.353512,-.372865,3.879344),$v(1.834005,.462631,3.879344)], 7 | [$v(1.214524,-.847741,3.879344),$v(1.423398,-.397858,3.879344),$v(.912817,-.369294,3.879344)], 8 | [$v(1.834005,-.397858,3.879344),$v(2.587379,-.372865,3.879344),$v(2.353512,-.372865,3.879344)], 9 | [$v(1.834005,-.397858,3.879344),$v(2.587379,-.822747,3.879344),$v(2.587379,-.372865,3.879344)], 10 | [$v(1.214524,-.847741,3.879344),$v(1.834005,-.397858,3.879344),$v(1.423398,-.397858,3.879344)], 11 | [$v(1.214524,-.847741,3.879344),$v(2.353512,-.822747,3.879344),$v(1.834005,-.397858,3.879344)], 12 | [$v(2.353512,-.822747,3.879344),$v(2.587379,-.822747,3.879344),$v(1.834005,-.397858,3.879344)], 13 | [$v(1.214524,-.847741,3.879344),$v(1.834005,-.847741,3.879344),$v(2.353512,-.822747,3.879344)], 14 | [$v(1.834005,-.847741,3.879344),$v(2.353512,-1.335113,3.879344),$v(2.353512,-.822747,3.879344)], 15 | [$v(1.834005,-1.335113,3.879344),$v(2.353512,-1.335113,3.879344),$v(1.834005,-.847741,3.879344)], 16 | [$v(-.822444,.891091,3.879344),$v(.707513,1.246355,3.879344),$v(-.436831,1.246355,3.879344)], 17 | [$v(-.822444,.891091,3.879344),$v(-.279729,.755412,3.879344),$v(.707513,1.246355,3.879344)], 18 | [$v(-.279729,.755412,3.879344),$v(.166583,.755412,3.879344),$v(.707513,1.246355,3.879344)], 19 | [$v(.166583,.755412,3.879344),$v(.707513,-.979849,3.879344),$v(.707513,1.246355,3.879344)], 20 | [$v(-.822444,-1.335113,3.879344),$v(-.279729,.755412,3.879344),$v(-.822444,.891091,3.879344)], 21 | [$v(-.822444,-1.335113,3.879344),$v(-.279729,-.845955,3.879344),$v(-.279729,.755412,3.879344)], 22 | [$v(.166583,-.845955,3.879344),$v(.707513,-.979849,3.879344),$v(.166583,.755412,3.879344)], 23 | [$v(-.822444,-1.335113,3.879344),$v(.166583,-.845955,3.879344),$v(-.279729,-.845955,3.879344)], 24 | [$v(-.822444,-1.335113,3.879344),$v(.707513,-.979849,3.879344),$v(.166583,-.845955,3.879344)], 25 | [$v(-.822444,-1.335113,3.879344),$v(.323685,-1.335113,3.879344),$v(.707513,-.979849,3.879344)], 26 | [$v(-2.688028,-.369294,3.879344),$v(-1.604383,1.246355,3.879344),$v(-1.818612,1.246355,3.879344)], 27 | [$v(-2.688028,-.369294,3.879344),$v(-1.76684,.462631,3.879344),$v(-1.604383,1.246355,3.879344)], 28 | [$v(-1.76684,.462631,3.879344),$v(-1.247333,.889306,3.879344),$v(-1.604383,1.246355,3.879344)], 29 | [$v(-1.76684,.462631,3.879344),$v(-1.247333,-.372865,3.879344),$v(-1.247333,.889306,3.879344)], 30 | [$v(-2.688028,-.369294,3.879344),$v(-2.177447,-.397858,3.879344),$v(-1.76684,.462631,3.879344)], 31 | [$v(-1.76684,-.397858,3.879344),$v(-1.247333,-.372865,3.879344),$v(-1.76684,.462631,3.879344)], 32 | [$v(-2.386321,-.847741,3.879344),$v(-2.177447,-.397858,3.879344),$v(-2.688028,-.369294,3.879344)], 33 | [$v(-1.76684,-.397858,3.879344),$v(-1.013466,-.372865,3.879344),$v(-1.247333,-.372865,3.879344)], 34 | [$v(-1.76684,-.397858,3.879344),$v(-1.013466,-.822747,3.879344),$v(-1.013466,-.372865,3.879344)], 35 | [$v(-2.386321,-.847741,3.879344),$v(-1.76684,-.397858,3.879344),$v(-2.177447,-.397858,3.879344)], 36 | [$v(-2.386321,-.847741,3.879344),$v(-1.247333,-.822747,3.879344),$v(-1.76684,-.397858,3.879344)], 37 | [$v(-1.247333,-.822747,3.879344),$v(-1.013466,-.822747,3.879344),$v(-1.76684,-.397858,3.879344)], 38 | [$v(-2.386321,-.847741,3.879344),$v(-1.76684,-.847741,3.879344),$v(-1.247333,-.822747,3.879344)], 39 | [$v(-1.76684,-.847741,3.879344),$v(-1.247333,-1.335113,3.879344),$v(-1.247333,-.822747,3.879344)], 40 | [$v(-1.76684,-1.335113,3.879344),$v(-1.247333,-1.335113,3.879344),$v(-1.76684,-.847741,3.879344)], 41 | [$v(1.996462,1.246355,-3.879344),$v(.912817,-.369294,-3.879344),$v(1.782233,1.246355,-3.879344)], 42 | [$v(1.834005,.462631,-3.879344),$v(.912817,-.369294,-3.879344),$v(1.996462,1.246355,-3.879344)], 43 | [$v(2.353512,.889306,-3.879344),$v(1.834005,.462631,-3.879344),$v(1.996462,1.246355,-3.879344)], 44 | [$v(2.353512,-.372865,-3.879344),$v(1.834005,.462631,-3.879344),$v(2.353512,.889306,-3.879344)], 45 | [$v(1.423398,-.397858,-3.879344),$v(.912817,-.369294,-3.879344),$v(1.834005,.462631,-3.879344)], 46 | [$v(2.353512,-.372865,-3.879344),$v(1.834005,-.397858,-3.879344),$v(1.834005,.462631,-3.879344)], 47 | [$v(1.423398,-.397858,-3.879344),$v(1.214524,-.847741,-3.879344),$v(.912817,-.369294,-3.879344)], 48 | [$v(2.587379,-.372865,-3.879344),$v(1.834005,-.397858,-3.879344),$v(2.353512,-.372865,-3.879344)], 49 | [$v(2.587379,-.822747,-3.879344),$v(1.834005,-.397858,-3.879344),$v(2.587379,-.372865,-3.879344)], 50 | [$v(1.834005,-.397858,-3.879344),$v(1.214524,-.847741,-3.879344),$v(1.423398,-.397858,-3.879344)], 51 | [$v(2.353512,-.822747,-3.879344),$v(1.214524,-.847741,-3.879344),$v(1.834005,-.397858,-3.879344)], 52 | [$v(2.587379,-.822747,-3.879344),$v(2.353512,-.822747,-3.879344),$v(1.834005,-.397858,-3.879344)], 53 | [$v(1.834005,-.847741,-3.879344),$v(1.214524,-.847741,-3.879344),$v(2.353512,-.822747,-3.879344)], 54 | [$v(2.353512,-1.335113,-3.879344),$v(1.834005,-.847741,-3.879344),$v(2.353512,-.822747,-3.879344)], 55 | [$v(2.353512,-1.335113,-3.879344),$v(1.834005,-1.335113,-3.879344),$v(1.834005,-.847741,-3.879344)], 56 | [$v(.707513,1.246355,-3.879344),$v(-.822444,.891091,-3.879344),$v(-.436831,1.246355,-3.879344)], 57 | [$v(-.279729,.755412,-3.879344),$v(-.822444,.891091,-3.879344),$v(.707513,1.246355,-3.879344)], 58 | [$v(.166583,.755412,-3.879344),$v(-.279729,.755412,-3.879344),$v(.707513,1.246355,-3.879344)], 59 | [$v(.707513,-.979849,-3.879344),$v(.166583,.755412,-3.879344),$v(.707513,1.246355,-3.879344)], 60 | [$v(-.279729,.755412,-3.879344),$v(-.822444,-1.335113,-3.879344),$v(-.822444,.891091,-3.879344)], 61 | [$v(-.279729,-.845955,-3.879344),$v(-.822444,-1.335113,-3.879344),$v(-.279729,.755412,-3.879344)], 62 | [$v(.707513,-.979849,-3.879344),$v(.166583,-.845955,-3.879344),$v(.166583,.755412,-3.879344)], 63 | [$v(.166583,-.845955,-3.879344),$v(-.822444,-1.335113,-3.879344),$v(-.279729,-.845955,-3.879344)], 64 | [$v(.707513,-.979849,-3.879344),$v(-.822444,-1.335113,-3.879344),$v(.166583,-.845955,-3.879344)], 65 | [$v(.323685,-1.335113,-3.879344),$v(-.822444,-1.335113,-3.879344),$v(.707513,-.979849,-3.879344)], 66 | [$v(-1.604383,1.246355,-3.879344),$v(-2.688028,-.369294,-3.879344),$v(-1.818612,1.246355,-3.879344)], 67 | [$v(-1.76684,.462631,-3.879344),$v(-2.688028,-.369294,-3.879344),$v(-1.604383,1.246355,-3.879344)], 68 | [$v(-1.247333,.889306,-3.879344),$v(-1.76684,.462631,-3.879344),$v(-1.604383,1.246355,-3.879344)], 69 | [$v(-1.247333,-.372865,-3.879344),$v(-1.76684,.462631,-3.879344),$v(-1.247333,.889306,-3.879344)], 70 | [$v(-2.177447,-.397858,-3.879344),$v(-2.688028,-.369294,-3.879344),$v(-1.76684,.462631,-3.879344)], 71 | [$v(-1.247333,-.372865,-3.879344),$v(-1.76684,-.397858,-3.879344),$v(-1.76684,.462631,-3.879344)], 72 | [$v(-2.177447,-.397858,-3.879344),$v(-2.386321,-.847741,-3.879344),$v(-2.688028,-.369294,-3.879344)], 73 | [$v(-1.013466,-.372865,-3.879344),$v(-1.76684,-.397858,-3.879344),$v(-1.247333,-.372865,-3.879344)], 74 | [$v(-1.013466,-.822747,-3.879344),$v(-1.76684,-.397858,-3.879344),$v(-1.013466,-.372865,-3.879344)], 75 | [$v(-1.76684,-.397858,-3.879344),$v(-2.386321,-.847741,-3.879344),$v(-2.177447,-.397858,-3.879344)], 76 | [$v(-1.247333,-.822747,-3.879344),$v(-2.386321,-.847741,-3.879344),$v(-1.76684,-.397858,-3.879344)], 77 | [$v(-1.013466,-.822747,-3.879344),$v(-1.247333,-.822747,-3.879344),$v(-1.76684,-.397858,-3.879344)], 78 | [$v(-1.76684,-.847741,-3.879344),$v(-2.386321,-.847741,-3.879344),$v(-1.247333,-.822747,-3.879344)], 79 | [$v(-1.247333,-1.335113,-3.879344),$v(-1.76684,-.847741,-3.879344),$v(-1.247333,-.822747,-3.879344)], 80 | [$v(-1.247333,-1.335113,-3.879344),$v(-1.76684,-1.335113,-3.879344),$v(-1.76684,-.847741,-3.879344)], 81 | [$v(1.834005,-.397858,3.879344),$v(1.834005,.462631,3.879344),$v(1.834005,.462631,-3.879344)], 82 | [$v(1.834005,-.397858,3.879344),$v(1.834005,.462631,-3.879344),$v(1.834005,-.397858,-3.879344)], 83 | [$v(1.423398,-.397858,3.879344),$v(1.834005,-.397858,3.879344),$v(1.834005,-.397858,-3.879344)], 84 | [$v(1.423398,-.397858,3.879344),$v(1.834005,-.397858,-3.879344),$v(1.423398,-.397858,-3.879344)], 85 | [$v(1.834005,.462631,3.879344),$v(1.423398,-.397858,3.879344),$v(1.423398,-.397858,-3.879344)], 86 | [$v(1.834005,.462631,3.879344),$v(1.423398,-.397858,-3.879344),$v(1.834005,.462631,-3.879344)], 87 | [$v(2.353512,-.822747,3.879344),$v(2.353512,-1.335113,3.879344),$v(2.353512,-1.335113,-3.879344)], 88 | [$v(2.353512,-.822747,3.879344),$v(2.353512,-1.335113,-3.879344),$v(2.353512,-.822747,-3.879344)], 89 | [$v(2.587379,-.822747,3.879344),$v(2.353512,-.822747,3.879344),$v(2.353512,-.822747,-3.879344)], 90 | [$v(2.587379,-.822747,3.879344),$v(2.353512,-.822747,-3.879344),$v(2.587379,-.822747,-3.879344)], 91 | [$v(2.587379,-.372865,3.879344),$v(2.587379,-.822747,3.879344),$v(2.587379,-.822747,-3.879344)], 92 | [$v(2.587379,-.372865,3.879344),$v(2.587379,-.822747,-3.879344),$v(2.587379,-.372865,-3.879344)], 93 | [$v(2.353512,-.372865,3.879344),$v(2.587379,-.372865,3.879344),$v(2.587379,-.372865,-3.879344)], 94 | [$v(2.353512,-.372865,3.879344),$v(2.587379,-.372865,-3.879344),$v(2.353512,-.372865,-3.879344)], 95 | [$v(2.353512,.889306,3.879344),$v(2.353512,-.372865,3.879344),$v(2.353512,-.372865,-3.879344)], 96 | [$v(2.353512,.889306,3.879344),$v(2.353512,-.372865,-3.879344),$v(2.353512,.889306,-3.879344)], 97 | [$v(1.996462,1.246355,3.879344),$v(2.353512,.889306,3.879344),$v(2.353512,.889306,-3.879344)], 98 | [$v(1.996462,1.246355,3.879344),$v(2.353512,.889306,-3.879344),$v(1.996462,1.246355,-3.879344)], 99 | [$v(1.782233,1.246355,3.879344),$v(1.996462,1.246355,3.879344),$v(1.996462,1.246355,-3.879344)], 100 | [$v(1.782233,1.246355,3.879344),$v(1.996462,1.246355,-3.879344),$v(1.782233,1.246355,-3.879344)], 101 | [$v(.912817,-.369294,3.879344),$v(1.782233,1.246355,3.879344),$v(1.782233,1.246355,-3.879344)], 102 | [$v(.912817,-.369294,3.879344),$v(1.782233,1.246355,-3.879344),$v(.912817,-.369294,-3.879344)], 103 | [$v(1.214524,-.847741,3.879344),$v(.912817,-.369294,3.879344),$v(.912817,-.369294,-3.879344)], 104 | [$v(1.214524,-.847741,3.879344),$v(.912817,-.369294,-3.879344),$v(1.214524,-.847741,-3.879344)], 105 | [$v(1.834005,-.847741,3.879344),$v(1.214524,-.847741,3.879344),$v(1.214524,-.847741,-3.879344)], 106 | [$v(1.834005,-.847741,3.879344),$v(1.214524,-.847741,-3.879344),$v(1.834005,-.847741,-3.879344)], 107 | [$v(1.834005,-1.335113,3.879344),$v(1.834005,-.847741,3.879344),$v(1.834005,-.847741,-3.879344)], 108 | [$v(1.834005,-1.335113,3.879344),$v(1.834005,-.847741,-3.879344),$v(1.834005,-1.335113,-3.879344)], 109 | [$v(2.353512,-1.335113,3.879344),$v(1.834005,-1.335113,3.879344),$v(1.834005,-1.335113,-3.879344)], 110 | [$v(2.353512,-1.335113,3.879344),$v(1.834005,-1.335113,-3.879344),$v(2.353512,-1.335113,-3.879344)], 111 | [$v(.166583,-.845955,3.879344),$v(.166583,.755412,3.879344),$v(.166583,.755412,-3.879344)], 112 | [$v(.166583,-.845955,3.879344),$v(.166583,.755412,-3.879344),$v(.166583,-.845955,-3.879344)], 113 | [$v(-.279729,-.845955,3.879344),$v(.166583,-.845955,3.879344),$v(.166583,-.845955,-3.879344)], 114 | [$v(-.279729,-.845955,3.879344),$v(.166583,-.845955,-3.879344),$v(-.279729,-.845955,-3.879344)], 115 | [$v(-.279729,.755412,3.879344),$v(-.279729,-.845955,3.879344),$v(-.279729,-.845955,-3.879344)], 116 | [$v(-.279729,.755412,3.879344),$v(-.279729,-.845955,-3.879344),$v(-.279729,.755412,-3.879344)], 117 | [$v(.166583,.755412,3.879344),$v(-.279729,.755412,3.879344),$v(-.279729,.755412,-3.879344)], 118 | [$v(.166583,.755412,3.879344),$v(-.279729,.755412,-3.879344),$v(.166583,.755412,-3.879344)], 119 | [$v(-.436831,1.246355,3.879344),$v(.707513,1.246355,3.879344),$v(.707513,1.246355,-3.879344)], 120 | [$v(-.436831,1.246355,3.879344),$v(.707513,1.246355,-3.879344),$v(-.436831,1.246355,-3.879344)], 121 | [$v(-.822444,.891091,3.879344),$v(-.436831,1.246355,3.879344),$v(-.436831,1.246355,-3.879344)], 122 | [$v(-.822444,.891091,3.879344),$v(-.436831,1.246355,-3.879344),$v(-.822444,.891091,-3.879344)], 123 | [$v(-.822444,-1.335113,3.879344),$v(-.822444,.891091,3.879344),$v(-.822444,.891091,-3.879344)], 124 | [$v(-.822444,-1.335113,3.879344),$v(-.822444,.891091,-3.879344),$v(-.822444,-1.335113,-3.879344)], 125 | [$v(.323685,-1.335113,3.879344),$v(-.822444,-1.335113,3.879344),$v(-.822444,-1.335113,-3.879344)], 126 | [$v(.323685,-1.335113,3.879344),$v(-.822444,-1.335113,-3.879344),$v(.323685,-1.335113,-3.879344)], 127 | [$v(.707513,-.979849,3.879344),$v(.323685,-1.335113,3.879344),$v(.323685,-1.335113,-3.879344)], 128 | [$v(.707513,-.979849,3.879344),$v(.323685,-1.335113,-3.879344),$v(.707513,-.979849,-3.879344)], 129 | [$v(.707513,1.246355,3.879344),$v(.707513,-.979849,3.879344),$v(.707513,-.979849,-3.879344)], 130 | [$v(.707513,1.246355,3.879344),$v(.707513,-.979849,-3.879344),$v(.707513,1.246355,-3.879344)], 131 | [$v(-1.76684,-.397858,3.879344),$v(-1.76684,.462631,3.879344),$v(-1.76684,.462631,-3.879344)], 132 | [$v(-1.76684,-.397858,3.879344),$v(-1.76684,.462631,-3.879344),$v(-1.76684,-.397858,-3.879344)], 133 | [$v(-2.177447,-.397858,3.879344),$v(-1.76684,-.397858,3.879344),$v(-1.76684,-.397858,-3.879344)], 134 | [$v(-2.177447,-.397858,3.879344),$v(-1.76684,-.397858,-3.879344),$v(-2.177447,-.397858,-3.879344)], 135 | [$v(-1.76684,.462631,3.879344),$v(-2.177447,-.397858,3.879344),$v(-2.177447,-.397858,-3.879344)], 136 | [$v(-1.76684,.462631,3.879344),$v(-2.177447,-.397858,-3.879344),$v(-1.76684,.462631,-3.879344)], 137 | [$v(-1.247333,-.822747,3.879344),$v(-1.247333,-1.335113,3.879344),$v(-1.247333,-1.335113,-3.879344)], 138 | [$v(-1.247333,-.822747,3.879344),$v(-1.247333,-1.335113,-3.879344),$v(-1.247333,-.822747,-3.879344)], 139 | [$v(-1.013466,-.822747,3.879344),$v(-1.247333,-.822747,3.879344),$v(-1.247333,-.822747,-3.879344)], 140 | [$v(-1.013466,-.822747,3.879344),$v(-1.247333,-.822747,-3.879344),$v(-1.013466,-.822747,-3.879344)], 141 | [$v(-1.013466,-.372865,3.879344),$v(-1.013466,-.822747,3.879344),$v(-1.013466,-.822747,-3.879344)], 142 | [$v(-1.013466,-.372865,3.879344),$v(-1.013466,-.822747,-3.879344),$v(-1.013466,-.372865,-3.879344)], 143 | [$v(-1.247333,-.372865,3.879344),$v(-1.013466,-.372865,3.879344),$v(-1.013466,-.372865,-3.879344)], 144 | [$v(-1.247333,-.372865,3.879344),$v(-1.013466,-.372865,-3.879344),$v(-1.247333,-.372865,-3.879344)], 145 | [$v(-1.247333,.889306,3.879344),$v(-1.247333,-.372865,3.879344),$v(-1.247333,-.372865,-3.879344)], 146 | [$v(-1.247333,.889306,3.879344),$v(-1.247333,-.372865,-3.879344),$v(-1.247333,.889306,-3.879344)], 147 | [$v(-1.604383,1.246355,3.879344),$v(-1.247333,.889306,3.879344),$v(-1.247333,.889306,-3.879344)], 148 | [$v(-1.604383,1.246355,3.879344),$v(-1.247333,.889306,-3.879344),$v(-1.604383,1.246355,-3.879344)], 149 | [$v(-1.818612,1.246355,3.879344),$v(-1.604383,1.246355,3.879344),$v(-1.604383,1.246355,-3.879344)], 150 | [$v(-1.818612,1.246355,3.879344),$v(-1.604383,1.246355,-3.879344),$v(-1.818612,1.246355,-3.879344)], 151 | [$v(-2.688028,-.369294,3.879344),$v(-1.818612,1.246355,3.879344),$v(-1.818612,1.246355,-3.879344)], 152 | [$v(-2.688028,-.369294,3.879344),$v(-1.818612,1.246355,-3.879344),$v(-2.688028,-.369294,-3.879344)], 153 | [$v(-2.386321,-.847741,3.879344),$v(-2.688028,-.369294,3.879344),$v(-2.688028,-.369294,-3.879344)], 154 | [$v(-2.386321,-.847741,3.879344),$v(-2.688028,-.369294,-3.879344),$v(-2.386321,-.847741,-3.879344)], 155 | [$v(-1.76684,-.847741,3.879344),$v(-2.386321,-.847741,3.879344),$v(-2.386321,-.847741,-3.879344)], 156 | [$v(-1.76684,-.847741,3.879344),$v(-2.386321,-.847741,-3.879344),$v(-1.76684,-.847741,-3.879344)], 157 | [$v(-1.76684,-1.335113,3.879344),$v(-1.76684,-.847741,3.879344),$v(-1.76684,-.847741,-3.879344)], 158 | [$v(-1.76684,-1.335113,3.879344),$v(-1.76684,-.847741,-3.879344),$v(-1.76684,-1.335113,-3.879344)], 159 | [$v(-1.247333,-1.335113,3.879344),$v(-1.76684,-1.335113,3.879344),$v(-1.76684,-1.335113,-3.879344)], 160 | [$v(-1.247333,-1.335113,3.879344),$v(-1.76684,-1.335113,-3.879344),$v(-1.247333,-1.335113,-3.879344)], 161 | ]); -------------------------------------------------------------------------------- /teapot.js: -------------------------------------------------------------------------------- 1 | var teapot = dom3d.make_mesh([[$v(1.038265,1.477904,-.781334),$v(1.146509,1.375757,-.341774),$v(1.145795,1.371112,.339053)], 2 | [$v(-1.812935,1.016404,.133822),$v(-2.665327,1.066015,.243296),$v(-2.89602,.949473,-.165518)], 3 | [$v(.189627,2.086384,-.033276),$v(-.092593,1.716039,.108505),$v(-.108495,1.716039,-.124407)], 4 | [$v(2.983432,1.389701,.025318),$v(3.087415,1.451756,.158798),$v(3.201323,1.448985,-.088402)], 5 | [$v(.564334,1.477904,1.255265),$v(.124774,1.375757,1.363509),$v(-.556053,1.371112,1.362795)], 6 | [$v(1.146509,1.375757,-.341774),$v(1.038265,1.477904,-.781334),$v(.851988,1.371127,-.915107)], 7 | [$v(2.899856,1.371697,-.105841),$v(2.983432,1.389701,.025318),$v(2.728657,1.42086,-.173265)], 8 | [$v(-1.132107,1.371127,-1.068988),$v(-.998334,1.477904,-1.255265),$v(-1.634846,1.46379,-.414348)], 9 | [$v(1.038265,1.477904,-.781334),$v(1.581467,-.076651,-.997183),$v(.840767,.477549,-1.618204)], 10 | [$v(2.59418,1.436849,.005263),$v(2.352182,1.262403,-.071714),$v(2.671519,1.409796,.178825)], 11 | [$v(-1.751037,-.378684,-1.319951),$v(-1.835204,.477549,-1.057767),$v(-1.214183,-.076651,-1.798467)], 12 | [$v(-3.106924,.8676,.229941),$v(-2.665327,1.066015,.243296),$v(-2.887761,1.190084,.034602)], 13 | [$v(2.591862,1.355411,-.008053),$v(2.728657,1.42086,-.173265),$v(2.59418,1.436849,.005263)], 14 | [$v(-1.793285,1.047959,-.217803),$v(-2.89602,.949473,-.165518),$v(-2.96419,1.07103,-.230559)], 15 | [$v(1.049687,1.406858,.522446),$v(-.184555,1.65166,-.214905),$v(.65361,1.421852,1.060755)], 16 | [$v(.190531,-.405568,1.959991),$v(-.579543,-.895905,1.46655),$v(.369609,-.932858,1.372947)], 17 | [$v(-.092593,1.716039,.108505),$v(.189627,2.086384,-.033276),$v(.003598,2.065033,.334311)], 18 | [$v(2.899856,1.371697,-.105841),$v(2.728657,1.42086,-.173265),$v(2.591862,1.355411,-.008053)], 19 | [$v(.849872,-.984515,.952924),$v(1.317037,-.378684,1.319951),$v(.190531,-.405568,1.959991)], 20 | [$v(1.102951,-.378684,-1.534037),$v(.735924,-.984515,-1.066872),$v(.145543,-.895905,-1.46655)], 21 | [$v(-.184555,1.65166,-.214905),$v(-.341407,1.716039,-.108505),$v(-.108495,1.716039,-.124407)], 22 | [$v(.271506,-.377431,-1.934936),$v(-.374523,.535375,-1.905289),$v(.840767,.477549,-1.618204)], 23 | [$v(1.24955,-.895905,.362543),$v(1.742991,-.405568,-.407531),$v(1.717936,-.377431,.488506)], 24 | [$v(-1.472265,1.477904,.781334),$v(-2.015467,-.076651,.997183),$v(-1.274767,.477549,1.618204)], 25 | [$v(-1.169924,-.984515,1.066872),$v(-1.536951,-.378684,1.534037),$v(-1.671449,-.917039,.453758)], 26 | [$v(.145543,-.895905,-1.46655),$v(-.624531,-.405568,-1.959991),$v(.271506,-.377431,-1.934936)], 27 | [$v(-1.536951,-.378684,1.534037),$v(-1.169924,-.984515,1.066872),$v(-.579543,-.895905,1.46655)], 28 | [$v(.564334,1.477904,1.255265),$v(.780183,-.076651,1.798467),$v(1.401204,.477549,1.057767)], 29 | [$v(-.631348,1.46379,1.417846),$v(-1.274767,.477549,1.618204),$v(-.059477,.535376,1.905289)], 30 | [$v(1.488545,-.320317,.45437),$v(2.20937,-.05957,-.341161),$v(2.295826,.062586,.309172)], 31 | [$v(3.087415,1.451756,.158798),$v(2.671519,1.409796,.178825),$v(2.706832,1.081838,-.004788)], 32 | [$v(.780183,-.076651,1.798467),$v(.564334,1.477904,1.255265),$v(-.059477,.535376,1.905289)], 33 | [$v(.849872,-.984515,.952924),$v(1.155947,-.932858,-.586609),$v(1.24955,-.895905,.362543)], 34 | [$v(-1.735161,1.189276,.20103),$v(-2.887761,1.190084,.034602),$v(-2.665327,1.066015,.243296)], 35 | [$v(.145543,-.895905,-1.46655),$v(.271506,-.377431,-1.934936),$v(1.102951,-.378684,-1.534037)], 36 | [$v(-1.163973,-1.019394,-.575307),$v(.849872,-.984515,.952924),$v(-1.169924,-.984515,1.066872)], 37 | [$v(-2.913052,.162326,.24758),$v(-3.106924,.8676,.229941),$v(-3.179237,.432705,-.043871)], 38 | [$v(2.352182,1.262403,-.071714),$v(2.59418,1.436849,.005263),$v(2.728657,1.42086,-.173265)], 39 | [$v(-2.827314,.34807,-.147573),$v(-2.89602,.949473,-.165518),$v(-2.933155,.8597,.151116)], 40 | [$v(-.579543,-.895905,1.46655),$v(.190531,-.405568,1.959991),$v(-.705506,-.377431,1.934936)], 41 | [$v(-1.472265,1.477904,.781334),$v(-1.580509,1.375757,.341773),$v(-1.579795,1.371112,-.339052)], 42 | [$v(-1.68355,-.895905,-.362543),$v(-1.163973,-1.019394,-.575307),$v(-1.671449,-.917039,.453758)], 43 | [$v(-1.274767,.477549,1.618204),$v(-1.536951,-.378684,1.534037),$v(-.705506,-.377431,1.934936)], 44 | [$v(3.201323,1.448985,-.088402),$v(2.706832,1.081838,-.004788),$v(2.728657,1.42086,-.173265)], 45 | [$v(-1.634846,1.46379,-.414348),$v(-1.835204,.477549,-1.057767),$v(-2.122289,.535376,.157523)], 46 | [$v(1.102951,-.378684,-1.534037),$v(.840767,.477549,-1.618204),$v(1.581467,-.076651,-.997183)], 47 | [$v(-.059477,.535376,1.905289),$v(.564334,1.477904,1.255265),$v(-.631348,1.46379,1.417846)], 48 | [$v(-1.671449,-.917039,.453758),$v(-2.015467,-.076651,.997183),$v(-2.227397,-.14965,-.099446)], 49 | [$v(-3.191971,.909004,-.220775),$v(-2.887761,1.190084,.034602),$v(-2.96419,1.07103,-.230559)], 50 | [$v(1.155947,-.932858,-.586609),$v(.849872,-.984515,.952924),$v(.735924,-.984515,-1.066872)], 51 | [$v(-1.00675,-.927719,-1.298209),$v(.735924,-.984515,-1.066872),$v(-1.163973,-1.019394,-.575307)], 52 | [$v(-2.122289,.535376,.157523),$v(-2.151936,-.377431,-.488506),$v(-2.227397,-.14965,-.099446)], 53 | [$v(2.671519,1.409796,.178825),$v(3.087415,1.451756,.158798),$v(2.59418,1.436849,.005263)], 54 | [$v(.189627,2.086384,-.033276),$v(-.53854,2.05658,-.273428),$v(-.490428,2.05658,.32154)], 55 | [$v(2.068943,.558803,-.138745),$v(1.482684,.178552,-.476889),$v(1.484147,.41764,.14531)], 56 | [$v(1.038265,1.477904,-.781334),$v(.840767,.477549,-1.618204),$v(.197348,1.46379,-1.417846)], 57 | [$v(2.983432,1.389701,.025318),$v(3.201323,1.448985,-.088402),$v(2.728657,1.42086,-.173265)], 58 | [$v(-1.793285,1.047959,-.217803),$v(-2.96419,1.07103,-.230559),$v(-1.720864,1.217373,-.128113)], 59 | [$v(-1.579795,1.371112,-.339052),$v(-1.634846,1.46379,-.414348),$v(-1.472265,1.477904,.781334)], 60 | [$v(.780183,-.076651,1.798467),$v(.190531,-.405568,1.959991),$v(1.317037,-.378684,1.319951)], 61 | [$v(.124774,1.375757,1.363509),$v(.564334,1.477904,1.255265),$v(.698107,1.371127,1.068988)], 62 | [$v(-.579543,-.895905,1.46655),$v(-.705506,-.377431,1.934936),$v(-1.536951,-.378684,1.534037)], 63 | [$v(-.184555,1.65166,-.214905),$v(-1.08744,1.392528,-1.011306),$v(-1.483687,1.406858,-.522446)], 64 | [$v(-.341407,1.716039,-.108505),$v(-.184555,1.65166,-.214905),$v(-1.277755,1.421852,.87061)], 65 | [$v(1.24955,-.895905,.362543),$v(1.717936,-.377431,.488506),$v(1.317037,-.378684,1.319951)], 66 | [$v(-.374523,.535375,-1.905289),$v(-.624531,-.405568,-1.959991),$v(-1.214183,-.076651,-1.798467)], 67 | [$v(-1.214183,-.076651,-1.798467),$v(-.998334,1.477904,-1.255265),$v(-.374523,.535375,-1.905289)], 68 | [$v(-.535269,1.379781,-1.289155),$v(-.184555,1.65166,-.214905),$v(.305446,1.406858,-1.266687)], 69 | [$v(2.352182,1.262403,-.071714),$v(2.068943,.558803,-.138745),$v(2.135412,.437722,.391718)], 70 | [$v(-2.015467,-.076651,.997183),$v(-1.472265,1.477904,.781334),$v(-2.122289,.535376,.157523)], 71 | [$v(.145543,-.895905,-1.46655),$v(.735924,-.984515,-1.066872),$v(-1.00675,-.927719,-1.298209)], 72 | [$v(-.092593,1.716039,.108505),$v(.003598,2.065033,.334311),$v(-.490428,2.05658,.32154)], 73 | [$v(.189627,2.086384,-.033276),$v(.047532,2.03382,-.322834),$v(-.53854,2.05658,-.273428)], 74 | [$v(-.325505,1.716039,.124407),$v(-1.277755,1.421852,.87061),$v(.65361,1.421852,1.060755)], 75 | [$v(-2.133516,-.386177,-.184471),$v(-2.607867,-.128433,-.200001),$v(-2.827314,.34807,-.147573)], 76 | [$v(1.317037,-.378684,1.319951),$v(.849872,-.984515,.952924),$v(1.24955,-.895905,.362543)], 77 | [$v(-2.913052,.162326,.24758),$v(-2.210036,-.160731,.153731),$v(-2.227397,-.14965,-.099446)], 78 | [$v(-1.536951,-.378684,1.534037),$v(-1.274767,.477549,1.618204),$v(-2.015467,-.076651,.997183)], 79 | [$v(1.24955,-.895905,.362543),$v(1.155947,-.932858,-.586609),$v(1.742991,-.405568,-.407531)], 80 | [$v(1.717936,-.377431,.488506),$v(1.688289,.535376,-.157523),$v(1.401204,.477549,1.057767)], 81 | [$v(-.631348,1.46379,1.417846),$v(-.556053,1.371112,1.362795),$v(-1.285987,1.371127,.915108)], 82 | [$v(1.145795,1.371112,.339053),$v(1.200846,1.46379,.414348),$v(1.038265,1.477904,-.781334)], 83 | [$v(-2.151936,-.377431,-.488506),$v(-2.122289,.535376,.157523),$v(-1.835204,.477549,-1.057767)], 84 | [$v(-.579543,-.895905,1.46655),$v(-1.169924,-.984515,1.066872),$v(.369609,-.932858,1.372947)], 85 | [$v(-1.163973,-1.019394,-.575307),$v(.735924,-.984515,-1.066872),$v(.849872,-.984515,.952924)], 86 | [$v(.840767,.477549,-1.618204),$v(1.102951,-.378684,-1.534037),$v(.271506,-.377431,-1.934936)], 87 | [$v(2.295826,.062586,.309172),$v(2.706832,1.081838,-.004788),$v(2.671519,1.409796,.178825)], 88 | [$v(-3.191971,.909004,-.220775),$v(-2.607867,-.128433,-.200001),$v(-3.179237,.432705,-.043871)], 89 | [$v(2.591862,1.355411,-.008053),$v(2.59418,1.436849,.005263),$v(3.087415,1.451756,.158798)], 90 | [$v(-1.00675,-.927719,-1.298209),$v(-1.751037,-.378684,-1.319951),$v(-.624531,-.405568,-1.959991)], 91 | [$v(-.998334,1.477904,-1.255265),$v(-1.214183,-.076651,-1.798467),$v(-1.835204,.477549,-1.057767)], 92 | [$v(-2.122289,.535376,.157523),$v(-2.227397,-.14965,-.099446),$v(-2.015467,-.076651,.997183)], 93 | [$v(.197348,1.46379,-1.417846),$v(.122053,1.371112,-1.362795),$v(.851988,1.371127,-.915107)], 94 | [$v(.851988,1.371127,-.915107),$v(1.038265,1.477904,-.781334),$v(.197348,1.46379,-1.417846)], 95 | [$v(2.171537,.327784,-.445156),$v(2.728657,1.42086,-.173265),$v(2.706832,1.081838,-.004788)], 96 | [$v(-2.887761,1.190084,.034602),$v(-3.191971,.909004,-.220775),$v(-3.106924,.8676,.229941)], 97 | [$v(1.072155,1.379781,-.318268),$v(-.184555,1.65166,-.214905),$v(1.049687,1.406858,.522446)], 98 | [$v(1.200846,1.46379,.414348),$v(1.401204,.477549,1.057767),$v(1.688289,.535376,-.157523)], 99 | [$v(-2.913052,.162326,.24758),$v(-2.124744,-.407039,.155765),$v(-2.210036,-.160731,.153731)], 100 | [$v(-.998334,1.477904,-1.255265),$v(-.558774,1.375757,-1.363509),$v(.122053,1.371112,-1.362795)], 101 | [$v(-1.835204,.477549,-1.057767),$v(-1.751037,-.378684,-1.319951),$v(-2.151936,-.377431,-.488506)], 102 | [$v(2.706832,1.081838,-.004788),$v(3.201323,1.448985,-.088402),$v(3.087415,1.451756,.158798)], 103 | [$v(1.688289,.535376,-.157523),$v(1.742991,-.405568,-.407531),$v(1.581467,-.076651,-.997183)], 104 | [$v(2.171537,.327784,-.445156),$v(2.352182,1.262403,-.071714),$v(2.728657,1.42086,-.173265)], 105 | [$v(-.556053,1.371112,1.362795),$v(-.631348,1.46379,1.417846),$v(.564334,1.477904,1.255265)], 106 | [$v(-.059477,.535376,1.905289),$v(.190531,-.405568,1.959991),$v(.780183,-.076651,1.798467)], 107 | [$v(-1.68355,-.895905,-.362543),$v(-1.671449,-.917039,.453758),$v(-2.151936,-.377431,-.488506)], 108 | [$v(2.20937,-.05957,-.341161),$v(1.48036,-.385338,-.280586),$v(1.482684,.178552,-.476889)], 109 | [$v(-.490428,2.05658,.32154),$v(-.325505,1.716039,.124407),$v(-.092593,1.716039,.108505)], 110 | [$v(1.200846,1.46379,.414348),$v(1.145795,1.371112,.339053),$v(.698107,1.371127,1.068988)], 111 | [$v(.698107,1.371127,1.068988),$v(.564334,1.477904,1.255265),$v(1.200846,1.46379,.414348)], 112 | [$v(.369609,-.932858,1.372947),$v(-1.169924,-.984515,1.066872),$v(.849872,-.984515,.952924)], 113 | [$v(-.184555,1.65166,-.214905),$v(1.072155,1.379781,-.318268),$v(.794306,1.392528,-.87044)], 114 | [$v(2.135412,.437722,.391718),$v(1.484147,.41764,.14531),$v(1.488545,-.320317,.45437)], 115 | [$v(-.998334,1.477904,-1.255265),$v(-1.835204,.477549,-1.057767),$v(-1.634846,1.46379,-.414348)], 116 | [$v(1.742991,-.405568,-.407531),$v(1.155947,-.932858,-.586609),$v(.735924,-.984515,-1.066872)], 117 | [$v(-2.933155,.8597,.151116),$v(-3.106924,.8676,.229941),$v(-2.827314,.34807,-.147573)], 118 | [$v(-2.015467,-.076651,.997183),$v(-1.671449,-.917039,.453758),$v(-1.536951,-.378684,1.534037)], 119 | [$v(-.558774,1.375757,-1.363509),$v(-.998334,1.477904,-1.255265),$v(-1.132107,1.371127,-1.068988)], 120 | [$v(-1.506155,1.379781,.318269),$v(-1.277755,1.421852,.87061),$v(-1.483687,1.406858,-.522446)], 121 | [$v(-1.720864,1.217373,-.128113),$v(-2.96419,1.07103,-.230559),$v(-2.887761,1.190084,.034602)], 122 | [$v(1.482684,.178552,-.476889),$v(2.171537,.327784,-.445156),$v(2.20937,-.05957,-.341161)], 123 | [$v(-.341407,1.716039,-.108505),$v(-.53854,2.05658,-.273428),$v(.047532,2.03382,-.322834)], 124 | [$v(-.624531,-.405568,-1.959991),$v(.145543,-.895905,-1.46655),$v(-1.00675,-.927719,-1.298209)], 125 | [$v(1.688289,.535376,-.157523),$v(1.717936,-.377431,.488506),$v(1.742991,-.405568,-.407531)], 126 | [$v(-.059477,.535376,1.905289),$v(-.705506,-.377431,1.934936),$v(.190531,-.405568,1.959991)], 127 | [$v(1.317037,-.378684,1.319951),$v(1.401204,.477549,1.057767),$v(.780183,-.076651,1.798467)], 128 | [$v(-2.227397,-.14965,-.099446),$v(-3.106924,.8676,.229941),$v(-2.913052,.162326,.24758)], 129 | [$v(-1.671449,-.917039,.453758),$v(-1.163973,-1.019394,-.575307),$v(-1.169924,-.984515,1.066872)], 130 | [$v(-.53854,2.05658,-.273428),$v(-.341407,1.716039,-.108505),$v(-.325505,1.716039,.124407)], 131 | [$v(1.581467,-.076651,-.997183),$v(1.038265,1.477904,-.781334),$v(1.688289,.535376,-.157523)], 132 | [$v(2.068943,.558803,-.138745),$v(1.484147,.41764,.14531),$v(2.135412,.437722,.391718)], 133 | [$v(2.706832,1.081838,-.004788),$v(2.295826,.062586,.309172),$v(2.20937,-.05957,-.341161)], 134 | [$v(-.705506,-.377431,1.934936),$v(-.059477,.535376,1.905289),$v(-1.274767,.477549,1.618204)], 135 | [$v(-1.634846,1.46379,-.414348),$v(-1.579795,1.371112,-.339052),$v(-1.132107,1.371127,-1.068988)], 136 | [$v(.564334,1.477904,1.255265),$v(1.401204,.477549,1.057767),$v(1.200846,1.46379,.414348)], 137 | [$v(2.135412,.437722,.391718),$v(2.671519,1.409796,.178825),$v(2.352182,1.262403,-.071714)], 138 | [$v(-.374523,.535375,-1.905289),$v(.271506,-.377431,-1.934936),$v(-.624531,-.405568,-1.959991)], 139 | [$v(-1.751037,-.378684,-1.319951),$v(-1.00675,-.927719,-1.298209),$v(-1.68355,-.895905,-.362543)], 140 | [$v(1.482684,.178552,-.476889),$v(2.068943,.558803,-.138745),$v(2.171537,.327784,-.445156)], 141 | [$v(-.184555,1.65166,-.214905),$v(-.535269,1.379781,-1.289155),$v(-1.08744,1.392528,-1.011306)], 142 | [$v(2.706832,1.081838,-.004788),$v(2.20937,-.05957,-.341161),$v(2.171537,.327784,-.445156)], 143 | [$v(.189627,2.086384,-.033276),$v(-.490428,2.05658,.32154),$v(.003598,2.065033,.334311)], 144 | [$v(1.401204,.477549,1.057767),$v(1.317037,-.378684,1.319951),$v(1.717936,-.377431,.488506)], 145 | [$v(-1.580509,1.375757,.341773),$v(-1.472265,1.477904,.781334),$v(-1.285987,1.371127,.915108)], 146 | [$v(.122053,1.371112,-1.362795),$v(.197348,1.46379,-1.417846),$v(-.998334,1.477904,-1.255265)], 147 | [$v(-3.179237,.432705,-.043871),$v(-2.607867,-.128433,-.200001),$v(-2.913052,.162326,.24758)], 148 | [$v(-.184555,1.65166,-.214905),$v(-.108495,1.716039,-.124407),$v(-.092593,1.716039,.108505)], 149 | [$v(-1.285987,1.371127,.915108),$v(-1.472265,1.477904,.781334),$v(-.631348,1.46379,1.417846)], 150 | [$v(1.488545,-.320317,.45437),$v(2.295826,.062586,.309172),$v(2.135412,.437722,.391718)], 151 | [$v(-2.89602,.949473,-.165518),$v(-2.827314,.34807,-.147573),$v(-3.191971,.909004,-.220775)], 152 | [$v(-1.163973,-1.019394,-.575307),$v(-1.68355,-.895905,-.362543),$v(-1.00675,-.927719,-1.298209)], 153 | [$v(.190531,-.405568,1.959991),$v(.369609,-.932858,1.372947),$v(.849872,-.984515,.952924)], 154 | [$v(.047532,2.03382,-.322834),$v(-.108495,1.716039,-.124407),$v(-.341407,1.716039,-.108505)], 155 | [$v(-1.671449,-.917039,.453758),$v(-2.227397,-.14965,-.099446),$v(-2.151936,-.377431,-.488506)], 156 | [$v(1.581467,-.076651,-.997183),$v(1.742991,-.405568,-.407531),$v(1.102951,-.378684,-1.534037)], 157 | [$v(-.325505,1.716039,.124407),$v(-.490428,2.05658,.32154),$v(-.53854,2.05658,-.273428)], 158 | [$v(-3.191971,.909004,-.220775),$v(-2.96419,1.07103,-.230559),$v(-2.89602,.949473,-.165518)], 159 | [$v(.735924,-.984515,-1.066872),$v(1.102951,-.378684,-1.534037),$v(1.742991,-.405568,-.407531)], 160 | [$v(2.671519,1.409796,.178825),$v(2.135412,.437722,.391718),$v(2.295826,.062586,.309172)], 161 | [$v(-2.933155,.8597,.151116),$v(-2.89602,.949473,-.165518),$v(-2.665327,1.066015,.243296)], 162 | [$v(-1.214183,-.076651,-1.798467),$v(-.624531,-.405568,-1.959991),$v(-1.751037,-.378684,-1.319951)], 163 | [$v(-.739446,1.406858,1.266687),$v(.65361,1.421852,1.060755),$v(-1.277755,1.421852,.87061)], 164 | [$v(-.184555,1.65166,-.214905),$v(.794306,1.392528,-.87044),$v(.305446,1.406858,-1.266687)], 165 | [$v(-1.720864,1.217373,-.128113),$v(-2.887761,1.190084,.034602),$v(-1.735161,1.189276,.20103)], 166 | [$v(-2.665327,1.066015,.243296),$v(-1.812935,1.016404,.133822),$v(-1.735161,1.189276,.20103)], 167 | [$v(-.374523,.535375,-1.905289),$v(-.998334,1.477904,-1.255265),$v(.197348,1.46379,-1.417846)], 168 | [$v(3.087415,1.451756,.158798),$v(2.983432,1.389701,.025318),$v(2.591862,1.355411,-.008053)], 169 | [$v(-3.106924,.8676,.229941),$v(-2.227397,-.14965,-.099446),$v(-2.827314,.34807,-.147573)], 170 | [$v(-2.827314,.34807,-.147573),$v(-2.227397,-.14965,-.099446),$v(-2.133516,-.386177,-.184471)], 171 | [$v(.197348,1.46379,-1.417846),$v(.840767,.477549,-1.618204),$v(-.374523,.535375,-1.905289)], 172 | [$v(2.352182,1.262403,-.071714),$v(2.171537,.327784,-.445156),$v(2.068943,.558803,-.138745)], 173 | [$v(-1.483687,1.406858,-.522446),$v(-1.277755,1.421852,.87061),$v(-.184555,1.65166,-.214905)], 174 | [$v(-2.124744,-.407039,.155765),$v(-2.913052,.162326,.24758),$v(-2.607867,-.128433,-.200001)], 175 | [$v(-2.607867,-.128433,-.200001),$v(-2.133516,-.386177,-.184471),$v(-2.124744,-.407039,.155765)], 176 | [$v(1.48036,-.385338,-.280586),$v(2.20937,-.05957,-.341161),$v(1.488545,-.320317,.45437)], 177 | [$v(.101269,1.379781,1.289155),$v(.65361,1.421852,1.060755),$v(-.739446,1.406858,1.266687)], 178 | [$v(-1.277755,1.421852,.87061),$v(-.325505,1.716039,.124407),$v(-.341407,1.716039,-.108505)], 179 | [$v(-3.191971,.909004,-.220775),$v(-2.827314,.34807,-.147573),$v(-2.607867,-.128433,-.200001)], 180 | [$v(-3.191971,.909004,-.220775),$v(-3.179237,.432705,-.043871),$v(-3.106924,.8676,.229941)], 181 | [$v(.65361,1.421852,1.060755),$v(-.092593,1.716039,.108505),$v(-.325505,1.716039,.124407)], 182 | [$v(-1.472265,1.477904,.781334),$v(-1.274767,.477549,1.618204),$v(-.631348,1.46379,1.417846)], 183 | [$v(-.108495,1.716039,-.124407),$v(.047532,2.03382,-.322834),$v(.189627,2.086384,-.033276)], 184 | [$v(-2.122289,.535376,.157523),$v(-1.472265,1.477904,.781334),$v(-1.634846,1.46379,-.414348)], 185 | [$v(-2.89602,.949473,-.165518),$v(-1.793285,1.047959,-.217803),$v(-1.812935,1.016404,.133822)], 186 | [$v(-.092593,1.716039,.108505),$v(.65361,1.421852,1.060755),$v(-.184555,1.65166,-.214905)], 187 | [$v(1.688289,.535376,-.157523),$v(1.038265,1.477904,-.781334),$v(1.200846,1.46379,.414348)], 188 | [$v(-2.665327,1.066015,.243296),$v(-3.106924,.8676,.229941),$v(-2.933155,.8597,.151116)], 189 | [$v(-1.68355,-.895905,-.362543),$v(-2.151936,-.377431,-.488506),$v(-1.751037,-.378684,-1.319951)], 190 | ]); -------------------------------------------------------------------------------- /moz.js: -------------------------------------------------------------------------------- 1 | var moz = [[$V([.975744,.335137,.75]),$V([1.373811,.440521,.75]),$V([1.082969,.440521,.75])], 2 | [$V([.975744,.335137,.75]),$V([1.115643,.313968,.75]),$V([1.373811,.440521,.75])], 3 | [$V([1.115643,.313968,.75]),$V([1.234373,.313968,.75]),$V([1.373811,.440521,.75])], 4 | [$V([1.234373,.313968,.75]),$V([1.373811,-.224918,.75]),$V([1.373811,.440521,.75])], 5 | [$V([.975744,-.224918,.75]),$V([1.115643,.313968,.75]),$V([.975744,.335137,.75])], 6 | [$V([.975744,-.224918,.75]),$V([1.115643,.120227,.75]),$V([1.115643,.313968,.75])], 7 | [$V([1.234373,.120227,.75]),$V([1.373811,-.224918,.75]),$V([1.234373,.313968,.75])], 8 | [$V([.975744,-.224918,.75]),$V([1.115643,-.006326,.75]),$V([1.115643,.120227,.75])], 9 | [$V([1.115643,-.006326,.75]),$V([1.234373,.120227,.75]),$V([1.115643,.120227,.75])], 10 | [$V([1.115643,-.006326,.75]),$V([1.234373,-.006326,.75]),$V([1.234373,.120227,.75])], 11 | [$V([1.234373,-.006326,.75]),$V([1.373811,-.224918,.75]),$V([1.234373,.120227,.75])], 12 | [$V([1.115643,-.224918,.75]),$V([1.115643,-.006326,.75]),$V([.975744,-.224918,.75])], 13 | [$V([1.234373,-.224918,.75]),$V([1.373811,-.224918,.75]),$V([1.234373,-.006326,.75])], 14 | [$V([.581359,-.224918,.75]),$V([.720797,.440521,.75]),$V([.581359,.440521,.75])], 15 | [$V([.581359,-.224918,.75]),$V([.720797,-.098825,.75]),$V([.720797,.440521,.75])], 16 | [$V([.581359,-.224918,.75]),$V([.915919,-.098825,.75]),$V([.720797,-.098825,.75])], 17 | [$V([.581359,-.224918,.75]),$V([.915919,-.224918,.75]),$V([.915919,-.098825,.75])], 18 | [$V([.186973,-.224918,.75]),$V([.326411,.440521,.75]),$V([.186973,.440521,.75])], 19 | [$V([.186973,-.224918,.75]),$V([.326411,-.098825,.75]),$V([.326411,.440521,.75])], 20 | [$V([.186973,-.224918,.75]),$V([.521533,-.098825,.75]),$V([.326411,-.098825,.75])], 21 | [$V([.186973,-.224918,.75]),$V([.521533,-.224918,.75]),$V([.521533,-.098825,.75])], 22 | [$V([-.104329,.314428,.75]),$V([.127148,.440521,.75]),$V([-.104329,.440521,.75])], 23 | [$V([-.104329,.314428,.75]),$V([.127148,.314428,.75]),$V([.127148,.440521,.75])], 24 | [$V([-.05831,.314428,.75]),$V([.127148,.314428,.75]),$V([-.104329,.314428,.75])], 25 | [$V([-.05831,-.098825,.75]),$V([.081128,.314428,.75]),$V([-.05831,.314428,.75])], 26 | [$V([.081128,.314428,.75]),$V([.127148,.314428,.75]),$V([-.05831,.314428,.75])], 27 | [$V([-.05831,-.098825,.75]),$V([.081128,-.098825,.75]),$V([.081128,.314428,.75])], 28 | [$V([-.104329,-.224918,.75]),$V([-.05831,-.098825,.75]),$V([-.104329,-.098825,.75])], 29 | [$V([-.104329,-.224918,.75]),$V([.081128,-.098825,.75]),$V([-.05831,-.098825,.75])], 30 | [$V([-.104329,-.224918,.75]),$V([.127148,-.098825,.75]),$V([.081128,-.098825,.75])], 31 | [$V([-.104329,-.224918,.75]),$V([.127148,-.224918,.75]),$V([.127148,-.098825,.75])], 32 | [$V([-.513901,.313968,.75]),$V([-.206032,.440521,.75]),$V([-.513901,.440521,.75])], 33 | [$V([-.513901,.313968,.75]),$V([-.164615,.335137,.75]),$V([-.206032,.440521,.75])], 34 | [$V([-.513901,.313968,.75]),$V([-.326603,.313968,.75]),$V([-.164615,.335137,.75])], 35 | [$V([-.326603,.313968,.75]),$V([-.363418,-.098825,.75]),$V([-.164615,.335137,.75])], 36 | [$V([-.527707,-.114472,.75]),$V([-.363418,-.098825,.75]),$V([-.326603,.313968,.75])], 37 | [$V([-.527707,-.114472,.75]),$V([-.171518,-.098825,.75]),$V([-.363418,-.098825,.75])], 38 | [$V([-.527707,-.114472,.75]),$V([-.171518,-.224918,.75]),$V([-.171518,-.098825,.75])], 39 | [$V([-.527707,-.224918,.75]),$V([-.171518,-.224918,.75]),$V([-.527707,-.114472,.75])], 40 | [$V([-.990662,-.224918,.75]),$V([-.850763,.313968,.75]),$V([-.990662,.440521,.75])], 41 | [$V([-.850763,.313968,.75]),$V([-.588913,.440521,.75]),$V([-.990662,.440521,.75])], 42 | [$V([-.850763,.313968,.75]),$V([-.728352,.313968,.75]),$V([-.588913,.440521,.75])], 43 | [$V([-.728352,.313968,.75]),$V([-.588913,-.224918,.75]),$V([-.588913,.440521,.75])], 44 | [$V([-.990662,-.224918,.75]),$V([-.850763,-.098825,.75]),$V([-.850763,.313968,.75])], 45 | [$V([-.728352,-.098825,.75]),$V([-.588913,-.224918,.75]),$V([-.728352,.313968,.75])], 46 | [$V([-.990662,-.224918,.75]),$V([-.728352,-.098825,.75]),$V([-.850763,-.098825,.75])], 47 | [$V([-.990662,-.224918,.75]),$V([-.588913,-.224918,.75]),$V([-.728352,-.098825,.75])], 48 | [$V([-1.565443,-.224918,.75]),$V([-1.404376,.440521,.75]),$V([-1.565443,.440521,.75])], 49 | [$V([-1.565443,-.224918,.75]),$V([-1.436589,.189256,.75]),$V([-1.404376,.440521,.75])], 50 | [$V([-1.436589,.189256,.75]),$V([-1.312337,.109182,.75]),$V([-1.404376,.440521,.75])], 51 | [$V([-1.312337,.109182,.75]),$V([-1.059231,.440521,.75]),$V([-1.220298,.440521,.75])], 52 | [$V([-1.312337,.109182,.75]),$V([-1.188085,.189256,.75]),$V([-1.059231,.440521,.75])], 53 | [$V([-1.188085,.189256,.75]),$V([-1.059231,-.224918,.75]),$V([-1.059231,.440521,.75])], 54 | [$V([-1.565443,-.224918,.75]),$V([-1.436589,-.224918,.75]),$V([-1.436589,.189256,.75])], 55 | [$V([-1.333045,-.224918,.75]),$V([-1.312337,.109182,.75]),$V([-1.436589,.189256,.75])], 56 | [$V([-1.312337,.109182,.75]),$V([-1.291628,-.224918,.75]),$V([-1.188085,.189256,.75])], 57 | [$V([-1.188085,-.224918,.75]),$V([-1.059231,-.224918,.75]),$V([-1.188085,.189256,.75])], 58 | [$V([-1.333045,-.224918,.75]),$V([-1.291628,-.224918,.75]),$V([-1.312337,.109182,.75])], 59 | [$V([1.373811,.440521,-.75]),$V([.975744,.335137,-.75]),$V([1.082969,.440521,-.75])], 60 | [$V([1.115643,.313968,-.75]),$V([.975744,.335137,-.75]),$V([1.373811,.440521,-.75])], 61 | [$V([1.234373,.313968,-.75]),$V([1.115643,.313968,-.75]),$V([1.373811,.440521,-.75])], 62 | [$V([1.373811,-.224918,-.75]),$V([1.234373,.313968,-.75]),$V([1.373811,.440521,-.75])], 63 | [$V([1.115643,.313968,-.75]),$V([.975744,-.224918,-.75]),$V([.975744,.335137,-.75])], 64 | [$V([1.115643,.120227,-.75]),$V([.975744,-.224918,-.75]),$V([1.115643,.313968,-.75])], 65 | [$V([1.373811,-.224918,-.75]),$V([1.234373,.120227,-.75]),$V([1.234373,.313968,-.75])], 66 | [$V([1.115643,-.006326,-.75]),$V([.975744,-.224918,-.75]),$V([1.115643,.120227,-.75])], 67 | [$V([1.234373,.120227,-.75]),$V([1.115643,-.006326,-.75]),$V([1.115643,.120227,-.75])], 68 | [$V([1.234373,-.006326,-.75]),$V([1.115643,-.006326,-.75]),$V([1.234373,.120227,-.75])], 69 | [$V([1.373811,-.224918,-.75]),$V([1.234373,-.006326,-.75]),$V([1.234373,.120227,-.75])], 70 | [$V([1.115643,-.224918,-.75]),$V([.975744,-.224918,-.75]),$V([1.115643,-.006326,-.75])], 71 | [$V([1.373811,-.224918,-.75]),$V([1.234373,-.224918,-.75]),$V([1.234373,-.006326,-.75])], 72 | [$V([.720797,.440521,-.75]),$V([.581359,-.224918,-.75]),$V([.581359,.440521,-.75])], 73 | [$V([.720797,-.098825,-.75]),$V([.581359,-.224918,-.75]),$V([.720797,.440521,-.75])], 74 | [$V([.915919,-.098825,-.75]),$V([.581359,-.224918,-.75]),$V([.720797,-.098825,-.75])], 75 | [$V([.915919,-.224918,-.75]),$V([.581359,-.224918,-.75]),$V([.915919,-.098825,-.75])], 76 | [$V([.326411,.440521,-.75]),$V([.186973,-.224918,-.75]),$V([.186973,.440521,-.75])], 77 | [$V([.326411,-.098825,-.75]),$V([.186973,-.224918,-.75]),$V([.326411,.440521,-.75])], 78 | [$V([.521533,-.098825,-.75]),$V([.186973,-.224918,-.75]),$V([.326411,-.098825,-.75])], 79 | [$V([.521533,-.224918,-.75]),$V([.186973,-.224918,-.75]),$V([.521533,-.098825,-.75])], 80 | [$V([.127148,.440521,-.75]),$V([-.104329,.314428,-.75]),$V([-.104329,.440521,-.75])], 81 | [$V([.127148,.314428,-.75]),$V([-.104329,.314428,-.75]),$V([.127148,.440521,-.75])], 82 | [$V([.127148,.314428,-.75]),$V([-.05831,.314428,-.75]),$V([-.104329,.314428,-.75])], 83 | [$V([.081128,.314428,-.75]),$V([-.05831,-.098825,-.75]),$V([-.05831,.314428,-.75])], 84 | [$V([.127148,.314428,-.75]),$V([.081128,.314428,-.75]),$V([-.05831,.314428,-.75])], 85 | [$V([.081128,-.098825,-.75]),$V([-.05831,-.098825,-.75]),$V([.081128,.314428,-.75])], 86 | [$V([-.05831,-.098825,-.75]),$V([-.104329,-.224918,-.75]),$V([-.104329,-.098825,-.75])], 87 | [$V([.081128,-.098825,-.75]),$V([-.104329,-.224918,-.75]),$V([-.05831,-.098825,-.75])], 88 | [$V([.127148,-.098825,-.75]),$V([-.104329,-.224918,-.75]),$V([.081128,-.098825,-.75])], 89 | [$V([.127148,-.224918,-.75]),$V([-.104329,-.224918,-.75]),$V([.127148,-.098825,-.75])], 90 | [$V([-.206032,.440521,-.75]),$V([-.513901,.313968,-.75]),$V([-.513901,.440521,-.75])], 91 | [$V([-.164615,.335137,-.75]),$V([-.513901,.313968,-.75]),$V([-.206032,.440521,-.75])], 92 | [$V([-.326603,.313968,-.75]),$V([-.513901,.313968,-.75]),$V([-.164615,.335137,-.75])], 93 | [$V([-.363418,-.098825,-.75]),$V([-.326603,.313968,-.75]),$V([-.164615,.335137,-.75])], 94 | [$V([-.363418,-.098825,-.75]),$V([-.527707,-.114472,-.75]),$V([-.326603,.313968,-.75])], 95 | [$V([-.171518,-.098825,-.75]),$V([-.527707,-.114472,-.75]),$V([-.363418,-.098825,-.75])], 96 | [$V([-.171518,-.224918,-.75]),$V([-.527707,-.114472,-.75]),$V([-.171518,-.098825,-.75])], 97 | [$V([-.171518,-.224918,-.75]),$V([-.527707,-.224918,-.75]),$V([-.527707,-.114472,-.75])], 98 | [$V([-.850763,.313968,-.75]),$V([-.990662,-.224918,-.75]),$V([-.990662,.440521,-.75])], 99 | [$V([-.588913,.440521,-.75]),$V([-.850763,.313968,-.75]),$V([-.990662,.440521,-.75])], 100 | [$V([-.728352,.313968,-.75]),$V([-.850763,.313968,-.75]),$V([-.588913,.440521,-.75])], 101 | [$V([-.588913,-.224918,-.75]),$V([-.728352,.313968,-.75]),$V([-.588913,.440521,-.75])], 102 | [$V([-.850763,-.098825,-.75]),$V([-.990662,-.224918,-.75]),$V([-.850763,.313968,-.75])], 103 | [$V([-.588913,-.224918,-.75]),$V([-.728352,-.098825,-.75]),$V([-.728352,.313968,-.75])], 104 | [$V([-.728352,-.098825,-.75]),$V([-.990662,-.224918,-.75]),$V([-.850763,-.098825,-.75])], 105 | [$V([-.588913,-.224918,-.75]),$V([-.990662,-.224918,-.75]),$V([-.728352,-.098825,-.75])], 106 | [$V([-1.404376,.440521,-.75]),$V([-1.565443,-.224918,-.75]),$V([-1.565443,.440521,-.75])], 107 | [$V([-1.436589,.189256,-.75]),$V([-1.565443,-.224918,-.75]),$V([-1.404376,.440521,-.75])], 108 | [$V([-1.312337,.109182,-.75]),$V([-1.436589,.189256,-.75]),$V([-1.404376,.440521,-.75])], 109 | [$V([-1.059231,.440521,-.75]),$V([-1.312337,.109182,-.75]),$V([-1.220298,.440521,-.75])], 110 | [$V([-1.188085,.189256,-.75]),$V([-1.312337,.109182,-.75]),$V([-1.059231,.440521,-.75])], 111 | [$V([-1.059231,-.224918,-.75]),$V([-1.188085,.189256,-.75]),$V([-1.059231,.440521,-.75])], 112 | [$V([-1.436589,-.224918,-.75]),$V([-1.565443,-.224918,-.75]),$V([-1.436589,.189256,-.75])], 113 | [$V([-1.312337,.109182,-.75]),$V([-1.333045,-.224918,-.75]),$V([-1.436589,.189256,-.75])], 114 | [$V([-1.291628,-.224918,-.75]),$V([-1.312337,.109182,-.75]),$V([-1.188085,.189256,-.75])], 115 | [$V([-1.059231,-.224918,-.75]),$V([-1.188085,-.224918,-.75]),$V([-1.188085,.189256,-.75])], 116 | [$V([-1.291628,-.224918,-.75]),$V([-1.333045,-.224918,-.75]),$V([-1.312337,.109182,-.75])], 117 | [$V([1.115643,.313968,.75]),$V([1.115643,.120227,.75]),$V([1.115643,.120227,-.75])], 118 | [$V([1.115643,.313968,.75]),$V([1.115643,.120227,-.75]),$V([1.115643,.313968,-.75])], 119 | [$V([1.234373,.313968,.75]),$V([1.115643,.313968,.75]),$V([1.115643,.313968,-.75])], 120 | [$V([1.234373,.313968,.75]),$V([1.115643,.313968,-.75]),$V([1.234373,.313968,-.75])], 121 | [$V([1.234373,.120227,.75]),$V([1.234373,.313968,.75]),$V([1.234373,.313968,-.75])], 122 | [$V([1.234373,.120227,.75]),$V([1.234373,.313968,-.75]),$V([1.234373,.120227,-.75])], 123 | [$V([1.115643,.120227,.75]),$V([1.234373,.120227,.75]),$V([1.234373,.120227,-.75])], 124 | [$V([1.115643,.120227,.75]),$V([1.234373,.120227,-.75]),$V([1.115643,.120227,-.75])], 125 | [$V([1.234373,-.006326,.75]),$V([1.115643,-.006326,.75]),$V([1.115643,-.006326,-.75])], 126 | [$V([1.234373,-.006326,.75]),$V([1.115643,-.006326,-.75]),$V([1.234373,-.006326,-.75])], 127 | [$V([1.234373,-.224918,.75]),$V([1.234373,-.006326,.75]),$V([1.234373,-.006326,-.75])], 128 | [$V([1.234373,-.224918,.75]),$V([1.234373,-.006326,-.75]),$V([1.234373,-.224918,-.75])], 129 | [$V([1.373811,-.224918,.75]),$V([1.234373,-.224918,.75]),$V([1.234373,-.224918,-.75])], 130 | [$V([1.373811,-.224918,.75]),$V([1.234373,-.224918,-.75]),$V([1.373811,-.224918,-.75])], 131 | [$V([1.373811,.440521,.75]),$V([1.373811,-.224918,.75]),$V([1.373811,-.224918,-.75])], 132 | [$V([1.373811,.440521,.75]),$V([1.373811,-.224918,-.75]),$V([1.373811,.440521,-.75])], 133 | [$V([1.082969,.440521,.75]),$V([1.373811,.440521,.75]),$V([1.373811,.440521,-.75])], 134 | [$V([1.082969,.440521,.75]),$V([1.373811,.440521,-.75]),$V([1.082969,.440521,-.75])], 135 | [$V([.975744,.335137,.75]),$V([1.082969,.440521,.75]),$V([1.082969,.440521,-.75])], 136 | [$V([.975744,.335137,.75]),$V([1.082969,.440521,-.75]),$V([.975744,.335137,-.75])], 137 | [$V([.975744,-.224918,.75]),$V([.975744,.335137,.75]),$V([.975744,.335137,-.75])], 138 | [$V([.975744,-.224918,.75]),$V([.975744,.335137,-.75]),$V([.975744,-.224918,-.75])], 139 | [$V([1.115643,-.224918,.75]),$V([.975744,-.224918,.75]),$V([.975744,-.224918,-.75])], 140 | [$V([1.115643,-.224918,.75]),$V([.975744,-.224918,-.75]),$V([1.115643,-.224918,-.75])], 141 | [$V([1.115643,-.006326,.75]),$V([1.115643,-.224918,.75]),$V([1.115643,-.224918,-.75])], 142 | [$V([1.115643,-.006326,.75]),$V([1.115643,-.224918,-.75]),$V([1.115643,-.006326,-.75])], 143 | [$V([.915919,-.098825,.75]),$V([.915919,-.224918,.75]),$V([.915919,-.224918,-.75])], 144 | [$V([.915919,-.098825,.75]),$V([.915919,-.224918,-.75]),$V([.915919,-.098825,-.75])], 145 | [$V([.720797,-.098825,.75]),$V([.915919,-.098825,.75]),$V([.915919,-.098825,-.75])], 146 | [$V([.720797,-.098825,.75]),$V([.915919,-.098825,-.75]),$V([.720797,-.098825,-.75])], 147 | [$V([.720797,.440521,.75]),$V([.720797,-.098825,.75]),$V([.720797,-.098825,-.75])], 148 | [$V([.720797,.440521,.75]),$V([.720797,-.098825,-.75]),$V([.720797,.440521,-.75])], 149 | [$V([.581359,.440521,.75]),$V([.720797,.440521,.75]),$V([.720797,.440521,-.75])], 150 | [$V([.581359,.440521,.75]),$V([.720797,.440521,-.75]),$V([.581359,.440521,-.75])], 151 | [$V([.581359,-.224918,.75]),$V([.581359,.440521,.75]),$V([.581359,.440521,-.75])], 152 | [$V([.581359,-.224918,.75]),$V([.581359,.440521,-.75]),$V([.581359,-.224918,-.75])], 153 | [$V([.915919,-.224918,.75]),$V([.581359,-.224918,.75]),$V([.581359,-.224918,-.75])], 154 | [$V([.915919,-.224918,.75]),$V([.581359,-.224918,-.75]),$V([.915919,-.224918,-.75])], 155 | [$V([.521533,-.098825,.75]),$V([.521533,-.224918,.75]),$V([.521533,-.224918,-.75])], 156 | [$V([.521533,-.098825,.75]),$V([.521533,-.224918,-.75]),$V([.521533,-.098825,-.75])], 157 | [$V([.326411,-.098825,.75]),$V([.521533,-.098825,.75]),$V([.521533,-.098825,-.75])], 158 | [$V([.326411,-.098825,.75]),$V([.521533,-.098825,-.75]),$V([.326411,-.098825,-.75])], 159 | [$V([.326411,.440521,.75]),$V([.326411,-.098825,.75]),$V([.326411,-.098825,-.75])], 160 | [$V([.326411,.440521,.75]),$V([.326411,-.098825,-.75]),$V([.326411,.440521,-.75])], 161 | [$V([.186973,.440521,.75]),$V([.326411,.440521,.75]),$V([.326411,.440521,-.75])], 162 | [$V([.186973,.440521,.75]),$V([.326411,.440521,-.75]),$V([.186973,.440521,-.75])], 163 | [$V([.186973,-.224918,.75]),$V([.186973,.440521,.75]),$V([.186973,.440521,-.75])], 164 | [$V([.186973,-.224918,.75]),$V([.186973,.440521,-.75]),$V([.186973,-.224918,-.75])], 165 | [$V([.521533,-.224918,.75]),$V([.186973,-.224918,.75]),$V([.186973,-.224918,-.75])], 166 | [$V([.521533,-.224918,.75]),$V([.186973,-.224918,-.75]),$V([.521533,-.224918,-.75])], 167 | [$V([.081128,.314428,.75]),$V([.081128,-.098825,.75]),$V([.081128,-.098825,-.75])], 168 | [$V([.081128,.314428,.75]),$V([.081128,-.098825,-.75]),$V([.081128,.314428,-.75])], 169 | [$V([.127148,.314428,.75]),$V([.081128,.314428,.75]),$V([.081128,.314428,-.75])], 170 | [$V([.127148,.314428,.75]),$V([.081128,.314428,-.75]),$V([.127148,.314428,-.75])], 171 | [$V([.127148,.440521,.75]),$V([.127148,.314428,.75]),$V([.127148,.314428,-.75])], 172 | [$V([.127148,.440521,.75]),$V([.127148,.314428,-.75]),$V([.127148,.440521,-.75])], 173 | [$V([-.104329,.440521,.75]),$V([.127148,.440521,.75]),$V([.127148,.440521,-.75])], 174 | [$V([-.104329,.440521,.75]),$V([.127148,.440521,-.75]),$V([-.104329,.440521,-.75])], 175 | [$V([-.104329,.314428,.75]),$V([-.104329,.440521,.75]),$V([-.104329,.440521,-.75])], 176 | [$V([-.104329,.314428,.75]),$V([-.104329,.440521,-.75]),$V([-.104329,.314428,-.75])], 177 | [$V([-.05831,.314428,.75]),$V([-.104329,.314428,.75]),$V([-.104329,.314428,-.75])], 178 | [$V([-.05831,.314428,.75]),$V([-.104329,.314428,-.75]),$V([-.05831,.314428,-.75])], 179 | [$V([-.05831,-.098825,.75]),$V([-.05831,.314428,.75]),$V([-.05831,.314428,-.75])], 180 | [$V([-.05831,-.098825,.75]),$V([-.05831,.314428,-.75]),$V([-.05831,-.098825,-.75])], 181 | [$V([-.104329,-.098825,.75]),$V([-.05831,-.098825,.75]),$V([-.05831,-.098825,-.75])], 182 | [$V([-.104329,-.098825,.75]),$V([-.05831,-.098825,-.75]),$V([-.104329,-.098825,-.75])], 183 | [$V([-.104329,-.224918,.75]),$V([-.104329,-.098825,.75]),$V([-.104329,-.098825,-.75])], 184 | [$V([-.104329,-.224918,.75]),$V([-.104329,-.098825,-.75]),$V([-.104329,-.224918,-.75])], 185 | [$V([.127148,-.224918,.75]),$V([-.104329,-.224918,.75]),$V([-.104329,-.224918,-.75])], 186 | [$V([.127148,-.224918,.75]),$V([-.104329,-.224918,-.75]),$V([.127148,-.224918,-.75])], 187 | [$V([.127148,-.098825,.75]),$V([.127148,-.224918,.75]),$V([.127148,-.224918,-.75])], 188 | [$V([.127148,-.098825,.75]),$V([.127148,-.224918,-.75]),$V([.127148,-.098825,-.75])], 189 | [$V([.081128,-.098825,.75]),$V([.127148,-.098825,.75]),$V([.127148,-.098825,-.75])], 190 | [$V([.081128,-.098825,.75]),$V([.127148,-.098825,-.75]),$V([.081128,-.098825,-.75])], 191 | [$V([-.171518,-.098825,.75]),$V([-.171518,-.224918,.75]),$V([-.171518,-.224918,-.75])], 192 | [$V([-.171518,-.098825,.75]),$V([-.171518,-.224918,-.75]),$V([-.171518,-.098825,-.75])], 193 | [$V([-.363418,-.098825,.75]),$V([-.171518,-.098825,.75]),$V([-.171518,-.098825,-.75])], 194 | [$V([-.363418,-.098825,.75]),$V([-.171518,-.098825,-.75]),$V([-.363418,-.098825,-.75])], 195 | [$V([-.164615,.335137,.75]),$V([-.363418,-.098825,.75]),$V([-.363418,-.098825,-.75])], 196 | [$V([-.164615,.335137,.75]),$V([-.363418,-.098825,-.75]),$V([-.164615,.335137,-.75])], 197 | [$V([-.206032,.440521,.75]),$V([-.164615,.335137,.75]),$V([-.164615,.335137,-.75])], 198 | [$V([-.206032,.440521,.75]),$V([-.164615,.335137,-.75]),$V([-.206032,.440521,-.75])], 199 | [$V([-.513901,.440521,.75]),$V([-.206032,.440521,.75]),$V([-.206032,.440521,-.75])], 200 | [$V([-.513901,.440521,.75]),$V([-.206032,.440521,-.75]),$V([-.513901,.440521,-.75])], 201 | [$V([-.513901,.313968,.75]),$V([-.513901,.440521,.75]),$V([-.513901,.440521,-.75])], 202 | [$V([-.513901,.313968,.75]),$V([-.513901,.440521,-.75]),$V([-.513901,.313968,-.75])], 203 | [$V([-.326603,.313968,.75]),$V([-.513901,.313968,.75]),$V([-.513901,.313968,-.75])], 204 | [$V([-.326603,.313968,.75]),$V([-.513901,.313968,-.75]),$V([-.326603,.313968,-.75])], 205 | [$V([-.527707,-.114472,.75]),$V([-.326603,.313968,.75]),$V([-.326603,.313968,-.75])], 206 | [$V([-.527707,-.114472,.75]),$V([-.326603,.313968,-.75]),$V([-.527707,-.114472,-.75])], 207 | [$V([-.527707,-.224918,.75]),$V([-.527707,-.114472,.75]),$V([-.527707,-.114472,-.75])], 208 | [$V([-.527707,-.224918,.75]),$V([-.527707,-.114472,-.75]),$V([-.527707,-.224918,-.75])], 209 | [$V([-.171518,-.224918,.75]),$V([-.527707,-.224918,.75]),$V([-.527707,-.224918,-.75])], 210 | [$V([-.171518,-.224918,.75]),$V([-.527707,-.224918,-.75]),$V([-.171518,-.224918,-.75])], 211 | [$V([-.728352,.313968,.75]),$V([-.850763,.313968,.75]),$V([-.850763,.313968,-.75])], 212 | [$V([-.728352,.313968,.75]),$V([-.850763,.313968,-.75]),$V([-.728352,.313968,-.75])], 213 | [$V([-.728352,-.098825,.75]),$V([-.728352,.313968,.75]),$V([-.728352,.313968,-.75])], 214 | [$V([-.728352,-.098825,.75]),$V([-.728352,.313968,-.75]),$V([-.728352,-.098825,-.75])], 215 | [$V([-.850763,-.098825,.75]),$V([-.728352,-.098825,.75]),$V([-.728352,-.098825,-.75])], 216 | [$V([-.850763,-.098825,.75]),$V([-.728352,-.098825,-.75]),$V([-.850763,-.098825,-.75])], 217 | [$V([-.850763,.313968,.75]),$V([-.850763,-.098825,.75]),$V([-.850763,-.098825,-.75])], 218 | [$V([-.850763,.313968,.75]),$V([-.850763,-.098825,-.75]),$V([-.850763,.313968,-.75])], 219 | [$V([-.588913,-.224918,.75]),$V([-.990662,-.224918,.75]),$V([-.990662,-.224918,-.75])], 220 | [$V([-.588913,-.224918,.75]),$V([-.990662,-.224918,-.75]),$V([-.588913,-.224918,-.75])], 221 | [$V([-.588913,.440521,.75]),$V([-.588913,-.224918,.75]),$V([-.588913,-.224918,-.75])], 222 | [$V([-.588913,.440521,.75]),$V([-.588913,-.224918,-.75]),$V([-.588913,.440521,-.75])], 223 | [$V([-.990662,.440521,.75]),$V([-.588913,.440521,.75]),$V([-.588913,.440521,-.75])], 224 | [$V([-.990662,.440521,.75]),$V([-.588913,.440521,-.75]),$V([-.990662,.440521,-.75])], 225 | [$V([-.990662,-.224918,.75]),$V([-.990662,.440521,.75]),$V([-.990662,.440521,-.75])], 226 | [$V([-.990662,-.224918,.75]),$V([-.990662,.440521,-.75]),$V([-.990662,-.224918,-.75])], 227 | [$V([-1.404376,.440521,.75]),$V([-1.312337,.109182,.75]),$V([-1.312337,.109182,-.75])], 228 | [$V([-1.404376,.440521,.75]),$V([-1.312337,.109182,-.75]),$V([-1.404376,.440521,-.75])], 229 | [$V([-1.565443,.440521,.75]),$V([-1.404376,.440521,.75]),$V([-1.404376,.440521,-.75])], 230 | [$V([-1.565443,.440521,.75]),$V([-1.404376,.440521,-.75]),$V([-1.565443,.440521,-.75])], 231 | [$V([-1.565443,-.224918,.75]),$V([-1.565443,.440521,.75]),$V([-1.565443,.440521,-.75])], 232 | [$V([-1.565443,-.224918,.75]),$V([-1.565443,.440521,-.75]),$V([-1.565443,-.224918,-.75])], 233 | [$V([-1.436589,-.224918,.75]),$V([-1.565443,-.224918,.75]),$V([-1.565443,-.224918,-.75])], 234 | [$V([-1.436589,-.224918,.75]),$V([-1.565443,-.224918,-.75]),$V([-1.436589,-.224918,-.75])], 235 | [$V([-1.436589,.189256,.75]),$V([-1.436589,-.224918,.75]),$V([-1.436589,-.224918,-.75])], 236 | [$V([-1.436589,.189256,.75]),$V([-1.436589,-.224918,-.75]),$V([-1.436589,.189256,-.75])], 237 | [$V([-1.333045,-.224918,.75]),$V([-1.436589,.189256,.75]),$V([-1.436589,.189256,-.75])], 238 | [$V([-1.333045,-.224918,.75]),$V([-1.436589,.189256,-.75]),$V([-1.333045,-.224918,-.75])], 239 | [$V([-1.291628,-.224918,.75]),$V([-1.333045,-.224918,.75]),$V([-1.333045,-.224918,-.75])], 240 | [$V([-1.291628,-.224918,.75]),$V([-1.333045,-.224918,-.75]),$V([-1.291628,-.224918,-.75])], 241 | [$V([-1.188085,.189256,.75]),$V([-1.291628,-.224918,.75]),$V([-1.291628,-.224918,-.75])], 242 | [$V([-1.188085,.189256,.75]),$V([-1.291628,-.224918,-.75]),$V([-1.188085,.189256,-.75])], 243 | [$V([-1.188085,-.224918,.75]),$V([-1.188085,.189256,.75]),$V([-1.188085,.189256,-.75])], 244 | [$V([-1.188085,-.224918,.75]),$V([-1.188085,.189256,-.75]),$V([-1.188085,-.224918,-.75])], 245 | [$V([-1.059231,-.224918,.75]),$V([-1.188085,-.224918,.75]),$V([-1.188085,-.224918,-.75])], 246 | [$V([-1.059231,-.224918,.75]),$V([-1.188085,-.224918,-.75]),$V([-1.059231,-.224918,-.75])], 247 | [$V([-1.059231,.440521,.75]),$V([-1.059231,-.224918,.75]),$V([-1.059231,-.224918,-.75])], 248 | [$V([-1.059231,.440521,.75]),$V([-1.059231,-.224918,-.75]),$V([-1.059231,.440521,-.75])], 249 | [$V([-1.220298,.440521,.75]),$V([-1.059231,.440521,.75]),$V([-1.059231,.440521,-.75])], 250 | [$V([-1.220298,.440521,.75]),$V([-1.059231,.440521,-.75]),$V([-1.220298,.440521,-.75])], 251 | [$V([-1.312337,.109182,.75]),$V([-1.220298,.440521,.75]),$V([-1.220298,.440521,-.75])], 252 | [$V([-1.312337,.109182,.75]),$V([-1.220298,.440521,-.75]),$V([-1.312337,.109182,-.75])], 253 | ] --------------------------------------------------------------------------------