Initial commit
This commit is contained in:
parent
085984aa6b
commit
e297123be7
@ -1 +1,3 @@
|
||||
# 3dinterface
|
||||
# 3D Interface
|
||||
|
||||
Various 3d interfaces based on Three.js
|
||||
|
19
bouncing/index.html
Normal file
19
bouncing/index.html
Normal file
@ -0,0 +1,19 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>The begining</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Here is stuff</h1>
|
||||
<div id="container"></div>
|
||||
<script src="/js/three/three.min.js"></script>
|
||||
<script src="/js/three/OBJLoader.js"></script>
|
||||
<script src="/js/three/OrbitControls.js"></script>
|
||||
<script src="/js/three/PointerLockControls.js"></script>
|
||||
<script src="/js/Cube.js"></script>
|
||||
<script src="/js/BouncingCube.js"></script>
|
||||
<script src="/js/Camera.js"></script>
|
||||
<script src="js/BouncingMain.js"></script>
|
||||
</body>
|
||||
</html>
|
97
bouncing/js/BouncingMain.js
Normal file
97
bouncing/js/BouncingMain.js
Normal file
@ -0,0 +1,97 @@
|
||||
var renderer, scene, camera, controls, cube, container, plane, mouse= {x:0, y:0};
|
||||
var raycaster;
|
||||
var objects = [];
|
||||
var container_size = new Object();
|
||||
container_size.width = 1067;
|
||||
container_size.height = 600;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init() {
|
||||
// on initialise le moteur de rendu
|
||||
container = document.getElementById('container');
|
||||
container.style.height = container_size.height + 'px';
|
||||
container.style.width = container_size.width + 'px';
|
||||
renderer = new THREE.WebGLRenderer({alpha:"true"});
|
||||
renderer.setSize(container_size.width, container_size.height);
|
||||
renderer.shadowMapEnabled = true;
|
||||
document.getElementById('container').appendChild(renderer.domElement);
|
||||
|
||||
// on initialise la scène
|
||||
scene = new THREE.Scene();
|
||||
raycaster = new THREE.Raycaster();
|
||||
|
||||
// init light
|
||||
var directional_light = new THREE.DirectionalLight(0xffffff);
|
||||
directional_light.position.set(1, 0.5, 1).normalize();
|
||||
directional_light.castShadow = true;
|
||||
scene.add(directional_light);
|
||||
|
||||
var ambient_light = new THREE.AmbientLight(0x444444);
|
||||
scene.add(ambient_light);
|
||||
|
||||
// on initialise la camera que l’on place ensuite sur la scène
|
||||
camera = new Camera(50, container_size.width / container_size.height, 1, 10000);
|
||||
scene.add(camera);
|
||||
|
||||
window.addEventListener('resize', onWindowResize, false);
|
||||
|
||||
container.addEventListener('mousedown', click, false);
|
||||
|
||||
// on créé un cube au quel on définie un matériau puis on l’ajoute à la scène
|
||||
cube = new BouncingCube(200, {color: "red"});
|
||||
plane = new Plane(1000,1000);
|
||||
plane.translate(0,0,-100);
|
||||
|
||||
cube.addToScene(scene);
|
||||
plane.addToScene(scene);
|
||||
|
||||
objects.push(cube);
|
||||
objects.push(plane);
|
||||
}
|
||||
|
||||
function animate() {
|
||||
// on appelle la fonction animate() récursivement à chaque frame
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
cube.update();
|
||||
|
||||
camera.update();
|
||||
camera.look();
|
||||
|
||||
renderer.render(scene, camera);
|
||||
|
||||
}
|
||||
|
||||
function onWindowResize() {
|
||||
camera.aspect = container.offsetWidth / container.offsetHeight;
|
||||
camera.updateProjectionMatrix();
|
||||
|
||||
renderer.setSize(container.offsetWidth, container.offsetHeight);
|
||||
renderer.render(scene, camera);
|
||||
}
|
||||
|
||||
function click(event) {
|
||||
mouse.x = ( ( event.clientX - renderer.domElement.offsetLeft ) / renderer.domElement.width ) * 2 - 1;
|
||||
mouse.y = - ( ( event.clientY - renderer.domElement.offsetTop ) / renderer.domElement.height ) * 2 + 1;
|
||||
|
||||
// For this alternate method, set the canvas position *fixed*; set top > 0, set left > 0; padding must be 0; margin > 0 is OK
|
||||
//mouse.x = ( ( event.clientX - container.offsetLeft ) / container.clientWidth ) * 2 - 1;
|
||||
//mouse.y = - ( ( event.clientY - container.offsetTop ) / container.clientHeight ) * 2 + 1;
|
||||
|
||||
var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
|
||||
vector.unproject(camera);
|
||||
|
||||
raycaster.set(camera.position, vector.sub(camera.position).normalize());
|
||||
|
||||
intersects = raycaster.intersectObjects(scene.children);
|
||||
|
||||
if ( intersects.length > 0 ) {
|
||||
for (var i in intersects) {
|
||||
if (intersects[i].object.id === cube.mesh.id) {
|
||||
cube.speed.z = 300;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
22
data/spheres/1.obj
Normal file
22
data/spheres/1.obj
Normal file
@ -0,0 +1,22 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 86.6025 50.0001 5.88009e-39
|
||||
v 9.94527e-05 50.0001 86.6025
|
||||
v -86.6025 50.0001 0.000198905
|
||||
v -0.000288034 50.0001 -86.6025
|
||||
v 86.6026 -49.9999 5.88009e-39
|
||||
v 9.94529e-05 -49.9999 86.6026
|
||||
v -86.6026 -49.9999 0.000198906
|
||||
v -0.000288035 -49.9999 -86.6026
|
||||
f 3 4 8 7
|
||||
f 4 5 9 8
|
||||
f 5 6 10 9
|
||||
f 6 3 7 10
|
||||
f 1 4 3
|
||||
f 2 7 8
|
||||
f 1 5 4
|
||||
f 2 8 9
|
||||
f 1 6 5
|
||||
f 2 9 10
|
||||
f 1 3 6
|
||||
f 2 10 7
|
1642
data/spheres/10.obj
Normal file
1642
data/spheres/10.obj
Normal file
File diff suppressed because it is too large
Load Diff
1982
data/spheres/11.obj
Normal file
1982
data/spheres/11.obj
Normal file
File diff suppressed because it is too large
Load Diff
2354
data/spheres/12.obj
Normal file
2354
data/spheres/12.obj
Normal file
File diff suppressed because it is too large
Load Diff
2758
data/spheres/13.obj
Normal file
2758
data/spheres/13.obj
Normal file
File diff suppressed because it is too large
Load Diff
3194
data/spheres/14.obj
Normal file
3194
data/spheres/14.obj
Normal file
File diff suppressed because it is too large
Load Diff
3662
data/spheres/15.obj
Normal file
3662
data/spheres/15.obj
Normal file
File diff suppressed because it is too large
Load Diff
4162
data/spheres/16.obj
Normal file
4162
data/spheres/16.obj
Normal file
File diff suppressed because it is too large
Load Diff
4694
data/spheres/17.obj
Normal file
4694
data/spheres/17.obj
Normal file
File diff suppressed because it is too large
Load Diff
5258
data/spheres/18.obj
Normal file
5258
data/spheres/18.obj
Normal file
File diff suppressed because it is too large
Load Diff
5854
data/spheres/19.obj
Normal file
5854
data/spheres/19.obj
Normal file
File diff suppressed because it is too large
Load Diff
74
data/spheres/2.obj
Normal file
74
data/spheres/2.obj
Normal file
@ -0,0 +1,74 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 58.7785 80.9017 5.88009e-39
|
||||
v 41.5627 80.9017 41.5626
|
||||
v 6.75001e-05 80.9017 58.7785
|
||||
v -41.5626 80.9017 41.5627
|
||||
v -58.7785 80.9017 0.000135
|
||||
v -41.5628 80.9017 -41.5625
|
||||
v -0.000195493 80.9017 -58.7785
|
||||
v 41.5625 80.9017 -41.5628
|
||||
v 95.1056 30.9018 5.88009e-39
|
||||
v 67.2499 30.9018 67.2498
|
||||
v 0.000109218 30.9018 95.1056
|
||||
v -67.2497 30.9018 67.2499
|
||||
v -95.1056 30.9018 0.000218435
|
||||
v -67.25 30.9018 -67.2496
|
||||
v -0.000316315 30.9018 -95.1056
|
||||
v 67.2496 30.9018 -67.2501
|
||||
v 95.1057 -30.9016 5.88009e-39
|
||||
v 67.2499 -30.9016 67.2498
|
||||
v 0.000109218 -30.9016 95.1057
|
||||
v -67.2498 -30.9016 67.25
|
||||
v -95.1057 -30.9016 0.000218435
|
||||
v -67.2501 -30.9016 -67.2497
|
||||
v -0.000316315 -30.9016 -95.1057
|
||||
v 67.2496 -30.9016 -67.2502
|
||||
v 58.7787 -80.9016 5.88009e-39
|
||||
v 41.5628 -80.9016 41.5628
|
||||
v 6.75003e-05 -80.9016 58.7787
|
||||
v -41.5627 -80.9016 41.5629
|
||||
v -58.7787 -80.9016 0.000135001
|
||||
v -41.5629 -80.9016 -41.5627
|
||||
v -0.000195494 -80.9016 -58.7787
|
||||
v 41.5626 -80.9016 -41.563
|
||||
f 3 4 12 11
|
||||
f 4 5 13 12
|
||||
f 5 6 14 13
|
||||
f 6 7 15 14
|
||||
f 7 8 16 15
|
||||
f 8 9 17 16
|
||||
f 9 10 18 17
|
||||
f 10 3 11 18
|
||||
f 11 12 20 19
|
||||
f 12 13 21 20
|
||||
f 13 14 22 21
|
||||
f 14 15 23 22
|
||||
f 15 16 24 23
|
||||
f 16 17 25 24
|
||||
f 17 18 26 25
|
||||
f 18 11 19 26
|
||||
f 19 20 28 27
|
||||
f 20 21 29 28
|
||||
f 21 22 30 29
|
||||
f 22 23 31 30
|
||||
f 23 24 32 31
|
||||
f 24 25 33 32
|
||||
f 25 26 34 33
|
||||
f 26 19 27 34
|
||||
f 1 4 3
|
||||
f 2 27 28
|
||||
f 1 5 4
|
||||
f 2 28 29
|
||||
f 1 6 5
|
||||
f 2 29 30
|
||||
f 1 7 6
|
||||
f 2 30 31
|
||||
f 1 8 7
|
||||
f 2 31 32
|
||||
f 1 9 8
|
||||
f 2 32 33
|
||||
f 1 10 9
|
||||
f 2 33 34
|
||||
f 1 3 10
|
||||
f 2 34 27
|
6482
data/spheres/20.obj
Normal file
6482
data/spheres/20.obj
Normal file
File diff suppressed because it is too large
Load Diff
7142
data/spheres/21.obj
Normal file
7142
data/spheres/21.obj
Normal file
File diff suppressed because it is too large
Load Diff
7834
data/spheres/22.obj
Normal file
7834
data/spheres/22.obj
Normal file
File diff suppressed because it is too large
Load Diff
8558
data/spheres/23.obj
Normal file
8558
data/spheres/23.obj
Normal file
File diff suppressed because it is too large
Load Diff
9314
data/spheres/24.obj
Normal file
9314
data/spheres/24.obj
Normal file
File diff suppressed because it is too large
Load Diff
10102
data/spheres/25.obj
Normal file
10102
data/spheres/25.obj
Normal file
File diff suppressed because it is too large
Load Diff
158
data/spheres/3.obj
Normal file
158
data/spheres/3.obj
Normal file
@ -0,0 +1,158 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 43.3883 90.0969 5.88009e-39
|
||||
v 37.5754 90.0969 21.6942
|
||||
v 21.6942 90.0969 37.5754
|
||||
v 5.49987e-05 90.0969 43.3883
|
||||
v -21.6941 90.0969 37.5754
|
||||
v -37.5754 90.0969 21.6942
|
||||
v -43.3883 90.0969 0.000109997
|
||||
v -37.5755 90.0969 -21.6941
|
||||
v -21.6943 90.0969 -37.5753
|
||||
v -0.000164996 90.0969 -43.3883
|
||||
v 21.694 90.0969 -37.5755
|
||||
v 37.5753 90.0969 -21.6943
|
||||
v 78.1831 62.349 5.88009e-39
|
||||
v 67.7086 62.349 39.0915
|
||||
v 39.0916 62.349 67.7085
|
||||
v 9.91042e-05 62.349 78.1831
|
||||
v -39.0914 62.349 67.7086
|
||||
v -67.7085 62.349 39.0917
|
||||
v -78.1831 62.349 0.000198208
|
||||
v -67.7087 62.349 -39.0914
|
||||
v -39.0918 62.349 -67.7084
|
||||
v -0.000297313 62.349 -78.1831
|
||||
v 39.0913 62.349 -67.7087
|
||||
v 67.7084 62.349 -39.0919
|
||||
v 97.4928 22.2522 5.88009e-39
|
||||
v 84.4312 22.2522 48.7463
|
||||
v 48.7465 22.2522 84.4312
|
||||
v 0.000123581 22.2522 97.4928
|
||||
v -48.7462 22.2522 84.4313
|
||||
v -84.4311 22.2522 48.7465
|
||||
v -97.4928 22.2522 0.000247162
|
||||
v -84.4314 22.2522 -48.7461
|
||||
v -48.7467 22.2522 -84.4311
|
||||
v -0.000370743 22.2522 -97.4928
|
||||
v 48.7461 22.2522 -84.4314
|
||||
v 84.431 22.2522 -48.7468
|
||||
v 97.4928 -22.252 5.88009e-39
|
||||
v 84.4313 -22.252 48.7464
|
||||
v 48.7465 -22.252 84.4312
|
||||
v 0.000123581 -22.252 97.4928
|
||||
v -48.7463 -22.252 84.4313
|
||||
v -84.4312 -22.252 48.7466
|
||||
v -97.4928 -22.252 0.000247162
|
||||
v -84.4314 -22.252 -48.7462
|
||||
v -48.7467 -22.252 -84.4311
|
||||
v -0.000370743 -22.252 -97.4928
|
||||
v 48.7461 -22.252 -84.4314
|
||||
v 84.431 -22.252 -48.7468
|
||||
v 78.1833 -62.3488 5.88009e-39
|
||||
v 67.7087 -62.3488 39.0916
|
||||
v 39.0917 -62.3488 67.7087
|
||||
v 9.91044e-05 -62.3488 78.1833
|
||||
v -39.0915 -62.3488 67.7087
|
||||
v -67.7086 -62.3488 39.0918
|
||||
v -78.1833 -62.3488 0.000198209
|
||||
v -67.7088 -62.3488 -39.0914
|
||||
v -39.0918 -62.3488 -67.7086
|
||||
v -0.000297313 -62.3488 -78.1833
|
||||
v 39.0914 -62.3488 -67.7088
|
||||
v 67.7085 -62.3488 -39.0919
|
||||
v 43.3886 -90.0968 5.88009e-39
|
||||
v 37.5756 -90.0968 21.6943
|
||||
v 21.6943 -90.0968 37.5756
|
||||
v 5.4999e-05 -90.0968 43.3886
|
||||
v -21.6942 -90.0968 37.5756
|
||||
v -37.5756 -90.0968 21.6944
|
||||
v -43.3886 -90.0968 0.000109998
|
||||
v -37.5757 -90.0968 -21.6942
|
||||
v -21.6944 -90.0968 -37.5755
|
||||
v -0.000164997 -90.0968 -43.3886
|
||||
v 21.6941 -90.0968 -37.5757
|
||||
v 37.5755 -90.0968 -21.6945
|
||||
f 3 4 16 15
|
||||
f 4 5 17 16
|
||||
f 5 6 18 17
|
||||
f 6 7 19 18
|
||||
f 7 8 20 19
|
||||
f 8 9 21 20
|
||||
f 9 10 22 21
|
||||
f 10 11 23 22
|
||||
f 11 12 24 23
|
||||
f 12 13 25 24
|
||||
f 13 14 26 25
|
||||
f 14 3 15 26
|
||||
f 15 16 28 27
|
||||
f 16 17 29 28
|
||||
f 17 18 30 29
|
||||
f 18 19 31 30
|
||||
f 19 20 32 31
|
||||
f 20 21 33 32
|
||||
f 21 22 34 33
|
||||
f 22 23 35 34
|
||||
f 23 24 36 35
|
||||
f 24 25 37 36
|
||||
f 25 26 38 37
|
||||
f 26 15 27 38
|
||||
f 27 28 40 39
|
||||
f 28 29 41 40
|
||||
f 29 30 42 41
|
||||
f 30 31 43 42
|
||||
f 31 32 44 43
|
||||
f 32 33 45 44
|
||||
f 33 34 46 45
|
||||
f 34 35 47 46
|
||||
f 35 36 48 47
|
||||
f 36 37 49 48
|
||||
f 37 38 50 49
|
||||
f 38 27 39 50
|
||||
f 39 40 52 51
|
||||
f 40 41 53 52
|
||||
f 41 42 54 53
|
||||
f 42 43 55 54
|
||||
f 43 44 56 55
|
||||
f 44 45 57 56
|
||||
f 45 46 58 57
|
||||
f 46 47 59 58
|
||||
f 47 48 60 59
|
||||
f 48 49 61 60
|
||||
f 49 50 62 61
|
||||
f 50 39 51 62
|
||||
f 51 52 64 63
|
||||
f 52 53 65 64
|
||||
f 53 54 66 65
|
||||
f 54 55 67 66
|
||||
f 55 56 68 67
|
||||
f 56 57 69 68
|
||||
f 57 58 70 69
|
||||
f 58 59 71 70
|
||||
f 59 60 72 71
|
||||
f 60 61 73 72
|
||||
f 61 62 74 73
|
||||
f 62 51 63 74
|
||||
f 1 4 3
|
||||
f 2 63 64
|
||||
f 1 5 4
|
||||
f 2 64 65
|
||||
f 1 6 5
|
||||
f 2 65 66
|
||||
f 1 7 6
|
||||
f 2 66 67
|
||||
f 1 8 7
|
||||
f 2 67 68
|
||||
f 1 9 8
|
||||
f 2 68 69
|
||||
f 1 10 9
|
||||
f 2 69 70
|
||||
f 1 11 10
|
||||
f 2 70 71
|
||||
f 1 12 11
|
||||
f 2 71 72
|
||||
f 1 13 12
|
||||
f 2 72 73
|
||||
f 1 14 13
|
||||
f 2 73 74
|
||||
f 1 3 14
|
||||
f 2 74 63
|
274
data/spheres/4.obj
Normal file
274
data/spheres/4.obj
Normal file
@ -0,0 +1,274 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 34.202 93.9693 5.88009e-39
|
||||
v 31.5985 93.9693 13.0885
|
||||
v 24.1845 93.9693 24.1844
|
||||
v 13.0886 93.9693 31.5985
|
||||
v 3.92769e-05 93.9693 34.202
|
||||
v -13.0885 93.9693 31.5985
|
||||
v -24.1844 93.9693 24.1845
|
||||
v -31.5985 93.9693 13.0886
|
||||
v -34.202 93.9693 7.85539e-05
|
||||
v -31.5986 93.9693 -13.0885
|
||||
v -24.1845 93.9693 -24.1844
|
||||
v -13.0886 93.9693 -31.5985
|
||||
v -0.000113754 93.9693 -34.202
|
||||
v 13.0884 93.9693 -31.5986
|
||||
v 24.1844 93.9693 -24.1846
|
||||
v 31.5985 93.9693 -13.0887
|
||||
v 64.2787 76.6045 5.88009e-39
|
||||
v 59.3858 76.6045 24.5984
|
||||
v 45.452 76.6045 45.4519
|
||||
v 24.5985 76.6045 59.3858
|
||||
v 7.38165e-05 76.6045 64.2787
|
||||
v -24.5983 76.6045 59.3858
|
||||
v -45.4518 76.6045 45.452
|
||||
v -59.3857 76.6045 24.5985
|
||||
v -64.2787 76.6045 0.000147633
|
||||
v -59.3859 76.6045 -24.5982
|
||||
v -45.4521 76.6045 -45.4518
|
||||
v -24.5986 76.6045 -59.3857
|
||||
v -0.000213787 76.6045 -64.2787
|
||||
v 24.5982 76.6045 -59.3859
|
||||
v 45.4517 76.6045 -45.4521
|
||||
v 59.3857 76.6045 -24.5987
|
||||
v 86.6025 50.0001 5.88009e-39
|
||||
v 80.0103 50.0001 33.1413
|
||||
v 61.2373 50.0001 61.2372
|
||||
v 33.1414 50.0001 80.0103
|
||||
v 9.94527e-05 50.0001 86.6025
|
||||
v -33.1412 50.0001 80.0103
|
||||
v -61.2371 50.0001 61.2373
|
||||
v -80.0102 50.0001 33.1415
|
||||
v -86.6025 50.0001 0.000198905
|
||||
v -80.0104 50.0001 -33.1411
|
||||
v -61.2374 50.0001 -61.237
|
||||
v -33.1416 50.0001 -80.0102
|
||||
v -0.000288034 50.0001 -86.6025
|
||||
v 33.1411 50.0001 -80.0104
|
||||
v 61.237 50.0001 -61.2375
|
||||
v 80.0101 50.0001 -33.1417
|
||||
v 98.4808 17.3649 5.88009e-39
|
||||
v 90.9844 17.3649 37.6869
|
||||
v 69.6365 17.3649 69.6364
|
||||
v 37.687 17.3649 90.9843
|
||||
v 0.000113093 17.3649 98.4808
|
||||
v -37.6868 17.3649 90.9844
|
||||
v -69.6363 17.3649 69.6365
|
||||
v -90.9843 17.3649 37.6871
|
||||
v -98.4808 17.3649 0.000226187
|
||||
v -90.9845 17.3649 -37.6867
|
||||
v -69.6366 17.3649 -69.6362
|
||||
v -37.6872 17.3649 -90.9842
|
||||
v -0.000327541 17.3649 -98.4808
|
||||
v 37.6866 17.3649 -90.9845
|
||||
v 69.6361 17.3649 -69.6367
|
||||
v 90.9842 17.3649 -37.6873
|
||||
v 98.4808 -17.3647 5.88009e-39
|
||||
v 90.9844 -17.3647 37.6869
|
||||
v 69.6365 -17.3647 69.6364
|
||||
v 37.687 -17.3647 90.9844
|
||||
v 0.000113094 -17.3647 98.4808
|
||||
v -37.6868 -17.3647 90.9845
|
||||
v -69.6363 -17.3647 69.6366
|
||||
v -90.9843 -17.3647 37.6871
|
||||
v -98.4808 -17.3647 0.000226187
|
||||
v -90.9845 -17.3647 -37.6867
|
||||
v -69.6366 -17.3647 -69.6362
|
||||
v -37.6872 -17.3647 -90.9843
|
||||
v -0.000327541 -17.3647 -98.4808
|
||||
v 37.6866 -17.3647 -90.9845
|
||||
v 69.6362 -17.3647 -69.6367
|
||||
v 90.9842 -17.3647 -37.6874
|
||||
v 86.6026 -49.9999 5.88009e-39
|
||||
v 80.0104 -49.9999 33.1414
|
||||
v 61.2373 -49.9999 61.2373
|
||||
v 33.1414 -49.9999 80.0103
|
||||
v 9.94528e-05 -49.9999 86.6026
|
||||
v -33.1413 -49.9999 80.0104
|
||||
v -61.2372 -49.9999 61.2374
|
||||
v -80.0103 -49.9999 33.1415
|
||||
v -86.6026 -49.9999 0.000198906
|
||||
v -80.0105 -49.9999 -33.1412
|
||||
v -61.2375 -49.9999 -61.2371
|
||||
v -33.1416 -49.9999 -80.0103
|
||||
v -0.000288035 -49.9999 -86.6026
|
||||
v 33.1411 -49.9999 -80.0105
|
||||
v 61.237 -49.9999 -61.2375
|
||||
v 80.0102 -49.9999 -33.1417
|
||||
v 64.2789 -76.6043 5.88009e-39
|
||||
v 59.386 -76.6043 24.5984
|
||||
v 45.4521 -76.6043 45.452
|
||||
v 24.5985 -76.6043 59.3859
|
||||
v 7.38167e-05 -76.6043 64.2789
|
||||
v -24.5984 -76.6043 59.386
|
||||
v -45.452 -76.6043 45.4521
|
||||
v -59.3859 -76.6043 24.5986
|
||||
v -64.2789 -76.6043 0.000147633
|
||||
v -59.386 -76.6043 -24.5983
|
||||
v -45.4522 -76.6043 -45.4519
|
||||
v -24.5986 -76.6043 -59.3859
|
||||
v -0.000213787 -76.6043 -64.2789
|
||||
v 24.5983 -76.6043 -59.386
|
||||
v 45.4519 -76.6043 -45.4522
|
||||
v 59.3858 -76.6043 -24.5987
|
||||
v 34.2022 -93.9692 5.88009e-39
|
||||
v 31.5987 -93.9692 13.0886
|
||||
v 24.1846 -93.9692 24.1846
|
||||
v 13.0886 -93.9692 31.5987
|
||||
v 3.92772e-05 -93.9692 34.2022
|
||||
v -13.0886 -93.9692 31.5987
|
||||
v -24.1846 -93.9692 24.1846
|
||||
v -31.5987 -93.9692 13.0887
|
||||
v -34.2022 -93.9692 7.85544e-05
|
||||
v -31.5987 -93.9692 -13.0885
|
||||
v -24.1847 -93.9692 -24.1845
|
||||
v -13.0887 -93.9692 -31.5987
|
||||
v -0.000113754 -93.9692 -34.2022
|
||||
v 13.0885 -93.9692 -31.5988
|
||||
v 24.1845 -93.9692 -24.1847
|
||||
v 31.5987 -93.9692 -13.0888
|
||||
f 3 4 20 19
|
||||
f 4 5 21 20
|
||||
f 5 6 22 21
|
||||
f 6 7 23 22
|
||||
f 7 8 24 23
|
||||
f 8 9 25 24
|
||||
f 9 10 26 25
|
||||
f 10 11 27 26
|
||||
f 11 12 28 27
|
||||
f 12 13 29 28
|
||||
f 13 14 30 29
|
||||
f 14 15 31 30
|
||||
f 15 16 32 31
|
||||
f 16 17 33 32
|
||||
f 17 18 34 33
|
||||
f 18 3 19 34
|
||||
f 19 20 36 35
|
||||
f 20 21 37 36
|
||||
f 21 22 38 37
|
||||
f 22 23 39 38
|
||||
f 23 24 40 39
|
||||
f 24 25 41 40
|
||||
f 25 26 42 41
|
||||
f 26 27 43 42
|
||||
f 27 28 44 43
|
||||
f 28 29 45 44
|
||||
f 29 30 46 45
|
||||
f 30 31 47 46
|
||||
f 31 32 48 47
|
||||
f 32 33 49 48
|
||||
f 33 34 50 49
|
||||
f 34 19 35 50
|
||||
f 35 36 52 51
|
||||
f 36 37 53 52
|
||||
f 37 38 54 53
|
||||
f 38 39 55 54
|
||||
f 39 40 56 55
|
||||
f 40 41 57 56
|
||||
f 41 42 58 57
|
||||
f 42 43 59 58
|
||||
f 43 44 60 59
|
||||
f 44 45 61 60
|
||||
f 45 46 62 61
|
||||
f 46 47 63 62
|
||||
f 47 48 64 63
|
||||
f 48 49 65 64
|
||||
f 49 50 66 65
|
||||
f 50 35 51 66
|
||||
f 51 52 68 67
|
||||
f 52 53 69 68
|
||||
f 53 54 70 69
|
||||
f 54 55 71 70
|
||||
f 55 56 72 71
|
||||
f 56 57 73 72
|
||||
f 57 58 74 73
|
||||
f 58 59 75 74
|
||||
f 59 60 76 75
|
||||
f 60 61 77 76
|
||||
f 61 62 78 77
|
||||
f 62 63 79 78
|
||||
f 63 64 80 79
|
||||
f 64 65 81 80
|
||||
f 65 66 82 81
|
||||
f 66 51 67 82
|
||||
f 67 68 84 83
|
||||
f 68 69 85 84
|
||||
f 69 70 86 85
|
||||
f 70 71 87 86
|
||||
f 71 72 88 87
|
||||
f 72 73 89 88
|
||||
f 73 74 90 89
|
||||
f 74 75 91 90
|
||||
f 75 76 92 91
|
||||
f 76 77 93 92
|
||||
f 77 78 94 93
|
||||
f 78 79 95 94
|
||||
f 79 80 96 95
|
||||
f 80 81 97 96
|
||||
f 81 82 98 97
|
||||
f 82 67 83 98
|
||||
f 83 84 100 99
|
||||
f 84 85 101 100
|
||||
f 85 86 102 101
|
||||
f 86 87 103 102
|
||||
f 87 88 104 103
|
||||
f 88 89 105 104
|
||||
f 89 90 106 105
|
||||
f 90 91 107 106
|
||||
f 91 92 108 107
|
||||
f 92 93 109 108
|
||||
f 93 94 110 109
|
||||
f 94 95 111 110
|
||||
f 95 96 112 111
|
||||
f 96 97 113 112
|
||||
f 97 98 114 113
|
||||
f 98 83 99 114
|
||||
f 99 100 116 115
|
||||
f 100 101 117 116
|
||||
f 101 102 118 117
|
||||
f 102 103 119 118
|
||||
f 103 104 120 119
|
||||
f 104 105 121 120
|
||||
f 105 106 122 121
|
||||
f 106 107 123 122
|
||||
f 107 108 124 123
|
||||
f 108 109 125 124
|
||||
f 109 110 126 125
|
||||
f 110 111 127 126
|
||||
f 111 112 128 127
|
||||
f 112 113 129 128
|
||||
f 113 114 130 129
|
||||
f 114 99 115 130
|
||||
f 1 4 3
|
||||
f 2 115 116
|
||||
f 1 5 4
|
||||
f 2 116 117
|
||||
f 1 6 5
|
||||
f 2 117 118
|
||||
f 1 7 6
|
||||
f 2 118 119
|
||||
f 1 8 7
|
||||
f 2 119 120
|
||||
f 1 9 8
|
||||
f 2 120 121
|
||||
f 1 10 9
|
||||
f 2 121 122
|
||||
f 1 11 10
|
||||
f 2 122 123
|
||||
f 1 12 11
|
||||
f 2 123 124
|
||||
f 1 13 12
|
||||
f 2 124 125
|
||||
f 1 14 13
|
||||
f 2 125 126
|
||||
f 1 15 14
|
||||
f 2 126 127
|
||||
f 1 16 15
|
||||
f 2 127 128
|
||||
f 1 17 16
|
||||
f 2 128 129
|
||||
f 1 18 17
|
||||
f 2 129 130
|
||||
f 1 3 18
|
||||
f 2 130 115
|
422
data/spheres/5.obj
Normal file
422
data/spheres/5.obj
Normal file
@ -0,0 +1,422 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 28.1732 95.9493 5.88009e-39
|
||||
v 26.7943 95.9493 8.706
|
||||
v 22.7926 95.9493 16.5598
|
||||
v 16.5598 95.9493 22.7926
|
||||
v 8.70603 95.9493 26.7943
|
||||
v 3.23536e-05 95.9493 28.1732
|
||||
v -8.70597 95.9493 26.7944
|
||||
v -16.5598 95.9493 22.7927
|
||||
v -22.7926 95.9493 16.5599
|
||||
v -26.7943 95.9493 8.70607
|
||||
v -28.1732 95.9493 6.47072e-05
|
||||
v -26.7944 95.9493 -8.70594
|
||||
v -22.7927 95.9493 -16.5597
|
||||
v -16.5599 95.9493 -22.7926
|
||||
v -8.70609 95.9493 -26.7943
|
||||
v -9.37024e-05 95.9493 -28.1732
|
||||
v 8.70591 95.9493 -26.7944
|
||||
v 16.5597 95.9493 -22.7927
|
||||
v 22.7926 95.9493 -16.5599
|
||||
v 26.7943 95.9493 -8.70612
|
||||
v 54.064 84.1254 5.88009e-39
|
||||
v 51.418 84.1254 16.7067
|
||||
v 43.7387 84.1254 31.778
|
||||
v 31.7781 84.1254 43.7387
|
||||
v 16.7068 84.1254 51.4179
|
||||
v 6.20861e-05 84.1254 54.064
|
||||
v -16.7066 84.1254 51.418
|
||||
v -31.778 84.1254 43.7388
|
||||
v -43.7387 84.1254 31.7781
|
||||
v -51.4179 84.1254 16.7068
|
||||
v -54.064 84.1254 0.000124172
|
||||
v -51.418 84.1254 -16.7066
|
||||
v -43.7388 84.1254 -31.7779
|
||||
v -31.7782 84.1254 -43.7386
|
||||
v -16.7069 84.1254 -51.4179
|
||||
v -0.000179814 84.1254 -54.064
|
||||
v 16.7065 84.1254 -51.418
|
||||
v 31.7779 84.1254 -43.7389
|
||||
v 43.7386 84.1254 -31.7782
|
||||
v 51.4179 84.1254 -16.7069
|
||||
v 75.5749 65.4861 5.88009e-39
|
||||
v 71.876 65.4861 23.3539
|
||||
v 61.1414 65.4861 44.4218
|
||||
v 44.4219 65.4861 61.1414
|
||||
v 23.354 65.4861 71.876
|
||||
v 8.67888e-05 65.4861 75.5749
|
||||
v -23.3538 65.4861 71.876
|
||||
v -44.4217 65.4861 61.1415
|
||||
v -61.1413 65.4861 44.4219
|
||||
v -71.876 65.4861 23.3541
|
||||
v -75.5749 65.4861 0.000173578
|
||||
v -71.8761 65.4861 -23.3538
|
||||
v -61.1415 65.4861 -44.4216
|
||||
v -44.422 65.4861 -61.1413
|
||||
v -23.3541 65.4861 -71.8759
|
||||
v -0.000251357 65.4861 -75.5749
|
||||
v 23.3537 65.4861 -71.8761
|
||||
v 44.4216 65.4861 -61.1416
|
||||
v 61.1412 65.4861 -44.4221
|
||||
v 71.8759 65.4861 -23.3542
|
||||
v 90.9632 41.5416 5.88009e-39
|
||||
v 86.5111 41.5416 28.1091
|
||||
v 73.5908 41.5416 53.4668
|
||||
v 53.4669 41.5416 73.5907
|
||||
v 28.1092 41.5416 86.5111
|
||||
v 0.00010446 41.5416 90.9632
|
||||
v -28.109 41.5416 86.5111
|
||||
v -53.4667 41.5416 73.5908
|
||||
v -73.5906 41.5416 53.4669
|
||||
v -86.511 41.5416 28.1094
|
||||
v -90.9632 41.5416 0.000208921
|
||||
v -86.5112 41.5416 -28.109
|
||||
v -73.5909 41.5416 -53.4666
|
||||
v -53.467 41.5416 -73.5906
|
||||
v -28.1094 41.5416 -86.511
|
||||
v -0.000302538 41.5416 -90.9632
|
||||
v 28.1088 41.5416 -86.5112
|
||||
v 53.4665 41.5416 -73.591
|
||||
v 73.5905 41.5416 -53.4671
|
||||
v 86.511 41.5416 -28.1095
|
||||
v 98.9821 14.2316 5.88009e-39
|
||||
v 94.1376 14.2316 30.5871
|
||||
v 80.0783 14.2316 58.1802
|
||||
v 58.1803 14.2316 80.0782
|
||||
v 30.5872 14.2316 94.1376
|
||||
v 0.000113669 14.2316 98.9821
|
||||
v -30.587 14.2316 94.1376
|
||||
v -58.1801 14.2316 80.0783
|
||||
v -80.0781 14.2316 58.1804
|
||||
v -94.1375 14.2316 30.5874
|
||||
v -98.9821 14.2316 0.000227339
|
||||
v -94.1377 14.2316 -30.5869
|
||||
v -80.0784 14.2316 -58.18
|
||||
v -58.1805 14.2316 -80.078
|
||||
v -30.5874 14.2316 -94.1375
|
||||
v -0.000329208 14.2316 -98.9821
|
||||
v 30.5868 14.2316 -94.1377
|
||||
v 58.1799 14.2316 -80.0785
|
||||
v 80.078 14.2316 -58.1806
|
||||
v 94.1375 14.2316 -30.5876
|
||||
v 98.9822 -14.2314 5.88009e-39
|
||||
v 94.1376 -14.2314 30.5871
|
||||
v 80.0783 -14.2314 58.1802
|
||||
v 58.1803 -14.2314 80.0782
|
||||
v 30.5873 -14.2314 94.1376
|
||||
v 0.000113669 -14.2314 98.9822
|
||||
v -30.587 -14.2314 94.1377
|
||||
v -58.1801 -14.2314 80.0783
|
||||
v -80.0781 -14.2314 58.1804
|
||||
v -94.1376 -14.2314 30.5874
|
||||
v -98.9822 -14.2314 0.000227339
|
||||
v -94.1377 -14.2314 -30.5869
|
||||
v -80.0784 -14.2314 -58.18
|
||||
v -58.1805 -14.2314 -80.0781
|
||||
v -30.5875 -14.2314 -94.1375
|
||||
v -0.000329208 -14.2314 -98.9822
|
||||
v 30.5868 -14.2314 -94.1377
|
||||
v 58.1799 -14.2314 -80.0785
|
||||
v 80.078 -14.2314 -58.1806
|
||||
v 94.1375 -14.2314 -30.5876
|
||||
v 90.9633 -41.5414 5.88009e-39
|
||||
v 86.5112 -41.5414 28.1092
|
||||
v 73.5909 -41.5414 53.4668
|
||||
v 53.4669 -41.5414 73.5908
|
||||
v 28.1093 -41.5414 86.5112
|
||||
v 0.000104461 -41.5414 90.9633
|
||||
v -28.1091 -41.5414 86.5112
|
||||
v -53.4668 -41.5414 73.5909
|
||||
v -73.5907 -41.5414 53.467
|
||||
v -86.5111 -41.5414 28.1094
|
||||
v -90.9633 -41.5414 0.000208921
|
||||
v -86.5113 -41.5414 -28.109
|
||||
v -73.591 -41.5414 -53.4667
|
||||
v -53.4671 -41.5414 -73.5907
|
||||
v -28.1095 -41.5414 -86.5111
|
||||
v -0.000302538 -41.5414 -90.9633
|
||||
v 28.1089 -41.5414 -86.5113
|
||||
v 53.4666 -41.5414 -73.591
|
||||
v 73.5906 -41.5414 -53.4672
|
||||
v 86.5111 -41.5414 -28.1096
|
||||
v 75.5751 -65.4859 5.88009e-39
|
||||
v 71.8762 -65.4859 23.354
|
||||
v 61.1415 -65.4859 44.4219
|
||||
v 44.422 -65.4859 61.1415
|
||||
v 23.354 -65.4859 71.8761
|
||||
v 8.6789e-05 -65.4859 75.5751
|
||||
v -23.3539 -65.4859 71.8762
|
||||
v -44.4218 -65.4859 61.1416
|
||||
v -61.1414 -65.4859 44.422
|
||||
v -71.8761 -65.4859 23.3541
|
||||
v -75.5751 -65.4859 0.000173578
|
||||
v -71.8762 -65.4859 -23.3538
|
||||
v -61.1416 -65.4859 -44.4217
|
||||
v -44.4221 -65.4859 -61.1414
|
||||
v -23.3542 -65.4859 -71.8761
|
||||
v -0.000251358 -65.4859 -75.5751
|
||||
v 23.3537 -65.4859 -71.8763
|
||||
v 44.4217 -65.4859 -61.1417
|
||||
v 61.1413 -65.4859 -44.4222
|
||||
v 71.8761 -65.4859 -23.3543
|
||||
v 54.0642 -84.1253 5.88009e-39
|
||||
v 51.4182 -84.1253 16.7068
|
||||
v 43.7389 -84.1253 31.7781
|
||||
v 31.7782 -84.1253 43.7389
|
||||
v 16.7068 -84.1253 51.4181
|
||||
v 6.20864e-05 -84.1253 54.0642
|
||||
v -16.7067 -84.1253 51.4182
|
||||
v -31.7781 -84.1253 43.7389
|
||||
v -43.7388 -84.1253 31.7782
|
||||
v -51.4181 -84.1253 16.7069
|
||||
v -54.0642 -84.1253 0.000124173
|
||||
v -51.4182 -84.1253 -16.7066
|
||||
v -43.739 -84.1253 -31.778
|
||||
v -31.7783 -84.1253 -43.7388
|
||||
v -16.7069 -84.1253 -51.4181
|
||||
v -0.000179814 -84.1253 -54.0642
|
||||
v 16.7066 -84.1253 -51.4182
|
||||
v 31.778 -84.1253 -43.739
|
||||
v 43.7388 -84.1253 -31.7784
|
||||
v 51.4181 -84.1253 -16.707
|
||||
v 28.1735 -95.9492 5.88009e-39
|
||||
v 26.7946 -95.9492 8.70607
|
||||
v 22.7928 -95.9492 16.5599
|
||||
v 16.56 -95.9492 22.7928
|
||||
v 8.7061 -95.9492 26.7945
|
||||
v 3.23539e-05 -95.9492 28.1735
|
||||
v -8.70604 -95.9492 26.7946
|
||||
v -16.5599 -95.9492 22.7928
|
||||
v -22.7928 -95.9492 16.56
|
||||
v -26.7945 -95.9492 8.70614
|
||||
v -28.1735 -95.9492 6.47078e-05
|
||||
v -26.7946 -95.9492 -8.70602
|
||||
v -22.7929 -95.9492 -16.5599
|
||||
v -16.56 -95.9492 -22.7928
|
||||
v -8.70616 -95.9492 -26.7945
|
||||
v -9.37031e-05 -95.9492 -28.1735
|
||||
v 8.70598 -95.9492 -26.7946
|
||||
v 16.5599 -95.9492 -22.7929
|
||||
v 22.7927 -95.9492 -16.56
|
||||
v 26.7945 -95.9492 -8.70619
|
||||
f 3 4 24 23
|
||||
f 4 5 25 24
|
||||
f 5 6 26 25
|
||||
f 6 7 27 26
|
||||
f 7 8 28 27
|
||||
f 8 9 29 28
|
||||
f 9 10 30 29
|
||||
f 10 11 31 30
|
||||
f 11 12 32 31
|
||||
f 12 13 33 32
|
||||
f 13 14 34 33
|
||||
f 14 15 35 34
|
||||
f 15 16 36 35
|
||||
f 16 17 37 36
|
||||
f 17 18 38 37
|
||||
f 18 19 39 38
|
||||
f 19 20 40 39
|
||||
f 20 21 41 40
|
||||
f 21 22 42 41
|
||||
f 22 3 23 42
|
||||
f 23 24 44 43
|
||||
f 24 25 45 44
|
||||
f 25 26 46 45
|
||||
f 26 27 47 46
|
||||
f 27 28 48 47
|
||||
f 28 29 49 48
|
||||
f 29 30 50 49
|
||||
f 30 31 51 50
|
||||
f 31 32 52 51
|
||||
f 32 33 53 52
|
||||
f 33 34 54 53
|
||||
f 34 35 55 54
|
||||
f 35 36 56 55
|
||||
f 36 37 57 56
|
||||
f 37 38 58 57
|
||||
f 38 39 59 58
|
||||
f 39 40 60 59
|
||||
f 40 41 61 60
|
||||
f 41 42 62 61
|
||||
f 42 23 43 62
|
||||
f 43 44 64 63
|
||||
f 44 45 65 64
|
||||
f 45 46 66 65
|
||||
f 46 47 67 66
|
||||
f 47 48 68 67
|
||||
f 48 49 69 68
|
||||
f 49 50 70 69
|
||||
f 50 51 71 70
|
||||
f 51 52 72 71
|
||||
f 52 53 73 72
|
||||
f 53 54 74 73
|
||||
f 54 55 75 74
|
||||
f 55 56 76 75
|
||||
f 56 57 77 76
|
||||
f 57 58 78 77
|
||||
f 58 59 79 78
|
||||
f 59 60 80 79
|
||||
f 60 61 81 80
|
||||
f 61 62 82 81
|
||||
f 62 43 63 82
|
||||
f 63 64 84 83
|
||||
f 64 65 85 84
|
||||
f 65 66 86 85
|
||||
f 66 67 87 86
|
||||
f 67 68 88 87
|
||||
f 68 69 89 88
|
||||
f 69 70 90 89
|
||||
f 70 71 91 90
|
||||
f 71 72 92 91
|
||||
f 72 73 93 92
|
||||
f 73 74 94 93
|
||||
f 74 75 95 94
|
||||
f 75 76 96 95
|
||||
f 76 77 97 96
|
||||
f 77 78 98 97
|
||||
f 78 79 99 98
|
||||
f 79 80 100 99
|
||||
f 80 81 101 100
|
||||
f 81 82 102 101
|
||||
f 82 63 83 102
|
||||
f 83 84 104 103
|
||||
f 84 85 105 104
|
||||
f 85 86 106 105
|
||||
f 86 87 107 106
|
||||
f 87 88 108 107
|
||||
f 88 89 109 108
|
||||
f 89 90 110 109
|
||||
f 90 91 111 110
|
||||
f 91 92 112 111
|
||||
f 92 93 113 112
|
||||
f 93 94 114 113
|
||||
f 94 95 115 114
|
||||
f 95 96 116 115
|
||||
f 96 97 117 116
|
||||
f 97 98 118 117
|
||||
f 98 99 119 118
|
||||
f 99 100 120 119
|
||||
f 100 101 121 120
|
||||
f 101 102 122 121
|
||||
f 102 83 103 122
|
||||
f 103 104 124 123
|
||||
f 104 105 125 124
|
||||
f 105 106 126 125
|
||||
f 106 107 127 126
|
||||
f 107 108 128 127
|
||||
f 108 109 129 128
|
||||
f 109 110 130 129
|
||||
f 110 111 131 130
|
||||
f 111 112 132 131
|
||||
f 112 113 133 132
|
||||
f 113 114 134 133
|
||||
f 114 115 135 134
|
||||
f 115 116 136 135
|
||||
f 116 117 137 136
|
||||
f 117 118 138 137
|
||||
f 118 119 139 138
|
||||
f 119 120 140 139
|
||||
f 120 121 141 140
|
||||
f 121 122 142 141
|
||||
f 122 103 123 142
|
||||
f 123 124 144 143
|
||||
f 124 125 145 144
|
||||
f 125 126 146 145
|
||||
f 126 127 147 146
|
||||
f 127 128 148 147
|
||||
f 128 129 149 148
|
||||
f 129 130 150 149
|
||||
f 130 131 151 150
|
||||
f 131 132 152 151
|
||||
f 132 133 153 152
|
||||
f 133 134 154 153
|
||||
f 134 135 155 154
|
||||
f 135 136 156 155
|
||||
f 136 137 157 156
|
||||
f 137 138 158 157
|
||||
f 138 139 159 158
|
||||
f 139 140 160 159
|
||||
f 140 141 161 160
|
||||
f 141 142 162 161
|
||||
f 142 123 143 162
|
||||
f 143 144 164 163
|
||||
f 144 145 165 164
|
||||
f 145 146 166 165
|
||||
f 146 147 167 166
|
||||
f 147 148 168 167
|
||||
f 148 149 169 168
|
||||
f 149 150 170 169
|
||||
f 150 151 171 170
|
||||
f 151 152 172 171
|
||||
f 152 153 173 172
|
||||
f 153 154 174 173
|
||||
f 154 155 175 174
|
||||
f 155 156 176 175
|
||||
f 156 157 177 176
|
||||
f 157 158 178 177
|
||||
f 158 159 179 178
|
||||
f 159 160 180 179
|
||||
f 160 161 181 180
|
||||
f 161 162 182 181
|
||||
f 162 143 163 182
|
||||
f 163 164 184 183
|
||||
f 164 165 185 184
|
||||
f 165 166 186 185
|
||||
f 166 167 187 186
|
||||
f 167 168 188 187
|
||||
f 168 169 189 188
|
||||
f 169 170 190 189
|
||||
f 170 171 191 190
|
||||
f 171 172 192 191
|
||||
f 172 173 193 192
|
||||
f 173 174 194 193
|
||||
f 174 175 195 194
|
||||
f 175 176 196 195
|
||||
f 176 177 197 196
|
||||
f 177 178 198 197
|
||||
f 178 179 199 198
|
||||
f 179 180 200 199
|
||||
f 180 181 201 200
|
||||
f 181 182 202 201
|
||||
f 182 163 183 202
|
||||
f 1 4 3
|
||||
f 2 183 184
|
||||
f 1 5 4
|
||||
f 2 184 185
|
||||
f 1 6 5
|
||||
f 2 185 186
|
||||
f 1 7 6
|
||||
f 2 186 187
|
||||
f 1 8 7
|
||||
f 2 187 188
|
||||
f 1 9 8
|
||||
f 2 188 189
|
||||
f 1 10 9
|
||||
f 2 189 190
|
||||
f 1 11 10
|
||||
f 2 190 191
|
||||
f 1 12 11
|
||||
f 2 191 192
|
||||
f 1 13 12
|
||||
f 2 192 193
|
||||
f 1 14 13
|
||||
f 2 193 194
|
||||
f 1 15 14
|
||||
f 2 194 195
|
||||
f 1 16 15
|
||||
f 2 195 196
|
||||
f 1 17 16
|
||||
f 2 196 197
|
||||
f 1 18 17
|
||||
f 2 197 198
|
||||
f 1 19 18
|
||||
f 2 198 199
|
||||
f 1 20 19
|
||||
f 2 199 200
|
||||
f 1 21 20
|
||||
f 2 200 201
|
||||
f 1 22 21
|
||||
f 2 201 202
|
||||
f 1 3 22
|
||||
f 2 202 183
|
602
data/spheres/6.obj
Normal file
602
data/spheres/6.obj
Normal file
@ -0,0 +1,602 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 23.9315 97.0942 5.88009e-39
|
||||
v 23.1161 97.0942 6.19394
|
||||
v 20.7253 97.0942 11.9658
|
||||
v 16.9222 97.0942 16.9221
|
||||
v 11.9658 97.0942 20.7253
|
||||
v 6.19396 97.0942 23.1161
|
||||
v 3.03354e-05 97.0942 23.9315
|
||||
v -6.19391 97.0942 23.1161
|
||||
v -11.9657 97.0942 20.7253
|
||||
v -16.9221 97.0942 16.9222
|
||||
v -20.7253 97.0942 11.9658
|
||||
v -23.1161 97.0942 6.19399
|
||||
v -23.9315 97.0942 6.06708e-05
|
||||
v -23.1161 97.0942 -6.19388
|
||||
v -20.7254 97.0942 -11.9657
|
||||
v -16.9222 97.0942 -16.9221
|
||||
v -11.9658 97.0942 -20.7253
|
||||
v -6.19402 97.0942 -23.1161
|
||||
v -9.10062e-05 97.0942 -23.9315
|
||||
v 6.19385 97.0942 -23.1161
|
||||
v 11.9657 97.0942 -20.7254
|
||||
v 16.9221 97.0942 -16.9222
|
||||
v 20.7253 97.0942 -11.9659
|
||||
v 23.1161 97.0942 -6.19405
|
||||
v 46.4723 88.5456 5.88009e-39
|
||||
v 44.8888 88.5456 12.0279
|
||||
v 40.2462 88.5456 23.2361
|
||||
v 32.8609 88.5456 32.8608
|
||||
v 23.2362 88.5456 40.2462
|
||||
v 12.028 88.5456 44.8888
|
||||
v 5.89078e-05 88.5456 46.4723
|
||||
v -12.0278 88.5456 44.8888
|
||||
v -23.2361 88.5456 40.2462
|
||||
v -32.8608 88.5456 32.8609
|
||||
v -40.2461 88.5456 23.2362
|
||||
v -44.8888 88.5456 12.028
|
||||
v -46.4723 88.5456 0.000117816
|
||||
v -44.8888 88.5456 -12.0278
|
||||
v -40.2462 88.5456 -23.236
|
||||
v -32.861 88.5456 -32.8608
|
||||
v -23.2363 88.5456 -40.2461
|
||||
v -12.0281 88.5456 -44.8887
|
||||
v -0.000176724 88.5456 -46.4723
|
||||
v 12.0277 88.5456 -44.8888
|
||||
v 23.236 88.5456 -40.2463
|
||||
v 32.8607 88.5456 -32.861
|
||||
v 40.2461 88.5456 -23.2363
|
||||
v 44.8887 88.5456 -12.0281
|
||||
v 66.3122 74.8511 5.88009e-39
|
||||
v 64.0527 74.8511 17.1629
|
||||
v 57.4281 74.8511 33.1561
|
||||
v 46.8899 74.8511 46.8898
|
||||
v 33.1562 74.8511 57.428
|
||||
v 17.1629 74.8511 64.0527
|
||||
v 8.40568e-05 74.8511 66.3122
|
||||
v -17.1628 74.8511 64.0527
|
||||
v -33.156 74.8511 57.4281
|
||||
v -46.8897 74.8511 46.8899
|
||||
v -57.428 74.8511 33.1562
|
||||
v -64.0527 74.8511 17.163
|
||||
v -66.3122 74.8511 0.000168114
|
||||
v -64.0527 74.8511 -17.1627
|
||||
v -57.4282 74.8511 -33.1559
|
||||
v -46.89 74.8511 -46.8897
|
||||
v -33.1563 74.8511 -57.428
|
||||
v -17.1631 74.8511 -64.0526
|
||||
v -0.00025217 74.8511 -66.3122
|
||||
v 17.1626 74.8511 -64.0528
|
||||
v 33.1559 74.8511 -57.4282
|
||||
v 46.8896 74.8511 -46.89
|
||||
v 57.4279 74.8511 -33.1564
|
||||
v 64.0526 74.8511 -17.1632
|
||||
v 82.2983 56.8065 5.88009e-39
|
||||
v 79.4941 56.8065 21.3004
|
||||
v 71.2725 56.8065 41.1491
|
||||
v 58.1938 56.8065 58.1937
|
||||
v 41.1492 56.8065 71.2724
|
||||
v 21.3005 56.8065 79.4941
|
||||
v 0.000104321 56.8065 82.2983
|
||||
v -21.3003 56.8065 79.4941
|
||||
v -41.1491 56.8065 71.2725
|
||||
v -58.1936 56.8065 58.1938
|
||||
v -71.2724 56.8065 41.1493
|
||||
v -79.494 56.8065 21.3006
|
||||
v -82.2983 56.8065 0.000208641
|
||||
v -79.4942 56.8065 -21.3002
|
||||
v -71.2726 56.8065 -41.149
|
||||
v -58.1939 56.8065 -58.1936
|
||||
v -41.1494 56.8065 -71.2723
|
||||
v -21.3006 56.8065 -79.494
|
||||
v -0.000312962 56.8065 -82.2983
|
||||
v 21.3001 56.8065 -79.4942
|
||||
v 41.1489 56.8065 -71.2726
|
||||
v 58.1935 56.8065 -58.194
|
||||
v 71.2723 56.8065 -41.1495
|
||||
v 79.494 56.8065 -21.3007
|
||||
v 93.5016 35.4606 5.88009e-39
|
||||
v 90.3156 35.4606 24.2
|
||||
v 80.9748 35.4606 46.7508
|
||||
v 66.1157 35.4606 66.1156
|
||||
v 46.7509 35.4606 80.9747
|
||||
v 24.2001 35.4606 90.3156
|
||||
v 0.000118522 35.4606 93.5016
|
||||
v -24.1999 35.4606 90.3156
|
||||
v -46.7507 35.4606 80.9748
|
||||
v -66.1155 35.4606 66.1157
|
||||
v -80.9747 35.4606 46.751
|
||||
v -90.3156 35.4606 24.2002
|
||||
v -93.5016 35.4606 0.000237044
|
||||
v -90.3157 35.4606 -24.1998
|
||||
v -80.9749 35.4606 -46.7506
|
||||
v -66.1158 35.4606 -66.1154
|
||||
v -46.7511 35.4606 -80.9746
|
||||
v -24.2003 35.4606 -90.3155
|
||||
v -0.000355565 35.4606 -93.5016
|
||||
v 24.1996 35.4606 -90.3157
|
||||
v 46.7505 35.4606 -80.9749
|
||||
v 66.1153 35.4606 -66.1159
|
||||
v 80.9745 35.4606 -46.7512
|
||||
v 90.3155 35.4606 -24.2004
|
||||
v 99.2709 12.0538 5.88009e-39
|
||||
v 95.8883 12.0538 25.6932
|
||||
v 85.9711 12.0538 49.6354
|
||||
v 70.1952 12.0538 70.1951
|
||||
v 49.6355 12.0538 85.9711
|
||||
v 25.6933 12.0538 95.8883
|
||||
v 0.000125835 12.0538 99.2709
|
||||
v -25.6931 12.0538 95.8883
|
||||
v -49.6353 12.0538 85.9712
|
||||
v -70.195 12.0538 70.1952
|
||||
v -85.971 12.0538 49.6356
|
||||
v -95.8882 12.0538 25.6934
|
||||
v -99.2709 12.0538 0.00025167
|
||||
v -95.8884 12.0538 -25.6929
|
||||
v -85.9712 12.0538 -49.6352
|
||||
v -70.1953 12.0538 -70.1949
|
||||
v -49.6357 12.0538 -85.9709
|
||||
v -25.6935 12.0538 -95.8882
|
||||
v -0.000377505 12.0538 -99.2709
|
||||
v 25.6928 12.0538 -95.8884
|
||||
v 49.6351 12.0538 -85.9713
|
||||
v 70.1948 12.0538 -70.1954
|
||||
v 85.9709 12.0538 -49.6358
|
||||
v 95.8882 12.0538 -25.6936
|
||||
v 99.2709 -12.0535 5.88009e-39
|
||||
v 95.8883 -12.0535 25.6932
|
||||
v 85.9711 -12.0535 49.6354
|
||||
v 70.1952 -12.0535 70.1951
|
||||
v 49.6355 -12.0535 85.9711
|
||||
v 25.6933 -12.0535 95.8883
|
||||
v 0.000125835 -12.0535 99.2709
|
||||
v -25.6931 -12.0535 95.8884
|
||||
v -49.6353 -12.0535 85.9712
|
||||
v -70.195 -12.0535 70.1953
|
||||
v -85.971 -12.0535 49.6356
|
||||
v -95.8883 -12.0535 25.6934
|
||||
v -99.2709 -12.0535 0.00025167
|
||||
v -95.8884 -12.0535 -25.693
|
||||
v -85.9713 -12.0535 -49.6352
|
||||
v -70.1953 -12.0535 -70.1949
|
||||
v -49.6357 -12.0535 -85.971
|
||||
v -25.6935 -12.0535 -95.8882
|
||||
v -0.000377505 -12.0535 -99.2709
|
||||
v 25.6928 -12.0535 -95.8884
|
||||
v 49.6351 -12.0535 -85.9713
|
||||
v 70.1948 -12.0535 -70.1954
|
||||
v 85.9709 -12.0535 -49.6358
|
||||
v 95.8882 -12.0535 -25.6936
|
||||
v 93.5017 -35.4604 5.88009e-39
|
||||
v 90.3157 -35.4604 24.2
|
||||
v 80.9748 -35.4604 46.7508
|
||||
v 66.1157 -35.4604 66.1156
|
||||
v 46.7509 -35.4604 80.9748
|
||||
v 24.2001 -35.4604 90.3157
|
||||
v 0.000118522 -35.4604 93.5017
|
||||
v -24.1999 -35.4604 90.3157
|
||||
v -46.7507 -35.4604 80.9749
|
||||
v -66.1155 -35.4604 66.1158
|
||||
v -80.9747 -35.4604 46.751
|
||||
v -90.3156 -35.4604 24.2002
|
||||
v -93.5017 -35.4604 0.000237044
|
||||
v -90.3158 -35.4604 -24.1998
|
||||
v -80.975 -35.4604 -46.7506
|
||||
v -66.1159 -35.4604 -66.1155
|
||||
v -46.7511 -35.4604 -80.9747
|
||||
v -24.2003 -35.4604 -90.3156
|
||||
v -0.000355566 -35.4604 -93.5017
|
||||
v 24.1997 -35.4604 -90.3158
|
||||
v 46.7505 -35.4604 -80.975
|
||||
v 66.1154 -35.4604 -66.116
|
||||
v 80.9746 -35.4604 -46.7512
|
||||
v 90.3156 -35.4604 -24.2004
|
||||
v 82.2985 -56.8063 5.88009e-39
|
||||
v 79.4942 -56.8063 21.3004
|
||||
v 71.2726 -56.8063 41.1492
|
||||
v 58.1939 -56.8063 58.1938
|
||||
v 41.1493 -56.8063 71.2725
|
||||
v 21.3005 -56.8063 79.4942
|
||||
v 0.000104321 -56.8063 82.2985
|
||||
v -21.3003 -56.8063 79.4943
|
||||
v -41.1491 -56.8063 71.2726
|
||||
v -58.1937 -56.8063 58.1939
|
||||
v -71.2725 -56.8063 41.1494
|
||||
v -79.4942 -56.8063 21.3006
|
||||
v -82.2985 -56.8063 0.000208642
|
||||
v -79.4943 -56.8063 -21.3002
|
||||
v -71.2727 -56.8063 -41.149
|
||||
v -58.194 -56.8063 -58.1936
|
||||
v -41.1495 -56.8063 -71.2724
|
||||
v -21.3007 -56.8063 -79.4942
|
||||
v -0.000312962 -56.8063 -82.2985
|
||||
v 21.3001 -56.8063 -79.4943
|
||||
v 41.149 -56.8063 -71.2727
|
||||
v 58.1936 -56.8063 -58.1941
|
||||
v 71.2724 -56.8063 -41.1496
|
||||
v 79.4941 -56.8063 -21.3008
|
||||
v 66.3124 -74.851 5.88009e-39
|
||||
v 64.0529 -74.851 17.1629
|
||||
v 57.4282 -74.851 33.1562
|
||||
v 46.89 -74.851 46.8899
|
||||
v 33.1562 -74.851 57.4282
|
||||
v 17.163 -74.851 64.0528
|
||||
v 8.4057e-05 -74.851 66.3124
|
||||
v -17.1628 -74.851 64.0529
|
||||
v -33.1561 -74.851 57.4283
|
||||
v -46.8899 -74.851 46.89
|
||||
v -57.4282 -74.851 33.1563
|
||||
v -64.0528 -74.851 17.1631
|
||||
v -66.3124 -74.851 0.000168114
|
||||
v -64.0529 -74.851 -17.1627
|
||||
v -57.4283 -74.851 -33.156
|
||||
v -46.8901 -74.851 -46.8898
|
||||
v -33.1564 -74.851 -57.4281
|
||||
v -17.1631 -74.851 -64.0528
|
||||
v -0.000252171 -74.851 -66.3124
|
||||
v 17.1627 -74.851 -64.0529
|
||||
v 33.156 -74.851 -57.4284
|
||||
v 46.8897 -74.851 -46.8902
|
||||
v 57.4281 -74.851 -33.1565
|
||||
v 64.0528 -74.851 -17.1632
|
||||
v 46.4725 -88.5455 5.88009e-39
|
||||
v 44.889 -88.5455 12.028
|
||||
v 40.2464 -88.5455 23.2362
|
||||
v 32.861 -88.5455 32.861
|
||||
v 23.2363 -88.5455 40.2463
|
||||
v 12.028 -88.5455 44.889
|
||||
v 5.89081e-05 -88.5455 46.4725
|
||||
v -12.0279 -88.5455 44.889
|
||||
v -23.2362 -88.5455 40.2464
|
||||
v -32.861 -88.5455 32.8611
|
||||
v -40.2463 -88.5455 23.2363
|
||||
v -44.889 -88.5455 12.0281
|
||||
v -46.4725 -88.5455 0.000117816
|
||||
v -44.889 -88.5455 -12.0279
|
||||
v -40.2464 -88.5455 -23.2361
|
||||
v -32.8611 -88.5455 -32.8609
|
||||
v -23.2364 -88.5455 -40.2463
|
||||
v -12.0281 -88.5455 -44.8889
|
||||
v -0.000176724 -88.5455 -46.4725
|
||||
v 12.0278 -88.5455 -44.889
|
||||
v 23.2361 -88.5455 -40.2465
|
||||
v 32.8609 -88.5455 -32.8612
|
||||
v 40.2463 -88.5455 -23.2364
|
||||
v 44.8889 -88.5455 -12.0282
|
||||
v 23.9318 -97.0941 5.88009e-39
|
||||
v 23.1163 -97.0941 6.19399
|
||||
v 20.7255 -97.0941 11.9659
|
||||
v 16.9223 -97.0941 16.9223
|
||||
v 11.9659 -97.0941 20.7255
|
||||
v 6.19402 -97.0941 23.1163
|
||||
v 3.03357e-05 -97.0941 23.9318
|
||||
v -6.19397 -97.0941 23.1163
|
||||
v -11.9659 -97.0941 20.7255
|
||||
v -16.9223 -97.0941 16.9224
|
||||
v -20.7255 -97.0941 11.9659
|
||||
v -23.1163 -97.0941 6.19405
|
||||
v -23.9318 -97.0941 6.06714e-05
|
||||
v -23.1163 -97.0941 -6.19394
|
||||
v -20.7256 -97.0941 -11.9658
|
||||
v -16.9224 -97.0941 -16.9223
|
||||
v -11.966 -97.0941 -20.7255
|
||||
v -6.19408 -97.0941 -23.1163
|
||||
v -9.10071e-05 -97.0941 -23.9318
|
||||
v 6.19391 -97.0941 -23.1163
|
||||
v 11.9658 -97.0941 -20.7256
|
||||
v 16.9222 -97.0941 -16.9224
|
||||
v 20.7255 -97.0941 -11.966
|
||||
v 23.1163 -97.0941 -6.1941
|
||||
f 3 4 28 27
|
||||
f 4 5 29 28
|
||||
f 5 6 30 29
|
||||
f 6 7 31 30
|
||||
f 7 8 32 31
|
||||
f 8 9 33 32
|
||||
f 9 10 34 33
|
||||
f 10 11 35 34
|
||||
f 11 12 36 35
|
||||
f 12 13 37 36
|
||||
f 13 14 38 37
|
||||
f 14 15 39 38
|
||||
f 15 16 40 39
|
||||
f 16 17 41 40
|
||||
f 17 18 42 41
|
||||
f 18 19 43 42
|
||||
f 19 20 44 43
|
||||
f 20 21 45 44
|
||||
f 21 22 46 45
|
||||
f 22 23 47 46
|
||||
f 23 24 48 47
|
||||
f 24 25 49 48
|
||||
f 25 26 50 49
|
||||
f 26 3 27 50
|
||||
f 27 28 52 51
|
||||
f 28 29 53 52
|
||||
f 29 30 54 53
|
||||
f 30 31 55 54
|
||||
f 31 32 56 55
|
||||
f 32 33 57 56
|
||||
f 33 34 58 57
|
||||
f 34 35 59 58
|
||||
f 35 36 60 59
|
||||
f 36 37 61 60
|
||||
f 37 38 62 61
|
||||
f 38 39 63 62
|
||||
f 39 40 64 63
|
||||
f 40 41 65 64
|
||||
f 41 42 66 65
|
||||
f 42 43 67 66
|
||||
f 43 44 68 67
|
||||
f 44 45 69 68
|
||||
f 45 46 70 69
|
||||
f 46 47 71 70
|
||||
f 47 48 72 71
|
||||
f 48 49 73 72
|
||||
f 49 50 74 73
|
||||
f 50 27 51 74
|
||||
f 51 52 76 75
|
||||
f 52 53 77 76
|
||||
f 53 54 78 77
|
||||
f 54 55 79 78
|
||||
f 55 56 80 79
|
||||
f 56 57 81 80
|
||||
f 57 58 82 81
|
||||
f 58 59 83 82
|
||||
f 59 60 84 83
|
||||
f 60 61 85 84
|
||||
f 61 62 86 85
|
||||
f 62 63 87 86
|
||||
f 63 64 88 87
|
||||
f 64 65 89 88
|
||||
f 65 66 90 89
|
||||
f 66 67 91 90
|
||||
f 67 68 92 91
|
||||
f 68 69 93 92
|
||||
f 69 70 94 93
|
||||
f 70 71 95 94
|
||||
f 71 72 96 95
|
||||
f 72 73 97 96
|
||||
f 73 74 98 97
|
||||
f 74 51 75 98
|
||||
f 75 76 100 99
|
||||
f 76 77 101 100
|
||||
f 77 78 102 101
|
||||
f 78 79 103 102
|
||||
f 79 80 104 103
|
||||
f 80 81 105 104
|
||||
f 81 82 106 105
|
||||
f 82 83 107 106
|
||||
f 83 84 108 107
|
||||
f 84 85 109 108
|
||||
f 85 86 110 109
|
||||
f 86 87 111 110
|
||||
f 87 88 112 111
|
||||
f 88 89 113 112
|
||||
f 89 90 114 113
|
||||
f 90 91 115 114
|
||||
f 91 92 116 115
|
||||
f 92 93 117 116
|
||||
f 93 94 118 117
|
||||
f 94 95 119 118
|
||||
f 95 96 120 119
|
||||
f 96 97 121 120
|
||||
f 97 98 122 121
|
||||
f 98 75 99 122
|
||||
f 99 100 124 123
|
||||
f 100 101 125 124
|
||||
f 101 102 126 125
|
||||
f 102 103 127 126
|
||||
f 103 104 128 127
|
||||
f 104 105 129 128
|
||||
f 105 106 130 129
|
||||
f 106 107 131 130
|
||||
f 107 108 132 131
|
||||
f 108 109 133 132
|
||||
f 109 110 134 133
|
||||
f 110 111 135 134
|
||||
f 111 112 136 135
|
||||
f 112 113 137 136
|
||||
f 113 114 138 137
|
||||
f 114 115 139 138
|
||||
f 115 116 140 139
|
||||
f 116 117 141 140
|
||||
f 117 118 142 141
|
||||
f 118 119 143 142
|
||||
f 119 120 144 143
|
||||
f 120 121 145 144
|
||||
f 121 122 146 145
|
||||
f 122 99 123 146
|
||||
f 123 124 148 147
|
||||
f 124 125 149 148
|
||||
f 125 126 150 149
|
||||
f 126 127 151 150
|
||||
f 127 128 152 151
|
||||
f 128 129 153 152
|
||||
f 129 130 154 153
|
||||
f 130 131 155 154
|
||||
f 131 132 156 155
|
||||
f 132 133 157 156
|
||||
f 133 134 158 157
|
||||
f 134 135 159 158
|
||||
f 135 136 160 159
|
||||
f 136 137 161 160
|
||||
f 137 138 162 161
|
||||
f 138 139 163 162
|
||||
f 139 140 164 163
|
||||
f 140 141 165 164
|
||||
f 141 142 166 165
|
||||
f 142 143 167 166
|
||||
f 143 144 168 167
|
||||
f 144 145 169 168
|
||||
f 145 146 170 169
|
||||
f 146 123 147 170
|
||||
f 147 148 172 171
|
||||
f 148 149 173 172
|
||||
f 149 150 174 173
|
||||
f 150 151 175 174
|
||||
f 151 152 176 175
|
||||
f 152 153 177 176
|
||||
f 153 154 178 177
|
||||
f 154 155 179 178
|
||||
f 155 156 180 179
|
||||
f 156 157 181 180
|
||||
f 157 158 182 181
|
||||
f 158 159 183 182
|
||||
f 159 160 184 183
|
||||
f 160 161 185 184
|
||||
f 161 162 186 185
|
||||
f 162 163 187 186
|
||||
f 163 164 188 187
|
||||
f 164 165 189 188
|
||||
f 165 166 190 189
|
||||
f 166 167 191 190
|
||||
f 167 168 192 191
|
||||
f 168 169 193 192
|
||||
f 169 170 194 193
|
||||
f 170 147 171 194
|
||||
f 171 172 196 195
|
||||
f 172 173 197 196
|
||||
f 173 174 198 197
|
||||
f 174 175 199 198
|
||||
f 175 176 200 199
|
||||
f 176 177 201 200
|
||||
f 177 178 202 201
|
||||
f 178 179 203 202
|
||||
f 179 180 204 203
|
||||
f 180 181 205 204
|
||||
f 181 182 206 205
|
||||
f 182 183 207 206
|
||||
f 183 184 208 207
|
||||
f 184 185 209 208
|
||||
f 185 186 210 209
|
||||
f 186 187 211 210
|
||||
f 187 188 212 211
|
||||
f 188 189 213 212
|
||||
f 189 190 214 213
|
||||
f 190 191 215 214
|
||||
f 191 192 216 215
|
||||
f 192 193 217 216
|
||||
f 193 194 218 217
|
||||
f 194 171 195 218
|
||||
f 195 196 220 219
|
||||
f 196 197 221 220
|
||||
f 197 198 222 221
|
||||
f 198 199 223 222
|
||||
f 199 200 224 223
|
||||
f 200 201 225 224
|
||||
f 201 202 226 225
|
||||
f 202 203 227 226
|
||||
f 203 204 228 227
|
||||
f 204 205 229 228
|
||||
f 205 206 230 229
|
||||
f 206 207 231 230
|
||||
f 207 208 232 231
|
||||
f 208 209 233 232
|
||||
f 209 210 234 233
|
||||
f 210 211 235 234
|
||||
f 211 212 236 235
|
||||
f 212 213 237 236
|
||||
f 213 214 238 237
|
||||
f 214 215 239 238
|
||||
f 215 216 240 239
|
||||
f 216 217 241 240
|
||||
f 217 218 242 241
|
||||
f 218 195 219 242
|
||||
f 219 220 244 243
|
||||
f 220 221 245 244
|
||||
f 221 222 246 245
|
||||
f 222 223 247 246
|
||||
f 223 224 248 247
|
||||
f 224 225 249 248
|
||||
f 225 226 250 249
|
||||
f 226 227 251 250
|
||||
f 227 228 252 251
|
||||
f 228 229 253 252
|
||||
f 229 230 254 253
|
||||
f 230 231 255 254
|
||||
f 231 232 256 255
|
||||
f 232 233 257 256
|
||||
f 233 234 258 257
|
||||
f 234 235 259 258
|
||||
f 235 236 260 259
|
||||
f 236 237 261 260
|
||||
f 237 238 262 261
|
||||
f 238 239 263 262
|
||||
f 239 240 264 263
|
||||
f 240 241 265 264
|
||||
f 241 242 266 265
|
||||
f 242 219 243 266
|
||||
f 243 244 268 267
|
||||
f 244 245 269 268
|
||||
f 245 246 270 269
|
||||
f 246 247 271 270
|
||||
f 247 248 272 271
|
||||
f 248 249 273 272
|
||||
f 249 250 274 273
|
||||
f 250 251 275 274
|
||||
f 251 252 276 275
|
||||
f 252 253 277 276
|
||||
f 253 254 278 277
|
||||
f 254 255 279 278
|
||||
f 255 256 280 279
|
||||
f 256 257 281 280
|
||||
f 257 258 282 281
|
||||
f 258 259 283 282
|
||||
f 259 260 284 283
|
||||
f 260 261 285 284
|
||||
f 261 262 286 285
|
||||
f 262 263 287 286
|
||||
f 263 264 288 287
|
||||
f 264 265 289 288
|
||||
f 265 266 290 289
|
||||
f 266 243 267 290
|
||||
f 1 4 3
|
||||
f 2 267 268
|
||||
f 1 5 4
|
||||
f 2 268 269
|
||||
f 1 6 5
|
||||
f 2 269 270
|
||||
f 1 7 6
|
||||
f 2 270 271
|
||||
f 1 8 7
|
||||
f 2 271 272
|
||||
f 1 9 8
|
||||
f 2 272 273
|
||||
f 1 10 9
|
||||
f 2 273 274
|
||||
f 1 11 10
|
||||
f 2 274 275
|
||||
f 1 12 11
|
||||
f 2 275 276
|
||||
f 1 13 12
|
||||
f 2 276 277
|
||||
f 1 14 13
|
||||
f 2 277 278
|
||||
f 1 15 14
|
||||
f 2 278 279
|
||||
f 1 16 15
|
||||
f 2 279 280
|
||||
f 1 17 16
|
||||
f 2 280 281
|
||||
f 1 18 17
|
||||
f 2 281 282
|
||||
f 1 19 18
|
||||
f 2 282 283
|
||||
f 1 20 19
|
||||
f 2 283 284
|
||||
f 1 21 20
|
||||
f 2 284 285
|
||||
f 1 22 21
|
||||
f 2 285 286
|
||||
f 1 23 22
|
||||
f 2 286 287
|
||||
f 1 24 23
|
||||
f 2 287 288
|
||||
f 1 25 24
|
||||
f 2 288 289
|
||||
f 1 26 25
|
||||
f 2 289 290
|
||||
f 1 3 26
|
||||
f 2 290 267
|
814
data/spheres/7.obj
Normal file
814
data/spheres/7.obj
Normal file
@ -0,0 +1,814 @@
|
||||
v 5.88231e-39 100 5.88009e-39
|
||||
v 5.88231e-39 -100 5.88009e-39
|
||||
v 20.7912 97.8148 5.88009e-39
|
||||
v 20.2699 97.8148 4.62646
|
||||
v 18.7322 97.8148 9.02094
|
||||
v 16.2552 97.8148 12.9631
|
||||
v 12.9631 97.8148 16.2552
|
||||
v 9.02096 97.8148 18.7322
|
||||
v 4.62649 97.8148 20.2699
|
||||
v 2.63547e-05 97.8148 20.7912
|
||||
v -4.62644 97.8148 20.2699
|
||||
v -9.02091 97.8148 18.7322
|
||||
v -12.963 97.8148 16.2552
|
||||
v -16.2552 97.8148 12.9631
|
||||
v -18.7322 97.8148 9.02099
|
||||
v -20.2699 97.8148 4.62652
|
||||
v -20.7912 97.8148 5.27093e-05
|
||||
v -20.2699 97.8148 -4.62641
|
||||
v -18.7322 97.8148 -9.02089
|
||||
v -16.2552 97.8148 -12.963
|
||||
v -12.9631 97.8148 -16.2551
|
||||
v -9.02101 97.8148 -18.7321
|
||||
v -4.62654 97.8148 -20.2699
|
||||
v -7.9064e-05 97.8148 -20.7912
|
||||
v 4.62639 97.8148 -20.2699
|
||||
v 9.02087 97.8148 -18.7322
|
||||
v 12.963 97.8148 -16.2552
|
||||
v 16.2551 97.8148 -12.9631
|
||||
v 18.7321 97.8148 -9.02103
|
||||
v 20.2699 97.8148 -4.62656
|
||||
v 40.6736 91.3546 5.88009e-39
|
||||
v 39.6539 91.3546 9.05073
|
||||
v 36.6457 91.3546 17.6476
|
||||
v 31.7999 91.3546 25.3596
|
||||
v 25.3596 91.3546 31.7999
|
||||
v 17.6477 91.3546 36.6457
|
||||
v 9.05078 91.3546 39.6539
|
||||
v 5.15575e-05 91.3546 40.6736
|
||||
v -9.05068 91.3546 39.6539
|
||||
v -17.6476 91.3546 36.6457
|
||||
v -25.3595 91.3546 31.8
|
||||
v -31.7999 91.3546 25.3597
|
||||
v -36.6456 91.3546 17.6477
|
||||
v -39.6538 91.3546 9.05083
|
||||
v -40.6736 91.3546 0.000103115
|
||||
v -39.6539 91.3546 -9.05063
|
||||
v -36.6457 91.3546 -17.6475
|
||||
v -31.8 91.3546 -25.3595
|
||||
v -25.3597 91.3546 -31.7998
|
||||
v -17.6478 91.3546 -36.6456
|
||||
v -9.05087 91.3546 -39.6538
|
||||
v -0.000154673 91.3546 -40.6736
|
||||
v 9.05059 91.3546 -39.6539
|
||||
v 17.6475 91.3546 -36.6457
|
||||
v 25.3595 91.3546 -31.8
|
||||
v 31.7998 91.3546 -25.3597
|
||||
v 36.6456 91.3546 -17.6478
|
||||
v 39.6538 91.3546 -9.05092
|
||||
v 58.7785 80.9017 5.88009e-39
|
||||
v 57.3048 80.9017 13.0794
|
||||
v 52.9576 80.9017 25.503
|
||||
v 45.9549 80.9017 36.6478
|
||||
v 36.6478 80.9017 45.9548
|
||||
v 25.5031 80.9017 52.9576
|
||||
v 13.0795 80.9017 57.3048
|
||||
v 7.45071e-05 80.9017 58.7785
|
||||
v -13.0794 80.9017 57.3048
|
||||
v -25.5029 80.9017 52.9576
|
||||
v -36.6477 80.9017 45.9549
|
||||
v -45.9548 80.9017 36.6479
|
||||
v -52.9575 80.9017 25.5031
|
||||
v -57.3048 80.9017 13.0796
|
||||
v -58.7785 80.9017 0.000149014
|
||||
v -57.3048 80.9017 -13.0793
|
||||
v -52.9577 80.9017 -25.5029
|
||||
v -45.955 80.9017 -36.6477
|
||||
v -36.6479 80.9017 -45.9548
|
||||
v -25.5032 80.9017 -52.9575
|
||||
v -13.0796 80.9017 -57.3047
|
||||
v -0.000223521 80.9017 -58.7785
|
||||
v 13.0792 80.9017 -57.3048
|
||||
v 25.5028 80.9017 -52.9577
|
||||
v 36.6476 80.9017 -45.955
|
||||
v 45.9547 80.9017 -36.648
|
||||
v 52.9575 80.9017 -25.5033
|
||||
v 57.3047 80.9017 -13.0797
|
||||
v 74.3144 66.9131 5.88009e-39
|
||||
v 72.4512 66.9131 16.5365
|
||||
v 66.955 66.9131 32.2438
|
||||
v 58.1014 66.9131 46.3343
|
||||
v 46.3343 66.9131 58.1013
|
||||
v 32.2439 66.9131 66.955
|
||||
v 16.5366 66.9131 72.4512
|
||||
v 9.42003e-05 66.9131 74.3144
|
||||
v -16.5364 66.9131 72.4512
|
||||
v -32.2437 66.9131 66.955
|
||||
v -46.3342 66.9131 58.1014
|
||||
v -58.1013 66.9131 46.3344
|
||||
v -66.9549 66.9131 32.244
|
||||
v -72.4512 66.9131 16.5367
|
||||
v -74.3144 66.9131 0.000188401
|
||||
v -72.4513 66.9131 -16.5363
|
||||
v -66.9551 66.9131 -32.2436
|
||||
v -58.1015 66.9131 -46.3341
|
||||
v -46.3345 66.9131 -58.1012
|
||||
v -32.2441 66.9131 -66.9549
|
||||
v -16.5368 66.9131 -72.4512
|
||||
v -0.000282601 66.9131 -74.3144
|
||||
v 16.5362 66.9131 -72.4513
|
||||
v 32.2436 66.9131 -66.9551
|
||||
v 46.334 66.9131 -58.1016
|
||||
v 58.1012 66.9131 -46.3345
|
||||
v 66.9548 66.9131 -32.2441
|
||||
v 72.4511 66.9131 -16.5369
|
||||
v 86.6025 50.0001 5.88009e-39
|
||||
v 84.4312 50.0001 19.2709
|
||||
v 78.0262 50.0001 37.5754
|
||||
v 67.7086 50.0001 53.9957
|
||||
v 53.9958 50.0001 67.7085
|
||||
v 37.5755 50.0001 78.0261
|
||||
v 19.271 50.0001 84.4312
|
||||
v 0.000109777 50.0001 86.6025
|
||||
v -19.2708 50.0001 84.4312
|
||||
v -37.5753 50.0001 78.0262
|
||||
v -53.9957 50.0001 67.7087
|
||||
v -67.7085 50.0001 53.9959
|
||||
v -78.0261 50.0001 37.5756
|
||||
v -84.4312 50.0001 19.2711
|
||||
v -86.6025 50.0001 0.000219553
|
||||
v -84.4312 50.0001 -19.2706
|
||||
v -78.0263 50.0001 -37.5752
|
||||
v -67.7087 50.0001 -53.9956
|
||||
v -53.996 50.0001 -67.7084
|
||||
v -37.5757 50.0001 -78.026
|
||||
v -19.2712 50.0001 -84.4311
|
||||
v -0.00032933 50.0001 -86.6025
|
||||
v 19.2706 50.0001 -84.4313
|
||||
v 37.5751 50.0001 -78.0263
|
||||
v 53.9955 50.0001 -67.7088
|
||||
v 67.7083 50.0001 -53.9961
|
||||
v 78.026 50.0001 -37.5758
|
||||
v 84.4311 50.0001 -19.2713
|
||||
v 95.1056 30.9018 5.88009e-39
|
||||
v 92.7211 30.9018 21.163
|
||||
v 85.6872 30.9018 41.2648
|
||||
v 74.3566 30.9018 59.2973
|
||||
v 59.2974 30.9018 74.3565
|
||||
v 41.2649 30.9018 85.6872
|
||||
v 21.1631 30.9018 92.7211
|
||||
v 0.000120555 30.9018 95.1056
|
||||
v -21.1629 30.9018 92.7212
|
||||
v -41.2646 30.9018 85.6873
|
||||
v -59.2973 30.9018 74.3567
|
||||
v -74.3565 30.9018 59.2975
|
||||
v -85.6871 30.9018 41.265
|
||||
v -92.7211 30.9018 21.1632
|
||||
v -95.1056 30.9018 0.00024111
|
||||
v -92.7212 30.9018 -21.1627
|
||||
v -85.6873 30.9018 -41.2645
|
||||
v -74.3567 30.9018 -59.2972
|
||||
v -59.2976 30.9018 -74.3564
|
||||
v -41.2651 30.9018 -85.6871
|
||||
v -21.1633 30.9018 -92.7211
|
||||
v -0.000361665 30.9018 -95.1056
|
||||
v 21.1626 30.9018 -92.7212
|
||||
v 41.2644 30.9018 -85.6874
|
||||
v 59.2971 30.9018 -74.3568
|
||||
v 74.3563 30.9018 -59.2977
|
||||
v 85.687 30.9018 -41.2652
|
||||
v 92.721 30.9018 -21.1634
|
||||
v 99.4522 10.453 5.88009e-39
|
||||
v 96.9587 10.453 22.1302
|
||||
v 89.6033 10.453 43.1507
|
||||
v 77.7549 10.453 62.0074
|
||||
v 62.0075 10.453 77.7548
|
||||
v 43.1508 10.453 89.6033
|
||||
v 22.1303 10.453 96.9587
|
||||
v 0.000126065 10.453 99.4522
|
||||
v -22.1301 10.453 96.9587
|
||||
v -43.1505 10.453 89.6034
|
||||
v -62.0073 10.453 77.755
|
||||
v -77.7547 10.453 62.0076
|
||||
v -89.6032 10.453 43.1509
|
||||
v -96.9586 10.453 22.1304
|
||||
v -99.4522 10.453 0.000252129
|
||||
v -96.9588 10.453 -22.1299
|
||||
v -89.6034 10.453 -43.1504
|
||||
v -77.755 10.453 -62.0072
|
||||
v -62.0077 10.453 -77.7547
|
||||
v -43.151 10.453 -89.6032
|
||||
v -22.1305 10.453 -96.9586
|
||||
v -0.000378194 10.453 -99.4522
|
||||
v 22.1298 10.453 -96.9588
|
||||
v 43.1503 10.453 -89.6035
|
||||
v 62.0071 10.453 -77.7551
|
||||
v 77.7546 10.453 -62.0078
|
||||
v 89.6031 10.453 -43.1511
|
||||
v 96.9586 10.453 -22.1306
|
||||
v 99.4522 -10.4527 5.88009e-39
|
||||
v 96.9587 -10.4527 22.1302
|
||||
v 89.6034 -10.4527 43.1507
|
||||
v 77.7549 -10.4527 62.0074
|
||||
v 62.0075 -10.4527 77.7548
|
||||
v 43.1508 -10.4527 89.6033
|
||||
v 22.1303 -10.4527 96.9587
|
||||
v 0.000126065 -10.4527 99.4522
|
||||
v -22.1301 -10.4527 96.9588
|
||||
v -43.1506 -10.4527 89.6034
|
||||
v -62.0073 -10.4527 77.755
|
||||
v -77.7547 -10.4527 62.0076
|
||||
v -89.6032 -10.4527 43.1509
|
||||
v -96.9587 -10.4527 22.1304
|
||||
v -99.4522 -10.4527 0.000252129
|
||||
v -96.9588 -10.4527 -22.1299
|
||||
v -89.6035 -10.4527 -43.1504
|
||||
v -77.7551 -10.4527 -62.0072
|
||||
v -62.0077 -10.4527 -77.7547
|
||||
v -43.151 -10.4527 -89.6032
|
||||
v -22.1305 -10.4527 -96.9586
|
||||
v -0.000378194 -10.4527 -99.4522
|
||||
v 22.1298 -10.4527 -96.9588
|
||||
v 43.1503 -10.4527 -89.6035
|
||||
v 62.0071 -10.4527 -77.7551
|
||||
v 77.7546 -10.4527 -62.0078
|
||||
v 89.6031 -10.4527 -43.1511
|
||||
v 96.9586 -10.4527 -22.1307
|
||||
v 95.1057 -30.9016 5.88009e-39
|
||||
v 92.7212 -30.9016 21.163
|
||||
v 85.6873 -30.9016 41.2648
|
||||
v 74.3567 -30.9016 59.2974
|
||||
v 59.2975 -30.9016 74.3566
|
||||
v 41.2649 -30.9016 85.6872
|
||||
v 21.1631 -30.9016 92.7212
|
||||
v 0.000120555 -30.9016 95.1057
|
||||
v -21.1629 -30.9016 92.7212
|
||||
v -41.2647 -30.9016 85.6873
|
||||
v -59.2973 -30.9016 74.3567
|
||||
v -74.3565 -30.9016 59.2976
|
||||
v -85.6872 -30.9016 41.265
|
||||
v -92.7211 -30.9016 21.1632
|
||||
v -95.1057 -30.9016 0.00024111
|
||||
v -92.7213 -30.9016 -21.1628
|
||||
v -85.6874 -30.9016 -41.2646
|
||||
v -74.3568 -30.9016 -59.2972
|
||||
v -59.2977 -30.9016 -74.3564
|
||||
v -41.2651 -30.9016 -85.6871
|
||||
v -21.1633 -30.9016 -92.7211
|
||||
v -0.000361665 -30.9016 -95.1057
|
||||
v 21.1627 -30.9016 -92.7213
|
||||
v 41.2645 -30.9016 -85.6874
|
||||
v 59.2971 -30.9016 -74.3569
|
||||
v 74.3564 -30.9016 -59.2978
|
||||
v 85.6871 -30.9016 -41.2652
|
||||
v 92.7211 -30.9016 -21.1634
|
||||
v 86.6026 -49.9999 5.88009e-39
|
||||
v 84.4313 -49.9999 19.2709
|
||||
v 78.0263 -49.9999 37.5754
|
||||
v 67.7087 -49.9999 53.9958
|
||||
v 53.9959 -49.9999 67.7086
|
||||
v 37.5755 -49.9999 78.0262
|
||||
v 19.271 -49.9999 84.4313
|
||||
v 0.000109777 -49.9999 86.6026
|
||||
v -19.2708 -49.9999 84.4313
|
||||
v -37.5753 -49.9999 78.0263
|
||||
v -53.9957 -49.9999 67.7087
|
||||
v -67.7086 -49.9999 53.996
|
||||
v -78.0262 -49.9999 37.5756
|
||||
v -84.4313 -49.9999 19.2711
|
||||
v -86.6026 -49.9999 0.000219553
|
||||
v -84.4314 -49.9999 -19.2707
|
||||
v -78.0264 -49.9999 -37.5752
|
||||
v -67.7088 -49.9999 -53.9957
|
||||
v -53.9961 -49.9999 -67.7085
|
||||
v -37.5757 -49.9999 -78.0261
|
||||
v -19.2712 -49.9999 -84.4313
|
||||
v -0.00032933 -49.9999 -86.6026
|
||||
v 19.2706 -49.9999 -84.4314
|
||||
v 37.5751 -49.9999 -78.0264
|
||||
v 53.9955 -49.9999 -67.7089
|
||||
v 67.7084 -49.9999 -53.9962
|
||||
v 78.0261 -49.9999 -37.5758
|
||||
v 84.4312 -49.9999 -19.2713
|
||||
v 74.3146 -66.9129 5.88009e-39
|
||||
v 72.4514 -66.9129 16.5365
|
||||
v 66.9552 -66.9129 32.2439
|
||||
v 58.1015 -66.9129 46.3344
|
||||
v 46.3344 -66.9129 58.1015
|
||||
v 32.244 -66.9129 66.9551
|
||||
v 16.5366 -66.9129 72.4514
|
||||
v 9.42005e-05 -66.9129 74.3146
|
||||
v -16.5365 -66.9129 72.4514
|
||||
v -32.2438 -66.9129 66.9552
|
||||
v -46.3343 -66.9129 58.1016
|
||||
v -58.1014 -66.9129 46.3345
|
||||
v -66.9551 -66.9129 32.244
|
||||
v -72.4513 -66.9129 16.5367
|
||||
v -74.3146 -66.9129 0.000188401
|
||||
v -72.4514 -66.9129 -16.5364
|
||||
v -66.9552 -66.9129 -32.2437
|
||||
v -58.1016 -66.9129 -46.3342
|
||||
v -46.3346 -66.9129 -58.1014
|
||||
v -32.2441 -66.9129 -66.955
|
||||
v -16.5368 -66.9129 -72.4513
|
||||
v -0.000282602 -66.9129 -74.3146
|
||||
v 16.5363 -66.9129 -72.4514
|
||||
v 32.2436 -66.9129 -66.9553
|
||||
v 46.3341 -66.9129 -58.1017
|
||||
v 58.1013 -66.9129 -46.3347
|
||||
v 66.955 -66.9129 -32.2442
|
||||
v 72.4513 -66.9129 -16.5369
|
||||
v 58.7787 -80.9016 5.88009e-39
|
||||
v 57.305 -80.9016 13.0795
|
||||
v 52.9578 -80.9016 25.5031
|
||||
v 45.955 -80.9016 36.6479
|
||||
v 36.6479 -80.9016 45.955
|
||||
v 25.5032 -80.9016 52.9577
|
||||
v 13.0795 -80.9016 57.305
|
||||
v 7.45073e-05 -80.9016 58.7787
|
||||
v -13.0794 -80.9016 57.305
|
||||
v -25.503 -80.9016 52.9578
|
||||
v -36.6478 -80.9016 45.9551
|
||||
v -45.955 -80.9016 36.648
|
||||
v -52.9577 -80.9016 25.5032
|
||||
v -57.3049 -80.9016 13.0796
|
||||
v -58.7787 -80.9016 0.000149015
|
||||
v -57.305 -80.9016 -13.0793
|
||||
v -52.9578 -80.9016 -25.503
|
||||
v -45.9551 -80.9016 -36.6478
|
||||
v -36.648 -80.9016 -45.9549
|
||||
v -25.5033 -80.9016 -52.9577
|
||||
v -13.0797 -80.9016 -57.3049
|
||||
v -0.000223522 -80.9016 -58.7787
|
||||
v 13.0793 -80.9016 -57.305
|
||||
v 25.5029 -80.9016 -52.9579
|
||||
v 36.6477 -80.9016 -45.9552
|
||||
v 45.9549 -80.9016 -36.6481
|
||||
v 52.9576 -80.9016 -25.5034
|
||||
v 57.3049 -80.9016 -13.0798
|
||||
v 40.6739 -91.3545 5.88009e-39
|
||||
v 39.6541 -91.3545 9.05078
|
||||
v 36.6459 -91.3545 17.6477
|
||||
v 31.8001 -91.3545 25.3597
|
||||
v 25.3598 -91.3545 31.8001
|
||||
v 17.6478 -91.3545 36.6459
|
||||
v 9.05083 -91.3545 39.6541
|
||||
v 5.15578e-05 -91.3545 40.6739
|
||||
v -9.05073 -91.3545 39.6541
|
||||
v -17.6477 -91.3545 36.6459
|
||||
v -25.3597 -91.3545 31.8001
|
||||
v -31.8001 -91.3545 25.3598
|
||||
v -36.6458 -91.3545 17.6478
|
||||
v -39.6541 -91.3545 9.05088
|
||||
v -40.6739 -91.3545 0.000103116
|
||||
v -39.6541 -91.3545 -9.05068
|
||||
v -36.6459 -91.3545 -17.6476
|
||||
v -31.8002 -91.3545 -25.3596
|
||||
v -25.3598 -91.3545 -31.8
|
||||
v -17.6479 -91.3545 -36.6458
|
||||
v -9.05092 -91.3545 -39.654
|
||||
v -0.000154673 -91.3545 -40.6739
|
||||
v 9.05064 -91.3545 -39.6541
|
||||
v 17.6476 -91.3545 -36.646
|
||||
v 25.3596 -91.3545 -31.8002
|
||||
v 31.8 -91.3545 -25.3599
|
||||
v 36.6458 -91.3545 -17.6479
|
||||
v 39.654 -91.3545 -9.05097
|
||||
v 20.7914 -97.8147 5.88009e-39
|
||||
v 20.2701 -97.8147 4.62652
|
||||
v 18.7324 -97.8147 9.02104
|
||||
v 16.2554 -97.8147 12.9632
|
||||
v 12.9632 -97.8147 16.2554
|
||||
v 9.02106 -97.8147 18.7324
|
||||
v 4.62654 -97.8147 20.2701
|
||||
v 2.6355e-05 -97.8147 20.7914
|
||||
v -4.62649 -97.8147 20.2701
|
||||
v -9.02102 -97.8147 18.7324
|
||||
v -12.9632 -97.8147 16.2554
|
||||
v -16.2553 -97.8147 12.9633
|
||||
v -18.7324 -97.8147 9.02109
|
||||
v -20.2701 -97.8147 4.62657
|
||||
v -20.7914 -97.8147 5.271e-05
|
||||
v -20.2701 -97.8147 -4.62647
|
||||
v -18.7324 -97.8147 -9.021
|
||||
v -16.2554 -97.8147 -12.9632
|
||||
v -12.9633 -97.8147 -16.2553
|
||||
v -9.02111 -97.8147 -18.7324
|
||||
v -4.62659 -97.8147 -20.2701
|
||||
v -7.90649e-05 -97.8147 -20.7914
|
||||
v 4.62645 -97.8147 -20.2701
|
||||
v 9.02097 -97.8147 -18.7324
|
||||
v 12.9632 -97.8147 -16.2554
|
||||
v 16.2553 -97.8147 -12.9633
|
||||
v 18.7324 -97.8147 -9.02114
|
||||
v 20.2701 -97.8147 -4.62662
|
||||
f 3 4 32 31
|
||||
f 4 5 33 32
|
||||
f 5 6 34 33
|
||||
f 6 7 35 34
|
||||
f 7 8 36 35
|
||||
f 8 9 37 36
|
||||
f 9 10 38 37
|
||||
f 10 11 39 38
|
||||
f 11 12 40 39
|
||||
f 12 13 41 40
|
||||
f 13 14 42 41
|
||||
f 14 15 43 42
|
||||
f 15 16 44 43
|
||||
f 16 17 45 44
|
||||
f 17 18 46 45
|
||||
f 18 19 47 46
|
||||
f 19 20 48 47
|
||||
f 20 21 49 48
|
||||
f 21 22 50 49
|
||||
f 22 23 51 50
|
||||
f 23 24 52 51
|
||||
f 24 25 53 52
|
||||
f 25 26 54 53
|
||||
f 26 27 55 54
|
||||
f 27 28 56 55
|
||||
f 28 29 57 56
|
||||
f 29 30 58 57
|
||||
f 30 3 31 58
|
||||
f 31 32 60 59
|
||||
f 32 33 61 60
|
||||
f 33 34 62 61
|
||||
f 34 35 63 62
|
||||
f 35 36 64 63
|
||||
f 36 37 65 64
|
||||
f 37 38 66 65
|
||||
f 38 39 67 66
|
||||
f 39 40 68 67
|
||||
f 40 41 69 68
|
||||
f 41 42 70 69
|
||||
f 42 43 71 70
|
||||
f 43 44 72 71
|
||||
f 44 45 73 72
|
||||
f 45 46 74 73
|
||||
f 46 47 75 74
|
||||
f 47 48 76 75
|
||||
f 48 49 77 76
|
||||
f 49 50 78 77
|
||||
f 50 51 79 78
|
||||
f 51 52 80 79
|
||||
f 52 53 81 80
|
||||
f 53 54 82 81
|
||||
f 54 55 83 82
|
||||
f 55 56 84 83
|
||||
f 56 57 85 84
|
||||
f 57 58 86 85
|
||||
f 58 31 59 86
|
||||
f 59 60 88 87
|
||||
f 60 61 89 88
|
||||
f 61 62 90 89
|
||||
f 62 63 91 90
|
||||
f 63 64 92 91
|
||||
f 64 65 93 92
|
||||
f 65 66 94 93
|
||||
f 66 67 95 94
|
||||
f 67 68 96 95
|
||||
f 68 69 97 96
|
||||
f 69 70 98 97
|
||||
f 70 71 99 98
|
||||
f 71 72 100 99
|
||||
f 72 73 101 100
|
||||
f 73 74 102 101
|
||||
f 74 75 103 102
|
||||
f 75 76 104 103
|
||||
f 76 77 105 104
|
||||
f 77 78 106 105
|
||||
f 78 79 107 106
|
||||
f 79 80 108 107
|
||||
f 80 81 109 108
|
||||
f 81 82 110 109
|
||||
f 82 83 111 110
|
||||
f 83 84 112 111
|
||||
f 84 85 113 112
|
||||
f 85 86 114 113
|
||||
f 86 59 87 114
|
||||
f 87 88 116 115
|
||||
f 88 89 117 116
|
||||
f 89 90 118 117
|
||||
f 90 91 119 118
|
||||
f 91 92 120 119
|
||||
f 92 93 121 120
|
||||
f 93 94 122 121
|
||||
f 94 95 123 122
|
||||
f 95 96 124 123
|
||||
f 96 97 125 124
|
||||
f 97 98 126 125
|
||||
f 98 99 127 126
|
||||
f 99 100 128 127
|
||||
f 100 101 129 128
|
||||
f 101 102 130 129
|
||||
f 102 103 131 130
|
||||
f 103 104 132 131
|
||||
f 104 105 133 132
|
||||
f 105 106 134 133
|
||||
f 106 107 135 134
|
||||
f 107 108 136 135
|
||||
f 108 109 137 136
|
||||
f 109 110 138 137
|
||||
f 110 111 139 138
|
||||
f 111 112 140 139
|
||||
f 112 113 141 140
|
||||
f 113 114 142 141
|
||||
f 114 87 115 142
|
||||
f 115 116 144 143
|
||||
f 116 117 145 144
|
||||
f 117 118 146 145
|
||||
f 118 119 147 146
|
||||
f 119 120 148 147
|
||||
f 120 121 149 148
|
||||
f 121 122 150 149
|
||||
f 122 123 151 150
|
||||
f 123 124 152 151
|
||||
f 124 125 153 152
|
||||
f 125 126 154 153
|
||||
f 126 127 155 154
|
||||
f 127 128 156 155
|
||||
f 128 129 157 156
|
||||
f 129 130 158 157
|
||||
f 130 131 159 158
|
||||
f 131 132 160 159
|
||||
f 132 133 161 160
|
||||
f 133 134 162 161
|
||||
f 134 135 163 162
|
||||
f 135 136 164 163
|
||||
f 136 137 165 164
|
||||
f 137 138 166 165
|
||||
f 138 139 167 166
|
||||
f 139 140 168 167
|
||||
f 140 141 169 168
|
||||
f 141 142 170 169
|
||||
f 142 115 143 170
|
||||
f 143 144 172 171
|
||||
f 144 145 173 172
|
||||
f 145 146 174 173
|
||||
f 146 147 175 174
|
||||
f 147 148 176 175
|
||||
f 148 149 177 176
|
||||
f 149 150 178 177
|
||||
f 150 151 179 178
|
||||
f 151 152 180 179
|
||||
f 152 153 181 180
|
||||
f 153 154 182 181
|
||||
f 154 155 183 182
|
||||
f 155 156 184 183
|
||||
f 156 157 185 184
|
||||
f 157 158 186 185
|
||||
f 158 159 187 186
|
||||
f 159 160 188 187
|
||||
f 160 161 189 188
|
||||
f 161 162 190 189
|
||||
f 162 163 191 190
|
||||
f 163 164 192 191
|
||||
f 164 165 193 192
|
||||
f 165 166 194 193
|
||||
f 166 167 195 194
|
||||
f 167 168 196 195
|
||||
f 168 169 197 196
|
||||
f 169 170 198 197
|
||||
f 170 143 171 198
|
||||
f 171 172 200 199
|
||||
f 172 173 201 200
|
||||
f 173 174 202 201
|
||||
f 174 175 203 202
|
||||
f 175 176 204 203
|
||||
f 176 177 205 204
|
||||
f 177 178 206 205
|
||||
f 178 179 207 206
|
||||
f 179 180 208 207
|
||||
f 180 181 209 208
|
||||
f 181 182 210 209
|
||||
f 182 183 211 210
|
||||
f 183 184 212 211
|
||||
f 184 185 213 212
|
||||
f 185 186 214 213
|
||||
f 186 187 215 214
|
||||
f 187 188 216 215
|
||||
f 188 189 217 216
|
||||
f 189 190 218 217
|
||||
f 190 191 219 218
|
||||
f 191 192 220 219
|
||||
f 192 193 221 220
|
||||
f 193 194 222 221
|
||||
f 194 195 223 222
|
||||
f 195 196 224 223
|
||||
f 196 197 225 224
|
||||
f 197 198 226 225
|
||||
f 198 171 199 226
|
||||
f 199 200 228 227
|
||||
f 200 201 229 228
|
||||
f 201 202 230 229
|
||||
f 202 203 231 230
|
||||
f 203 204 232 231
|
||||
f 204 205 233 232
|
||||
f 205 206 234 233
|
||||
f 206 207 235 234
|
||||
f 207 208 236 235
|
||||
f 208 209 237 236
|
||||
f 209 210 238 237
|
||||
f 210 211 239 238
|
||||
f 211 212 240 239
|
||||
f 212 213 241 240
|
||||
f 213 214 242 241
|
||||
f 214 215 243 242
|
||||
f 215 216 244 243
|
||||
f 216 217 245 244
|
||||
f 217 218 246 245
|
||||
f 218 219 247 246
|
||||
f 219 220 248 247
|
||||
f 220 221 249 248
|
||||
f 221 222 250 249
|
||||
f 222 223 251 250
|
||||
f 223 224 252 251
|
||||
f 224 225 253 252
|
||||
f 225 226 254 253
|
||||
f 226 199 227 254
|
||||
f 227 228 256 255
|
||||
f 228 229 257 256
|
||||
f 229 230 258 257
|
||||
f 230 231 259 258
|
||||
f 231 232 260 259
|
||||
f 232 233 261 260
|
||||
f 233 234 262 261
|
||||
f 234 235 263 262
|
||||
f 235 236 264 263
|
||||
f 236 237 265 264
|
||||
f 237 238 266 265
|
||||
f 238 239 267 266
|
||||
f 239 240 268 267
|
||||
f 240 241 269 268
|
||||
f 241 242 270 269
|
||||
f 242 243 271 270
|
||||
f 243 244 272 271
|
||||
f 244 245 273 272
|
||||
f 245 246 274 273
|
||||
f 246 247 275 274
|
||||
f 247 248 276 275
|
||||
f 248 249 277 276
|
||||
f 249 250 278 277
|
||||
f 250 251 279 278
|
||||
f 251 252 280 279
|
||||
f 252 253 281 280
|
||||
f 253 254 282 281
|
||||
f 254 227 255 282
|
||||
f 255 256 284 283
|
||||
f 256 257 285 284
|
||||
f 257 258 286 285
|
||||
f 258 259 287 286
|
||||
f 259 260 288 287
|
||||
f 260 261 289 288
|
||||
f 261 262 290 289
|
||||
f 262 263 291 290
|
||||
f 263 264 292 291
|
||||
f 264 265 293 292
|
||||
f 265 266 294 293
|
||||
f 266 267 295 294
|
||||
f 267 268 296 295
|
||||
f 268 269 297 296
|
||||
f 269 270 298 297
|
||||
f 270 271 299 298
|
||||
f 271 272 300 299
|
||||
f 272 273 301 300
|
||||
f 273 274 302 301
|
||||
f 274 275 303 302
|
||||
f 275 276 304 303
|
||||
f 276 277 305 304
|
||||
f 277 278 306 305
|
||||
f 278 279 307 306
|
||||
f 279 280 308 307
|
||||
f 280 281 309 308
|
||||
f 281 282 310 309
|
||||
f 282 255 283 310
|
||||
f 283 284 312 311
|
||||
f 284 285 313 312
|
||||
f 285 286 314 313
|
||||
f 286 287 315 314
|
||||
f 287 288 316 315
|
||||
f 288 289 317 316
|
||||
f 289 290 318 317
|
||||
f 290 291 319 318
|
||||
f 291 292 320 319
|
||||
f 292 293 321 320
|
||||
f 293 294 322 321
|
||||
f 294 295 323 322
|
||||
f 295 296 324 323
|
||||
f 296 297 325 324
|
||||
f 297 298 326 325
|
||||
f 298 299 327 326
|
||||
f 299 300 328 327
|
||||
f 300 301 329 328
|
||||
f 301 302 330 329
|
||||
f 302 303 331 330
|
||||
f 303 304 332 331
|
||||
f 304 305 333 332
|
||||
f 305 306 334 333
|
||||
f 306 307 335 334
|
||||
f 307 308 336 335
|
||||
f 308 309 337 336
|
||||
f 309 310 338 337
|
||||
f 310 283 311 338
|
||||
f 311 312 340 339
|
||||
f 312 313 341 340
|
||||
f 313 314 342 341
|
||||
f 314 315 343 342
|
||||
f 315 316 344 343
|
||||
f 316 317 345 344
|
||||
f 317 318 346 345
|
||||
f 318 319 347 346
|
||||
f 319 320 348 347
|
||||
f 320 321 349 348
|
||||
f 321 322 350 349
|
||||
f 322 323 351 350
|
||||
f 323 324 352 351
|
||||
f 324 325 353 352
|
||||
f 325 326 354 353
|
||||
f 326 327 355 354
|
||||
f 327 328 356 355
|
||||
f 328 329 357 356
|
||||
f 329 330 358 357
|
||||
f 330 331 359 358
|
||||
f 331 332 360 359
|
||||
f 332 333 361 360
|
||||
f 333 334 362 361
|
||||
f 334 335 363 362
|
||||
f 335 336 364 363
|
||||
f 336 337 365 364
|
||||
f 337 338 366 365
|
||||
f 338 311 339 366
|
||||
f 339 340 368 367
|
||||
f 340 341 369 368
|
||||
f 341 342 370 369
|
||||
f 342 343 371 370
|
||||
f 343 344 372 371
|
||||
f 344 345 373 372
|
||||
f 345 346 374 373
|
||||
f 346 347 375 374
|
||||
f 347 348 376 375
|
||||
f 348 349 377 376
|
||||
f 349 350 378 377
|
||||
f 350 351 379 378
|
||||
f 351 352 380 379
|
||||
f 352 353 381 380
|
||||
f 353 354 382 381
|
||||
f 354 355 383 382
|
||||
f 355 356 384 383
|
||||
f 356 357 385 384
|
||||
f 357 358 386 385
|
||||
f 358 359 387 386
|
||||
f 359 360 388 387
|
||||
f 360 361 389 388
|
||||
f 361 362 390 389
|
||||
f 362 363 391 390
|
||||
f 363 364 392 391
|
||||
f 364 365 393 392
|
||||
f 365 366 394 393
|
||||
f 366 339 367 394
|
||||
f 1 4 3
|
||||
f 2 367 368
|
||||
f 1 5 4
|
||||
f 2 368 369
|
||||
f 1 6 5
|
||||
f 2 369 370
|
||||
f 1 7 6
|
||||
f 2 370 371
|
||||
f 1 8 7
|
||||
f 2 371 372
|
||||
f 1 9 8
|
||||
f 2 372 373
|
||||
f 1 10 9
|
||||
f 2 373 374
|
||||
f 1 11 10
|
||||
f 2 374 375
|
||||
f 1 12 11
|
||||
f 2 375 376
|
||||
f 1 13 12
|
||||
f 2 376 377
|
||||
f 1 14 13
|
||||
f 2 377 378
|
||||
f 1 15 14
|
||||
f 2 378 379
|
||||
f 1 16 15
|
||||
f 2 379 380
|
||||
f 1 17 16
|
||||
f 2 380 381
|
||||
f 1 18 17
|
||||
f 2 381 382
|
||||
f 1 19 18
|
||||
f 2 382 383
|
||||
f 1 20 19
|
||||
f 2 383 384
|
||||
f 1 21 20
|
||||
f 2 384 385
|
||||
f 1 22 21
|
||||
f 2 385 386
|
||||
f 1 23 22
|
||||
f 2 386 387
|
||||
f 1 24 23
|
||||
f 2 387 388
|
||||
f 1 25 24
|
||||
f 2 388 389
|
||||
f 1 26 25
|
||||
f 2 389 390
|
||||
f 1 27 26
|
||||
f 2 390 391
|
||||
f 1 28 27
|
||||
f 2 391 392
|
||||
f 1 29 28
|
||||
f 2 392 393
|
||||
f 1 30 29
|
||||
f 2 393 394
|
||||
f 1 3 30
|
||||
f 2 394 367
|
1058
data/spheres/8.obj
Normal file
1058
data/spheres/8.obj
Normal file
File diff suppressed because it is too large
Load Diff
1334
data/spheres/9.obj
Normal file
1334
data/spheres/9.obj
Normal file
File diff suppressed because it is too large
Load Diff
37
index.html
Normal file
37
index.html
Normal file
@ -0,0 +1,37 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>The begining</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="title">Here is a list of places where you can go</h1>
|
||||
<ul>
|
||||
<li><a href="/bouncing/">A bouncing cube that jumps when you click on it</a></li>
|
||||
<li>
|
||||
<p>
|
||||
<a href="/multisphere/">Sphere with multi-resolution</a>
|
||||
</p>
|
||||
<p>
|
||||
Lots of obj files loaded and displayed. When you click
|
||||
somewhere, the current obj is hidden and the next one, with
|
||||
a better resolution is shown.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<a href="/scene/">A proto of the real thing</a>
|
||||
</p>
|
||||
<p>
|
||||
You can move the camera with the arrow keys and move the
|
||||
angle of the camera with 2, 4, 6 and 8 (the arrows of the
|
||||
numpad). You can also select a camera by clicking on the
|
||||
red part of it, and get back to the free camera by clicking
|
||||
again. You can also select a camera by simply clicking on
|
||||
the object you want to see. The program will choose the
|
||||
camera that you want.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
112
js/BigScene.js
Normal file
112
js/BigScene.js
Normal file
@ -0,0 +1,112 @@
|
||||
var mesh_number = 25;
|
||||
var renderer, scene, controls, cube, container, plane, mouse= {x:0, y:0};
|
||||
var bigmesh;
|
||||
var raycaster;
|
||||
var objects = [];
|
||||
var cameras = new CameraContainer();
|
||||
var spheres = new Array(mesh_number);
|
||||
var visible = 0;
|
||||
|
||||
var loader;
|
||||
|
||||
var container_size = new Object();
|
||||
container_size.width = 1067;
|
||||
container_size.height = 600;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init() {
|
||||
// on initialise le moteur de rendu
|
||||
container = document.getElementById('container');
|
||||
container.style.height = container_size.height + 'px';
|
||||
container.style.width = container_size.width + 'px';
|
||||
renderer = new THREE.WebGLRenderer({alpha:"true"});
|
||||
renderer.setSize(container_size.width, container_size.height);
|
||||
renderer.shadowMapEnabled = true;
|
||||
renderer.setClearColor(0x000000);
|
||||
document.getElementById('container').appendChild(renderer.domElement);
|
||||
|
||||
// on initialise la scène
|
||||
scene = new THREE.Scene();
|
||||
raycaster = new THREE.Raycaster();
|
||||
|
||||
// init light
|
||||
var directional_light = new THREE.DirectionalLight(0x444444);
|
||||
directional_light.position.set(1, 0.5, 1).normalize();
|
||||
directional_light.castShadow = true;
|
||||
scene.add(directional_light);
|
||||
|
||||
var ambient_light = new THREE.AmbientLight(0x666666);
|
||||
scene.add(ambient_light);
|
||||
|
||||
// on initialise la camera que l’on place ensuite sur la scène
|
||||
var camera1 = new PointerCamera(50, container_size.width / container_size.height, 1, 100000);
|
||||
camera1.position.z = 1500;
|
||||
scene.add(camera1);
|
||||
cameras.push(camera1);
|
||||
|
||||
var camera3 = new FixedCamera(
|
||||
50,
|
||||
container_size.width / container_size.height,
|
||||
1,
|
||||
100000,
|
||||
new THREE.Vector3(500,0,500),
|
||||
new THREE.Vector3(0,0,0)
|
||||
);
|
||||
|
||||
camera3.addToScene(scene);
|
||||
cameras.push(camera3);
|
||||
|
||||
window.addEventListener('resize', onWindowResize, false);
|
||||
|
||||
container.addEventListener('mousedown', click, false);
|
||||
|
||||
// Création d'un objloader
|
||||
var helper = new THREE.LoadingManager();
|
||||
helper.onProgress = function(item, loaded, total) {
|
||||
console.log(item, ": " , loaded, " / ", total);
|
||||
};
|
||||
|
||||
loader = new THREE.OBJLoader(helper);
|
||||
loader.load('mesh/TheCarnival.obj', function (object) {
|
||||
object.traverse(function (child) {
|
||||
if (child instanceof THREE.Mesh) {
|
||||
child.up = new THREE.Vector3(0,0,1);
|
||||
child.rotation.x = Math.PI / 2;
|
||||
child.scale.set(0.05,0.05,0.05);
|
||||
}
|
||||
});
|
||||
scene.add(object);
|
||||
});
|
||||
}
|
||||
|
||||
function animate() {
|
||||
// on appelle la fonction animate() récursivement à chaque frame
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
cameras.update();
|
||||
cameras.look();
|
||||
|
||||
renderer.render(scene, cameras.mainCamera());
|
||||
}
|
||||
|
||||
function onWindowResize() {
|
||||
cameras.forEach(function(camera) {camera.aspect = container.offsetWidth / container.offsetHeight;});
|
||||
cameras.forEach(function(camera) {camera.updateProjectionMatrix();});
|
||||
|
||||
renderer.setSize(container.offsetWidth, container.offsetHeight);
|
||||
renderer.render(scene, cameras.mainCamera());
|
||||
}
|
||||
|
||||
function hide(object) {
|
||||
object.traverse(function(object) {object.visible = false;});
|
||||
}
|
||||
|
||||
function show(object) {
|
||||
object.traverse(function(object) {object.visible = true;});
|
||||
}
|
||||
|
||||
function click(event) {
|
||||
cameras.nextCamera();
|
||||
}
|
36
js/BouncingCube.js
Normal file
36
js/BouncingCube.js
Normal file
@ -0,0 +1,36 @@
|
||||
DT = new THREE.Vector3(0.1,0.1,0.1);
|
||||
FRICTION = new THREE.Vector3(1, 1, 1);
|
||||
G = new THREE.Vector3(0,0,-10);
|
||||
|
||||
var BouncingCube = function(size, style) {
|
||||
Cube.call(this, size, style);
|
||||
|
||||
this.fixed_center = new THREE.Vector3();
|
||||
this.center = new THREE.Vector3();
|
||||
|
||||
this.speed = new THREE.Vector3(0,0,300);
|
||||
}
|
||||
BouncingCube.prototype = Object.create(Cube.prototype);
|
||||
BouncingCube.prototype.constructor = BouncingCube;
|
||||
|
||||
BouncingCube.prototype.update = function() {
|
||||
// Compute new center
|
||||
var speed_clone = this.speed.clone();
|
||||
speed_clone.multiply(DT);
|
||||
|
||||
this.speed.add(G);
|
||||
|
||||
if (this.speed.dot(this.speed) > 100) {
|
||||
this.center.add(speed_clone);
|
||||
}
|
||||
|
||||
if (this.center.z < 0) {
|
||||
this.speed.multiply(new THREE.Vector3(1,1,-0.5));
|
||||
this.center.z = 0;
|
||||
}
|
||||
|
||||
// Update the mesh
|
||||
this.mesh.position.set(this.center.x, this.center.y, this.center.z);
|
||||
|
||||
// console.log(this.center.x, this.center.y, this.center.z);
|
||||
}
|
28
js/Camera.js
Normal file
28
js/Camera.js
Normal file
@ -0,0 +1,28 @@
|
||||
// class camera extends THREE.PerspectiveCamera
|
||||
var Camera = function() {
|
||||
THREE.PerspectiveCamera.apply(this, arguments);
|
||||
|
||||
this.theta = 0;
|
||||
this.position.x = Camera.DISTANCE_X;
|
||||
this.position.z = Camera.DISTANCE_Z;
|
||||
|
||||
this.up = new THREE.Vector3(0,0,1);
|
||||
this.target = new THREE.Vector3();
|
||||
}
|
||||
Camera.prototype = Object.create(THREE.PerspectiveCamera.prototype);
|
||||
|
||||
// Update function
|
||||
Camera.prototype.update = function() {
|
||||
this.theta += 0.01;
|
||||
this.position.x = Camera.DISTANCE_X*Math.cos(this.theta);
|
||||
this.position.y = Camera.DISTANCE_X*Math.sin(this.theta);
|
||||
}
|
||||
|
||||
// Look function
|
||||
Camera.prototype.look = function() {
|
||||
this.lookAt(this.target);
|
||||
}
|
||||
|
||||
// Static members
|
||||
Camera.DISTANCE_X = 1000;
|
||||
Camera.DISTANCE_Z = 300;
|
61
js/CameraContainer.js
Normal file
61
js/CameraContainer.js
Normal file
@ -0,0 +1,61 @@
|
||||
var CameraContainer = function () {
|
||||
this.current_camera = 0;
|
||||
this.cameras = new Array();
|
||||
}
|
||||
|
||||
CameraContainer.prototype.mainCamera = function(id) {
|
||||
if (typeof id === 'undefined') {
|
||||
return this.cameras[this.current_camera];
|
||||
}
|
||||
if (id >= cameras.length || id < 0) {
|
||||
console.log('Warning : this camera does not exist');
|
||||
return;
|
||||
}
|
||||
|
||||
this.current_camera = id;
|
||||
}
|
||||
|
||||
CameraContainer.prototype.forEach = function(callback) {
|
||||
this.cameras.forEach(callback);
|
||||
}
|
||||
|
||||
CameraContainer.prototype.look = function() {
|
||||
this.cameras[this.current_camera].look();
|
||||
}
|
||||
|
||||
CameraContainer.prototype.update = function() {
|
||||
this.cameras[this.current_camera].update();
|
||||
}
|
||||
|
||||
CameraContainer.prototype.push = function(camera) {
|
||||
this.cameras.push(camera);
|
||||
}
|
||||
|
||||
CameraContainer.prototype.get = function(i) {
|
||||
return this.cameras[i];
|
||||
}
|
||||
|
||||
CameraContainer.prototype.getById = function(id) {
|
||||
for (var i in this.cameras) {
|
||||
if (typeof this.cameras[i].mesh !== 'undefined') {
|
||||
if (this.cameras[i].mesh.id == id) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
CameraContainer.prototype.setById = function(id) {
|
||||
var i = this.getById(id);
|
||||
|
||||
if (i !== -1)
|
||||
this.current_camera = i;
|
||||
}
|
||||
|
||||
CameraContainer.prototype.nextCamera = function() {
|
||||
if (this.cameras.length != 0) {
|
||||
this.current_camera++;
|
||||
this.current_camera%=this.cameras.length;
|
||||
}
|
||||
}
|
56
js/Cube.js
Normal file
56
js/Cube.js
Normal file
@ -0,0 +1,56 @@
|
||||
var Displayable = function() {
|
||||
// Nothing to do here
|
||||
}
|
||||
|
||||
Displayable.prototype.addToScene = function(scene) {
|
||||
scene.add(this.mesh);
|
||||
}
|
||||
|
||||
Displayable.prototype.translate = function(x,y,z) {
|
||||
this.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(x,y,z));
|
||||
}
|
||||
|
||||
// class Cube extends Displayable
|
||||
var Cube = function(size, style) {
|
||||
// Super constructor call
|
||||
Displayable.call(this);
|
||||
|
||||
if (typeof size === 'undefined') size = 100;
|
||||
if (typeof style === 'undefined') style = {};
|
||||
|
||||
this.geometry = new THREE.BoxGeometry(size, size, size);
|
||||
this.geometry.computeVertexNormals();
|
||||
|
||||
this.material = new THREE.MeshLambertMaterial(style);
|
||||
|
||||
this.mesh = new THREE.Mesh(this.geometry, this.material);
|
||||
this.mesh.castShadow = false;
|
||||
}
|
||||
Cube.prototype = Object.create(Displayable.prototype);
|
||||
Cube.prototype.constructor = Cube;
|
||||
|
||||
// class Plane extends Displayable
|
||||
var Plane = function(size1, size2, style) {
|
||||
Displayable.call(this);
|
||||
|
||||
if (typeof style === 'undefined') style = {};
|
||||
|
||||
this.geometry = new THREE.PlaneBufferGeometry(size1, size2);
|
||||
this.material = new THREE.MeshLambertMaterial(style);
|
||||
this.material.side = THREE.FrontSide;
|
||||
|
||||
this.materialBack = new THREE.MeshLambertMaterial(style);
|
||||
this.materialBack.side = THREE.BackSide;
|
||||
|
||||
this.mesh = new THREE.Mesh(this.geometry, this.material);
|
||||
this.meshBack = new THREE.Mesh(this.geometry, this.materialBack);
|
||||
|
||||
this.mesh.receiveShadow = true;
|
||||
}
|
||||
Plane.prototype = Object.create(Displayable.prototype);
|
||||
Plane.prototype.constructor = Plane;
|
||||
|
||||
Plane.prototype.addToScene = function(scene) {
|
||||
scene.add(this.mesh);
|
||||
scene.add(this.meshBack);
|
||||
}
|
110
js/FixedCamera.js
Normal file
110
js/FixedCamera.js
Normal file
@ -0,0 +1,110 @@
|
||||
// Initialization
|
||||
|
||||
// class camera extends THREE.PerspectiveCamera
|
||||
var FixedCamera = function(arg1, arg2, arg3, arg4, position, target) {
|
||||
THREE.PerspectiveCamera.apply(this, arguments);
|
||||
|
||||
// Set Position
|
||||
if (typeof position === 'undefined')
|
||||
{
|
||||
this.position = new THREE.Vector3(0,0,5);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.position.x = position.x;
|
||||
this.position.y = position.y;
|
||||
this.position.z = position.z;
|
||||
}
|
||||
|
||||
|
||||
if (typeof target === 'undefined') target = new THREE.Vector3(0,0,0);
|
||||
|
||||
var direction = target.clone();
|
||||
direction.sub(this.position);
|
||||
direction.normalize();
|
||||
|
||||
this.target = this.position.clone();
|
||||
this.target.add(direction);
|
||||
this.up = new THREE.Vector3(0,0,1);
|
||||
|
||||
// Compute corners
|
||||
|
||||
// Create the mesh to draw
|
||||
|
||||
var geometry = new THREE.Geometry();
|
||||
|
||||
var left = Tools.cross(direction, this.up);
|
||||
var other = Tools.cross(direction, left);
|
||||
left.normalize();
|
||||
other.normalize();
|
||||
left = Tools.mul(left, 100);
|
||||
other = Tools.mul(other, 100);
|
||||
|
||||
geometry.vertices.push(Tools.sum(Tools.sum(this.position, left), other),
|
||||
Tools.diff(Tools.sum(this.position, other),left),
|
||||
Tools.diff(Tools.diff(this.position, left),other),
|
||||
Tools.sum(Tools.diff(this.position, other), left)
|
||||
);
|
||||
|
||||
geometry.faces.push(new THREE.Face3(0,1,2), // new THREE.Face3(0,2,1),
|
||||
new THREE.Face3(0,2,3) // new THREE.Face3(0,3,2)
|
||||
);
|
||||
|
||||
(function(self, direction, left, other) {
|
||||
var material = new THREE.LineBasicMaterial({ color: '0x000000'});
|
||||
var geometry = new THREE.Geometry();
|
||||
var direction = Tools.mul(direction, -200);
|
||||
var target = Tools.sum(self.position, direction);
|
||||
// geometry.vertices.push(self.position, target);
|
||||
geometry.vertices.push(
|
||||
Tools.sum(Tools.sum(self.position, left), other),
|
||||
Tools.diff(Tools.sum(self.position, other),left),
|
||||
Tools.diff(Tools.diff(self.position, left),other),
|
||||
Tools.sum(Tools.diff(self.position, other), left),
|
||||
Tools.sum(Tools.sum(self.position, left), other),
|
||||
Tools.sum(Tools.diff(self.position, other), left),
|
||||
|
||||
Tools.sum(self.position, direction),
|
||||
Tools.sum(Tools.sum(self.position, left), other),
|
||||
|
||||
Tools.sum(self.position, direction),
|
||||
Tools.diff(Tools.sum(self.position, other),left),
|
||||
|
||||
Tools.sum(self.position, direction),
|
||||
Tools.diff(Tools.diff(self.position, left),other),
|
||||
|
||||
Tools.sum(self.position, direction),
|
||||
Tools.sum(Tools.diff(self.position, other), left)
|
||||
);
|
||||
|
||||
self.line = new THREE.Line(geometry, material);
|
||||
})(this, direction, left, other);
|
||||
|
||||
|
||||
var material = new THREE.MeshBasicMaterial({
|
||||
color : 0xff0000,
|
||||
transparent : true,
|
||||
opacity : 0.5,
|
||||
side: THREE.DoubleSide
|
||||
});
|
||||
|
||||
this.mesh = new THREE.Mesh(geometry, material);
|
||||
}
|
||||
FixedCamera.prototype = Object.create(THREE.PerspectiveCamera.prototype);
|
||||
FixedCamera.prototype.constructor = FixedCamera;
|
||||
|
||||
// Update function
|
||||
FixedCamera.prototype.update = function() {
|
||||
|
||||
}
|
||||
|
||||
// Look function
|
||||
FixedCamera.prototype.look = function() {
|
||||
this.lookAt(this.target);
|
||||
}
|
||||
|
||||
FixedCamera.prototype.addToScene = function(scene) {
|
||||
scene.add(this);
|
||||
scene.add(this.mesh);
|
||||
scene.add(this.line);
|
||||
}
|
120
js/PointerCamera.js
Normal file
120
js/PointerCamera.js
Normal file
@ -0,0 +1,120 @@
|
||||
// Initialization
|
||||
|
||||
|
||||
// class camera extends THREE.PerspectiveCamera
|
||||
var PointerCamera = function() {
|
||||
THREE.PerspectiveCamera.apply(this, arguments);
|
||||
|
||||
// Set Position
|
||||
this.theta = Math.PI;
|
||||
this.phi = Math.PI;
|
||||
|
||||
this.keyboard = 'undefined';
|
||||
|
||||
|
||||
// Stuff for rendering
|
||||
this.position = new THREE.Vector3();
|
||||
this.forward = new THREE.Vector3();
|
||||
this.left = new THREE.Vector3();
|
||||
this.up = new THREE.Vector3(0,0,1);
|
||||
this.target = new THREE.Vector3(0,1,0);
|
||||
|
||||
// Stuff for events
|
||||
this.moveForward = false;
|
||||
this.moveBackward = false;
|
||||
this.moveRight = false;
|
||||
this.moveLeft = false;
|
||||
|
||||
this.sensitivity = 0.05;
|
||||
this.speed = 1;
|
||||
|
||||
// Set events from the document
|
||||
var self = this;
|
||||
var onKeyDown = function(event) {self.onKeyDown(event);};
|
||||
var onKeyUp = function(event) {self.onKeyUp(event);};
|
||||
|
||||
document.addEventListener('keydown', onKeyDown, false);
|
||||
document.addEventListener('keyup', onKeyUp, false);
|
||||
}
|
||||
PointerCamera.prototype = Object.create(THREE.PerspectiveCamera.prototype);
|
||||
PointerCamera.prototype.constructor = PointerCamera;
|
||||
|
||||
// Update function
|
||||
PointerCamera.prototype.update = function() {
|
||||
// Update angles
|
||||
if (this.increasePhi) this.phi += this.sensitivity;
|
||||
if (this.decreasePhi) this.phi -= this.sensitivity;
|
||||
if (this.increaseTheta) this.theta += this.sensitivity;
|
||||
if (this.decreaseTheta) this.theta -= this.sensitivity;
|
||||
|
||||
// Clamp phi
|
||||
this.phi = Math.min(Math.max(-(Math.PI/2-0.1),this.phi), Math.PI/2-0.1);
|
||||
|
||||
var delta = 0.1;
|
||||
|
||||
// Update direction
|
||||
this.forward.z = Math.sin(this.phi);
|
||||
|
||||
var cos = Math.cos(this.phi);
|
||||
this.forward.x = cos * Math.cos(this.theta);
|
||||
this.forward.y = cos * Math.sin(this.theta);
|
||||
this.forward.normalize();
|
||||
|
||||
// Update
|
||||
var forward = this.forward.clone();
|
||||
forward.multiplyScalar(400.0 * delta);
|
||||
var left = this.up.clone();
|
||||
left.cross(forward);
|
||||
left.normalize();
|
||||
left.multiplyScalar(400.0 * delta);
|
||||
|
||||
if (this.moveForward) this.position.add(Tools.mul(forward, this.speed));
|
||||
if (this.moveBackward) this.position.sub(Tools.mul(forward, this.speed));
|
||||
if (this.moveLeft) this.position.add(Tools.mul(left, this.speed));
|
||||
if (this.moveRight) this.position.sub(Tools.mul(left, this.speed));
|
||||
|
||||
this.target = this.position.clone();
|
||||
this.target.add(forward);
|
||||
}
|
||||
|
||||
// Look function
|
||||
PointerCamera.prototype.look = function() {
|
||||
this.lookAt(this.target);
|
||||
}
|
||||
|
||||
PointerCamera.prototype.addToScene = function(scene) {
|
||||
scene.add(this);
|
||||
}
|
||||
|
||||
PointerCamera.prototype.onKeyEvent = function(event, toSet) {
|
||||
switch ( event.keyCode ) {
|
||||
// Azerty keyboards
|
||||
case 38: case 90: this.moveForward = toSet; break; // up / z
|
||||
case 37: case 81: this.moveLeft = toSet; break; // left / q
|
||||
case 40: case 83: this.moveBackward = toSet; break; // down / s
|
||||
case 39: case 68: this.moveRight = toSet; break; // right / d
|
||||
|
||||
// Qwerty keyboards
|
||||
// case 38: case 87: this.moveForward = toSet; break; // up / w
|
||||
// case 37: case 65: this.moveLeft = toSet; break; // left / a
|
||||
// case 40: case 83: this.moveBackward = toSet; break; // down / s
|
||||
// case 39: case 68: this.moveRight = toSet; break; // right / d
|
||||
|
||||
case 104: this.increasePhi = toSet; break; // 8 Up for angle
|
||||
case 98: this.decreasePhi = toSet; break; // 2 Down for angle
|
||||
case 100: this.increaseTheta = toSet; break; // 4 Left for angle
|
||||
case 102: this.decreaseTheta = toSet; break; // 6 Right for angle
|
||||
}
|
||||
}
|
||||
|
||||
PointerCamera.prototype.onKeyDown = function(event) {
|
||||
this.onKeyEvent(event, true);
|
||||
}
|
||||
|
||||
PointerCamera.prototype.onKeyUp = function(event) {
|
||||
this.onKeyEvent(event, false);
|
||||
}
|
||||
|
||||
// Static members
|
||||
PointerCamera.DISTANCE_X = 1000;
|
||||
PointerCamera.DISTANCE_Z = 300;
|
33
js/Tools.js
Normal file
33
js/Tools.js
Normal file
@ -0,0 +1,33 @@
|
||||
var Tools = {version : "1.0" };
|
||||
|
||||
Tools.sum = function(v1, v2) {
|
||||
var ret = v1.clone();
|
||||
ret.add(v2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Tools.diff = function(v1, v2) {
|
||||
var ret = v1.clone();
|
||||
ret.sub(v2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Tools.dot = function(v1, v2) {
|
||||
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
|
||||
}
|
||||
|
||||
Tools.cross = function(v1, v2) {
|
||||
var ret = v1.clone();
|
||||
ret.cross(v2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Tools.mul = function(v1, lambda) {
|
||||
var ret = v1.clone();
|
||||
ret.multiplyScalar(lambda);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Tools.equals = function(v1, v2) {
|
||||
return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z;
|
||||
}
|
79
js/ToolsTest.js
Normal file
79
js/ToolsTest.js
Normal file
@ -0,0 +1,79 @@
|
||||
function test(b) {
|
||||
if (b)
|
||||
document.write("<li style='color: #008800'>Success !</li>");
|
||||
else
|
||||
document.write("<li style='color: red'>Failure !</li>");
|
||||
}
|
||||
|
||||
function main() {
|
||||
document.write("<h1>Starting test !</h1>");
|
||||
|
||||
var v1 = new THREE.Vector3(1,2,3);
|
||||
var v2 = new THREE.Vector3(2,3,4);
|
||||
var v1Bak = v1.clone();
|
||||
var v2Bak = v2.clone();
|
||||
|
||||
// First tests
|
||||
document.write("<ol>");
|
||||
var v3 = Tools.sum(v1,v2);
|
||||
test(v3.x == v1.x + v2.x && v3.y == v1.y + v2.y && v3.z == v1.z + v2.z);
|
||||
test(Tools.equals(v1, v1Bak));
|
||||
test(Tools.equals(v2, v2Bak));
|
||||
document.write('</ol>');
|
||||
|
||||
// Clear v1, v2
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
document.write("<ol>");
|
||||
var v4 = Tools.diff(v1,v2);
|
||||
test(v4.x == v1.x - v2.x && v4.y == v1.y - v2.y && v4.z == v1.z - v2.z);
|
||||
test(Tools.equals(v1, v1Bak));
|
||||
test(Tools.equals(v2, v2Bak));
|
||||
document.write('</ol>');
|
||||
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
document.write("<ol>");
|
||||
var v5 = Tools.dot(v1,v2);
|
||||
test(v5 == v1.x * v2.x + v1.y * v2.y + v1.z * v2.z);
|
||||
test(Tools.equals(v1, v1Bak));
|
||||
test(Tools.equals(v2, v2Bak));
|
||||
document.write('</ol>');
|
||||
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
document.write("<ol>");
|
||||
var v6 = Tools.cross(new THREE.Vector3(1,0,0), new THREE.Vector3(0,1,0));
|
||||
test(Tools.equals(v6, new THREE.Vector3(0,0,1)));
|
||||
test(Tools.equals(v1, v1Bak));
|
||||
test(Tools.equals(v2, v2Bak));
|
||||
document.write('</ol>');
|
||||
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
document.write("<ol>");
|
||||
for (var lambda = 0; lambda < 5; lambda += 0.5)
|
||||
{
|
||||
var v7 = Tools.mul(v1, lambda);
|
||||
test(Tools.equals(v7, new THREE.Vector3(v1Bak.x*lambda, v1Bak.y*lambda, v1Bak.z*lambda)));
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
var v8 = Tools.mul(v1, lambda);
|
||||
test(Tools.equals(v8, new THREE.Vector3(v1Bak.x*lambda, v1Bak.y*lambda, v1Bak.z*lambda)));
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
// Try into v1
|
||||
v1 = Tools.mul(v1, lambda);
|
||||
test(Tools.equals(v1, new THREE.Vector3(v1Bak.x*lambda, v1Bak.y*lambda, v1Bak.z*lambda)));
|
||||
v1 = v1Bak.clone();
|
||||
v2 = v2Bak.clone();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
88
js/test1.js
Normal file
88
js/test1.js
Normal file
@ -0,0 +1,88 @@
|
||||
var renderer, scene, camera, controls, mesh, i = 0;
|
||||
var raycaster;
|
||||
var objects = [];
|
||||
var container_size = new Object();
|
||||
container_size.width = 1067;
|
||||
container_size.height = 600;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init()
|
||||
{
|
||||
// on initialise le moteur de rendu
|
||||
container = document.getElementById('container');
|
||||
container.style.height = container_size.height + 'px';
|
||||
container.style.width = container_size.width + 'px';
|
||||
renderer = new THREE.WebGLRenderer({alpha:"true"});
|
||||
renderer.setSize(container_size.width, container_size.height);
|
||||
renderer.shadowMapEnabled = true;
|
||||
document.getElementById('container').appendChild(renderer.domElement);
|
||||
container.addEventListener('mousedown', click, false);
|
||||
|
||||
// on initialise la scène
|
||||
scene = new THREE.Scene();
|
||||
raycaster = new THREE.Raycaster();
|
||||
|
||||
// init light
|
||||
var directional_light = new THREE.DirectionalLight(0xffffff);
|
||||
directional_light.position.set(1, 0.5, 1).normalize();
|
||||
directional_light.castShadow = true;
|
||||
scene.add(directional_light);
|
||||
|
||||
var ambient_light = new THREE.AmbientLight(0x444444);
|
||||
scene.add(ambient_light);
|
||||
|
||||
// on initialise la camera que l’on place ensuite sur la scène
|
||||
camera = new Camera(50, container_size.width / container_size.height, 1, 10000);
|
||||
scene.add(camera);
|
||||
|
||||
window.addEventListener('resize', onWindowResize, false);
|
||||
|
||||
geometry = new THREE.Geometry();
|
||||
geometry.vertices.push(new THREE.Vector3(0,0,0), new THREE.Vector3(100,100,0), new THREE.Vector3(100,0,100));
|
||||
geometry.faces.push(new THREE.Face3(0,1,2));
|
||||
geometry.faces.push(new THREE.Face3(0,2,1));
|
||||
|
||||
geometry.verticesNeedUpdate = true;
|
||||
geometry.groupsNeedUpdate = true;
|
||||
|
||||
mesh = new THREE.Mesh(geometry);
|
||||
|
||||
|
||||
scene.add(mesh);
|
||||
}
|
||||
|
||||
function animate()
|
||||
{
|
||||
// on appelle la fonction animate() récursivement à chaque frame
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
i += 1;
|
||||
|
||||
mesh.geometry.vertices.push(new THREE.Vector3(0+i,0+i,0+i), new THREE.Vector3(100+i,100+i,+i), new THREE.Vector3(100+i,0+i,100+i));
|
||||
var size = mesh.geometry.vertices.length-3;
|
||||
mesh.geometry.faces.push(new THREE.Face3(size, size+1, size+2), new THREE.Face3(size, size+2, size+1));
|
||||
mesh.geometry.verticesNeedUpdate = true;
|
||||
mesh.geometry.groupsNeedUpdate = true;
|
||||
|
||||
camera.update();
|
||||
camera.look();
|
||||
|
||||
renderer.render(scene, camera);
|
||||
|
||||
}
|
||||
|
||||
function onWindowResize()
|
||||
{
|
||||
camera.aspect = container.offsetWidth / container.offsetHeight;
|
||||
camera.updateProjectionMatrix();
|
||||
|
||||
renderer.setSize(container.offsetWidth, container.offsetHeight);
|
||||
renderer.render(scene, camera);
|
||||
}
|
||||
|
||||
function click(event)
|
||||
{
|
||||
|
||||
}
|
35133
js/three.js
Normal file
35133
js/three.js
Normal file
File diff suppressed because one or more lines are too long
237
js/three/DDSLoader.js
Normal file
237
js/three/DDSLoader.js
Normal file
@ -0,0 +1,237 @@
|
||||
/*
|
||||
* @author mrdoob / http://mrdoob.com/
|
||||
*/
|
||||
|
||||
THREE.DDSLoader = function () {
|
||||
this._parser = THREE.DDSLoader.parse;
|
||||
};
|
||||
|
||||
THREE.DDSLoader.prototype = Object.create( THREE.CompressedTextureLoader.prototype );
|
||||
THREE.DDSLoader.prototype.constructor = THREE.DDSLoader;
|
||||
|
||||
THREE.DDSLoader.parse = function ( buffer, loadMipmaps ) {
|
||||
|
||||
var dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 };
|
||||
|
||||
// Adapted from @toji's DDS utils
|
||||
// https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js
|
||||
|
||||
// All values and structures referenced from:
|
||||
// http://msdn.microsoft.com/en-us/library/bb943991.aspx/
|
||||
|
||||
var DDS_MAGIC = 0x20534444;
|
||||
|
||||
var DDSD_CAPS = 0x1,
|
||||
DDSD_HEIGHT = 0x2,
|
||||
DDSD_WIDTH = 0x4,
|
||||
DDSD_PITCH = 0x8,
|
||||
DDSD_PIXELFORMAT = 0x1000,
|
||||
DDSD_MIPMAPCOUNT = 0x20000,
|
||||
DDSD_LINEARSIZE = 0x80000,
|
||||
DDSD_DEPTH = 0x800000;
|
||||
|
||||
var DDSCAPS_COMPLEX = 0x8,
|
||||
DDSCAPS_MIPMAP = 0x400000,
|
||||
DDSCAPS_TEXTURE = 0x1000;
|
||||
|
||||
var DDSCAPS2_CUBEMAP = 0x200,
|
||||
DDSCAPS2_CUBEMAP_POSITIVEX = 0x400,
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,
|
||||
DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,
|
||||
DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,
|
||||
DDSCAPS2_VOLUME = 0x200000;
|
||||
|
||||
var DDPF_ALPHAPIXELS = 0x1,
|
||||
DDPF_ALPHA = 0x2,
|
||||
DDPF_FOURCC = 0x4,
|
||||
DDPF_RGB = 0x40,
|
||||
DDPF_YUV = 0x200,
|
||||
DDPF_LUMINANCE = 0x20000;
|
||||
|
||||
function fourCCToInt32( value ) {
|
||||
|
||||
return value.charCodeAt(0) +
|
||||
(value.charCodeAt(1) << 8) +
|
||||
(value.charCodeAt(2) << 16) +
|
||||
(value.charCodeAt(3) << 24);
|
||||
|
||||
}
|
||||
|
||||
function int32ToFourCC( value ) {
|
||||
|
||||
return String.fromCharCode(
|
||||
value & 0xff,
|
||||
(value >> 8) & 0xff,
|
||||
(value >> 16) & 0xff,
|
||||
(value >> 24) & 0xff
|
||||
);
|
||||
}
|
||||
|
||||
function loadARGBMip( buffer, dataOffset, width, height ) {
|
||||
var dataLength = width * height * 4;
|
||||
var srcBuffer = new Uint8Array( buffer, dataOffset, dataLength );
|
||||
var byteArray = new Uint8Array( dataLength );
|
||||
var dst = 0;
|
||||
var src = 0;
|
||||
for ( var y = 0; y < height; y ++ ) {
|
||||
for ( var x = 0; x < width; x ++ ) {
|
||||
var b = srcBuffer[src]; src ++;
|
||||
var g = srcBuffer[src]; src ++;
|
||||
var r = srcBuffer[src]; src ++;
|
||||
var a = srcBuffer[src]; src ++;
|
||||
byteArray[dst] = r; dst ++; //r
|
||||
byteArray[dst] = g; dst ++; //g
|
||||
byteArray[dst] = b; dst ++; //b
|
||||
byteArray[dst] = a; dst ++; //a
|
||||
}
|
||||
}
|
||||
return byteArray;
|
||||
}
|
||||
|
||||
var FOURCC_DXT1 = fourCCToInt32("DXT1");
|
||||
var FOURCC_DXT3 = fourCCToInt32("DXT3");
|
||||
var FOURCC_DXT5 = fourCCToInt32("DXT5");
|
||||
|
||||
var headerLengthInt = 31; // The header length in 32 bit ints
|
||||
|
||||
// Offsets into the header array
|
||||
|
||||
var off_magic = 0;
|
||||
|
||||
var off_size = 1;
|
||||
var off_flags = 2;
|
||||
var off_height = 3;
|
||||
var off_width = 4;
|
||||
|
||||
var off_mipmapCount = 7;
|
||||
|
||||
var off_pfFlags = 20;
|
||||
var off_pfFourCC = 21;
|
||||
var off_RGBBitCount = 22;
|
||||
var off_RBitMask = 23;
|
||||
var off_GBitMask = 24;
|
||||
var off_BBitMask = 25;
|
||||
var off_ABitMask = 26;
|
||||
|
||||
var off_caps = 27;
|
||||
var off_caps2 = 28;
|
||||
var off_caps3 = 29;
|
||||
var off_caps4 = 30;
|
||||
|
||||
// Parse header
|
||||
|
||||
var header = new Int32Array( buffer, 0, headerLengthInt );
|
||||
|
||||
if ( header[ off_magic ] !== DDS_MAGIC ) {
|
||||
|
||||
console.error( 'THREE.DDSLoader.parse: Invalid magic number in DDS header.' );
|
||||
return dds;
|
||||
|
||||
}
|
||||
|
||||
if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) {
|
||||
|
||||
console.error( 'THREE.DDSLoader.parse: Unsupported format, must contain a FourCC code.' );
|
||||
return dds;
|
||||
|
||||
}
|
||||
|
||||
var blockBytes;
|
||||
|
||||
var fourCC = header[ off_pfFourCC ];
|
||||
|
||||
var isRGBAUncompressed = false;
|
||||
|
||||
switch ( fourCC ) {
|
||||
|
||||
case FOURCC_DXT1:
|
||||
|
||||
blockBytes = 8;
|
||||
dds.format = THREE.RGB_S3TC_DXT1_Format;
|
||||
break;
|
||||
|
||||
case FOURCC_DXT3:
|
||||
|
||||
blockBytes = 16;
|
||||
dds.format = THREE.RGBA_S3TC_DXT3_Format;
|
||||
break;
|
||||
|
||||
case FOURCC_DXT5:
|
||||
|
||||
blockBytes = 16;
|
||||
dds.format = THREE.RGBA_S3TC_DXT5_Format;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
if ( header[off_RGBBitCount] == 32
|
||||
&& header[off_RBitMask]&0xff0000
|
||||
&& header[off_GBitMask]&0xff00
|
||||
&& header[off_BBitMask]&0xff
|
||||
&& header[off_ABitMask]&0xff000000 ) {
|
||||
isRGBAUncompressed = true;
|
||||
blockBytes = 64;
|
||||
dds.format = THREE.RGBAFormat;
|
||||
} else {
|
||||
console.error( 'THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC( fourCC ) );
|
||||
return dds;
|
||||
}
|
||||
}
|
||||
|
||||
dds.mipmapCount = 1;
|
||||
|
||||
if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {
|
||||
|
||||
dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );
|
||||
|
||||
}
|
||||
|
||||
//TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc.
|
||||
|
||||
dds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false;
|
||||
|
||||
dds.width = header[ off_width ];
|
||||
dds.height = header[ off_height ];
|
||||
|
||||
var dataOffset = header[ off_size ] + 4;
|
||||
|
||||
// Extract mipmaps buffers
|
||||
|
||||
var width = dds.width;
|
||||
var height = dds.height;
|
||||
|
||||
var faces = dds.isCubemap ? 6 : 1;
|
||||
|
||||
for ( var face = 0; face < faces; face ++ ) {
|
||||
|
||||
for ( var i = 0; i < dds.mipmapCount; i ++ ) {
|
||||
|
||||
if ( isRGBAUncompressed ) {
|
||||
var byteArray = loadARGBMip( buffer, dataOffset, width, height );
|
||||
var dataLength = byteArray.length;
|
||||
} else {
|
||||
var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;
|
||||
var byteArray = new Uint8Array( buffer, dataOffset, dataLength );
|
||||
}
|
||||
|
||||
var mipmap = { "data": byteArray, "width": width, "height": height };
|
||||
dds.mipmaps.push( mipmap );
|
||||
|
||||
dataOffset += dataLength;
|
||||
|
||||
width = Math.max( width * 0.5, 1 );
|
||||
height = Math.max( height * 0.5, 1 );
|
||||
|
||||
}
|
||||
|
||||
width = dds.width;
|
||||
height = dds.height;
|
||||
|
||||
}
|
||||
|
||||
return dds;
|
||||
|
||||
};
|
||||
|
441
js/three/MTLLoader.js
Normal file
441
js/three/MTLLoader.js
Normal file
@ -0,0 +1,441 @@
|
||||
/**
|
||||
* Loads a Wavefront .mtl file specifying materials
|
||||
*
|
||||
* @author angelxuanchang
|
||||
*/
|
||||
|
||||
THREE.MTLLoader = function( baseUrl, options, crossOrigin ) {
|
||||
|
||||
this.baseUrl = baseUrl;
|
||||
this.options = options;
|
||||
this.crossOrigin = crossOrigin;
|
||||
|
||||
};
|
||||
|
||||
THREE.MTLLoader.prototype = {
|
||||
|
||||
constructor: THREE.MTLLoader,
|
||||
|
||||
load: function ( url, onLoad, onProgress, onError ) {
|
||||
|
||||
var scope = this;
|
||||
|
||||
var loader = new THREE.XHRLoader();
|
||||
loader.setCrossOrigin( this.crossOrigin );
|
||||
loader.load( url, function ( text ) {
|
||||
|
||||
onLoad( scope.parse( text ) );
|
||||
|
||||
}, onProgress, onError );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Parses loaded MTL file
|
||||
* @param text - Content of MTL file
|
||||
* @return {THREE.MTLLoader.MaterialCreator}
|
||||
*/
|
||||
parse: function ( text ) {
|
||||
|
||||
var lines = text.split( "\n" );
|
||||
var info = {};
|
||||
var delimiter_pattern = /\s+/;
|
||||
var materialsInfo = {};
|
||||
|
||||
for ( var i = 0; i < lines.length; i ++ ) {
|
||||
|
||||
var line = lines[ i ];
|
||||
line = line.trim();
|
||||
|
||||
if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
|
||||
|
||||
// Blank line or comment ignore
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
var pos = line.indexOf( ' ' );
|
||||
|
||||
var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;
|
||||
key = key.toLowerCase();
|
||||
|
||||
var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : "";
|
||||
value = value.trim();
|
||||
|
||||
if ( key === "newmtl" ) {
|
||||
|
||||
// New material
|
||||
|
||||
info = { name: value };
|
||||
materialsInfo[ value ] = info;
|
||||
|
||||
} else if ( info ) {
|
||||
|
||||
if ( key === "ka" || key === "kd" || key === "ks" ) {
|
||||
|
||||
var ss = value.split( delimiter_pattern, 3 );
|
||||
info[ key ] = [ parseFloat( ss[0] ), parseFloat( ss[1] ), parseFloat( ss[2] ) ];
|
||||
|
||||
} else {
|
||||
|
||||
info[ key ] = value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var materialCreator = new THREE.MTLLoader.MaterialCreator( this.baseUrl, this.options );
|
||||
materialCreator.crossOrigin = this.crossOrigin
|
||||
materialCreator.setMaterials( materialsInfo );
|
||||
return materialCreator;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a new THREE-MTLLoader.MaterialCreator
|
||||
* @param baseUrl - Url relative to which textures are loaded
|
||||
* @param options - Set of options on how to construct the materials
|
||||
* side: Which side to apply the material
|
||||
* THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide
|
||||
* wrap: What type of wrapping to apply for textures
|
||||
* THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping
|
||||
* normalizeRGB: RGBs need to be normalized to 0-1 from 0-255
|
||||
* Default: false, assumed to be already normalized
|
||||
* ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's
|
||||
* Default: false
|
||||
* invertTransparency: If transparency need to be inverted (inversion is needed if d = 0 is fully opaque)
|
||||
* Default: false (d = 1 is fully opaque)
|
||||
* @constructor
|
||||
*/
|
||||
|
||||
THREE.MTLLoader.MaterialCreator = function( baseUrl, options ) {
|
||||
|
||||
this.baseUrl = baseUrl;
|
||||
this.options = options;
|
||||
this.materialsInfo = {};
|
||||
this.materials = {};
|
||||
this.materialsArray = [];
|
||||
this.nameLookup = {};
|
||||
|
||||
this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide;
|
||||
this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping;
|
||||
|
||||
};
|
||||
|
||||
THREE.MTLLoader.MaterialCreator.prototype = {
|
||||
|
||||
constructor: THREE.MTLLoader.MaterialCreator,
|
||||
|
||||
setMaterials: function( materialsInfo ) {
|
||||
|
||||
this.materialsInfo = this.convert( materialsInfo );
|
||||
this.materials = {};
|
||||
this.materialsArray = [];
|
||||
this.nameLookup = {};
|
||||
|
||||
},
|
||||
|
||||
convert: function( materialsInfo ) {
|
||||
|
||||
if ( !this.options ) return materialsInfo;
|
||||
|
||||
var converted = {};
|
||||
|
||||
for ( var mn in materialsInfo ) {
|
||||
|
||||
// Convert materials info into normalized form based on options
|
||||
|
||||
var mat = materialsInfo[ mn ];
|
||||
|
||||
var covmat = {};
|
||||
|
||||
converted[ mn ] = covmat;
|
||||
|
||||
for ( var prop in mat ) {
|
||||
|
||||
var save = true;
|
||||
var value = mat[ prop ];
|
||||
var lprop = prop.toLowerCase();
|
||||
|
||||
switch ( lprop ) {
|
||||
|
||||
case 'kd':
|
||||
case 'ka':
|
||||
case 'ks':
|
||||
|
||||
// Diffuse color (color under white light) using RGB values
|
||||
|
||||
if ( this.options && this.options.normalizeRGB ) {
|
||||
|
||||
value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];
|
||||
|
||||
}
|
||||
|
||||
if ( this.options && this.options.ignoreZeroRGBs ) {
|
||||
|
||||
if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 1 ] === 0 ) {
|
||||
|
||||
// ignore
|
||||
|
||||
save = false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
|
||||
// According to MTL format (http://paulbourke.net/dataformats/mtl/):
|
||||
// d is dissolve for current material
|
||||
// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
|
||||
|
||||
if ( this.options && this.options.invertTransparency ) {
|
||||
|
||||
value = 1 - value;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if ( save ) {
|
||||
|
||||
covmat[ lprop ] = value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return converted;
|
||||
|
||||
},
|
||||
|
||||
preload: function () {
|
||||
|
||||
for ( var mn in this.materialsInfo ) {
|
||||
|
||||
this.create( mn );
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
getIndex: function( materialName ) {
|
||||
|
||||
return this.nameLookup[ materialName ];
|
||||
|
||||
},
|
||||
|
||||
getAsArray: function() {
|
||||
|
||||
var index = 0;
|
||||
|
||||
for ( var mn in this.materialsInfo ) {
|
||||
|
||||
this.materialsArray[ index ] = this.create( mn );
|
||||
this.nameLookup[ mn ] = index;
|
||||
index ++;
|
||||
|
||||
}
|
||||
|
||||
return this.materialsArray;
|
||||
|
||||
},
|
||||
|
||||
create: function ( materialName ) {
|
||||
|
||||
if ( this.materials[ materialName ] === undefined ) {
|
||||
|
||||
this.createMaterial_( materialName );
|
||||
|
||||
}
|
||||
|
||||
return this.materials[ materialName ];
|
||||
|
||||
},
|
||||
|
||||
createMaterial_: function ( materialName ) {
|
||||
|
||||
// Create material
|
||||
|
||||
var mat = this.materialsInfo[ materialName ];
|
||||
var params = {
|
||||
|
||||
name: materialName,
|
||||
side: this.side
|
||||
|
||||
};
|
||||
|
||||
for ( var prop in mat ) {
|
||||
|
||||
var value = mat[ prop ];
|
||||
|
||||
switch ( prop.toLowerCase() ) {
|
||||
|
||||
// Ns is material specular exponent
|
||||
|
||||
case 'kd':
|
||||
|
||||
// Diffuse color (color under white light) using RGB values
|
||||
|
||||
params[ 'diffuse' ] = new THREE.Color().fromArray( value );
|
||||
|
||||
break;
|
||||
|
||||
case 'ka':
|
||||
|
||||
// Ambient color (color under shadow) using RGB values
|
||||
|
||||
break;
|
||||
|
||||
case 'ks':
|
||||
|
||||
// Specular color (color when light is reflected from shiny surface) using RGB values
|
||||
params[ 'specular' ] = new THREE.Color().fromArray( value );
|
||||
|
||||
break;
|
||||
|
||||
case 'map_kd':
|
||||
|
||||
// Diffuse texture map
|
||||
|
||||
params[ 'map' ] = this.loadTexture( this.baseUrl + value );
|
||||
params[ 'map' ].wrapS = this.wrap;
|
||||
params[ 'map' ].wrapT = this.wrap;
|
||||
|
||||
break;
|
||||
|
||||
case 'ns':
|
||||
|
||||
// The specular exponent (defines the focus of the specular highlight)
|
||||
// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
|
||||
|
||||
params['shininess'] = value;
|
||||
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
|
||||
// According to MTL format (http://paulbourke.net/dataformats/mtl/):
|
||||
// d is dissolve for current material
|
||||
// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
|
||||
|
||||
if ( value < 1 ) {
|
||||
|
||||
params['transparent'] = true;
|
||||
params['opacity'] = value;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'map_bump':
|
||||
case 'bump':
|
||||
|
||||
// Bump texture map
|
||||
|
||||
if ( params[ 'bumpMap' ] ) break; // Avoid loading twice.
|
||||
|
||||
params[ 'bumpMap' ] = this.loadTexture( this.baseUrl + value );
|
||||
params[ 'bumpMap' ].wrapS = this.wrap;
|
||||
params[ 'bumpMap' ].wrapT = this.wrap;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( params[ 'diffuse' ] ) {
|
||||
|
||||
params[ 'color' ] = params[ 'diffuse' ];
|
||||
|
||||
}
|
||||
|
||||
this.materials[ materialName ] = new THREE.MeshPhongMaterial( params );
|
||||
return this.materials[ materialName ];
|
||||
|
||||
},
|
||||
|
||||
|
||||
loadTexture: function ( url, mapping, onLoad, onError ) {
|
||||
|
||||
var texture;
|
||||
var loader = THREE.Loader.Handlers.get( url );
|
||||
|
||||
if ( loader !== null ) {
|
||||
|
||||
texture = loader.load( url, onLoad );
|
||||
|
||||
} else {
|
||||
|
||||
texture = new THREE.Texture();
|
||||
|
||||
loader = new THREE.ImageLoader();
|
||||
loader.crossOrigin = this.crossOrigin;
|
||||
loader.load( url, function ( image ) {
|
||||
|
||||
texture.image = THREE.MTLLoader.ensurePowerOfTwo_( image );
|
||||
texture.needsUpdate = true;
|
||||
|
||||
if ( onLoad ) onLoad( texture );
|
||||
|
||||
} );
|
||||
|
||||
}
|
||||
|
||||
if ( mapping !== undefined ) texture.mapping = mapping;
|
||||
|
||||
return texture;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
THREE.MTLLoader.ensurePowerOfTwo_ = function ( image ) {
|
||||
|
||||
if ( ! THREE.Math.isPowerOfTwo( image.width ) || ! THREE.Math.isPowerOfTwo( image.height ) ) {
|
||||
|
||||
var canvas = document.createElement( "canvas" );
|
||||
canvas.width = THREE.MTLLoader.nextHighestPowerOfTwo_( image.width );
|
||||
canvas.height = THREE.MTLLoader.nextHighestPowerOfTwo_( image.height );
|
||||
|
||||
var ctx = canvas.getContext("2d");
|
||||
ctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
|
||||
return canvas;
|
||||
|
||||
}
|
||||
|
||||
return image;
|
||||
|
||||
};
|
||||
|
||||
THREE.MTLLoader.nextHighestPowerOfTwo_ = function( x ) {
|
||||
|
||||
-- x;
|
||||
|
||||
for ( var i = 1; i < 32; i <<= 1 ) {
|
||||
|
||||
x = x | x >> i;
|
||||
|
||||
}
|
||||
|
||||
return x + 1;
|
||||
|
||||
};
|
||||
|
||||
THREE.EventDispatcher.prototype.apply( THREE.MTLLoader.prototype );
|
372
js/three/OBJLoader.js
Normal file
372
js/three/OBJLoader.js
Normal file
@ -0,0 +1,372 @@
|
||||
/**
|
||||
* @author mrdoob / http://mrdoob.com/
|
||||
*/
|
||||
|
||||
THREE.OBJLoader = function ( manager ) {
|
||||
|
||||
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
|
||||
|
||||
};
|
||||
|
||||
THREE.OBJLoader.prototype = {
|
||||
|
||||
constructor: THREE.OBJLoader,
|
||||
|
||||
load: function ( url, onLoad, onProgress, onError ) {
|
||||
|
||||
var scope = this;
|
||||
|
||||
var loader = new THREE.XHRLoader( scope.manager );
|
||||
loader.setCrossOrigin( this.crossOrigin );
|
||||
loader.load( url, function ( text ) {
|
||||
|
||||
onLoad( scope.parse( text ) );
|
||||
|
||||
}, onProgress, onError );
|
||||
|
||||
},
|
||||
|
||||
parse: function ( text ) {
|
||||
|
||||
console.time( 'OBJLoader' );
|
||||
|
||||
var object, objects = [];
|
||||
var geometry, material;
|
||||
|
||||
function parseVertexIndex( value ) {
|
||||
|
||||
var index = parseInt( value );
|
||||
|
||||
return ( index >= 0 ? index - 1 : index + vertices.length / 3 ) * 3;
|
||||
|
||||
}
|
||||
|
||||
function parseNormalIndex( value ) {
|
||||
|
||||
var index = parseInt( value );
|
||||
|
||||
return ( index >= 0 ? index - 1 : index + normals.length / 3 ) * 3;
|
||||
|
||||
}
|
||||
|
||||
function parseUVIndex( value ) {
|
||||
|
||||
var index = parseInt( value );
|
||||
|
||||
return ( index >= 0 ? index - 1 : index + uvs.length / 2 ) * 2;
|
||||
|
||||
}
|
||||
|
||||
function addVertex( a, b, c ) {
|
||||
|
||||
geometry.vertices.push(
|
||||
vertices[ a ], vertices[ a + 1 ], vertices[ a + 2 ],
|
||||
vertices[ b ], vertices[ b + 1 ], vertices[ b + 2 ],
|
||||
vertices[ c ], vertices[ c + 1 ], vertices[ c + 2 ]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function addNormal( a, b, c ) {
|
||||
|
||||
geometry.normals.push(
|
||||
normals[ a ], normals[ a + 1 ], normals[ a + 2 ],
|
||||
normals[ b ], normals[ b + 1 ], normals[ b + 2 ],
|
||||
normals[ c ], normals[ c + 1 ], normals[ c + 2 ]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function addUV( a, b, c ) {
|
||||
|
||||
geometry.uvs.push(
|
||||
uvs[ a ], uvs[ a + 1 ],
|
||||
uvs[ b ], uvs[ b + 1 ],
|
||||
uvs[ c ], uvs[ c + 1 ]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function addFace( a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd ) {
|
||||
|
||||
var ia = parseVertexIndex( a );
|
||||
var ib = parseVertexIndex( b );
|
||||
var ic = parseVertexIndex( c );
|
||||
var id;
|
||||
|
||||
if ( d === undefined ) {
|
||||
|
||||
addVertex( ia, ib, ic );
|
||||
|
||||
} else {
|
||||
|
||||
id = parseVertexIndex( d );
|
||||
|
||||
addVertex( ia, ib, id );
|
||||
addVertex( ib, ic, id );
|
||||
|
||||
}
|
||||
|
||||
if ( ua !== undefined ) {
|
||||
|
||||
ia = parseUVIndex( ua );
|
||||
ib = parseUVIndex( ub );
|
||||
ic = parseUVIndex( uc );
|
||||
|
||||
if ( d === undefined ) {
|
||||
|
||||
addUV( ia, ib, ic );
|
||||
|
||||
} else {
|
||||
|
||||
id = parseUVIndex( ud );
|
||||
|
||||
addUV( ia, ib, id );
|
||||
addUV( ib, ic, id );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( na !== undefined ) {
|
||||
|
||||
ia = parseNormalIndex( na );
|
||||
ib = parseNormalIndex( nb );
|
||||
ic = parseNormalIndex( nc );
|
||||
|
||||
if ( d === undefined ) {
|
||||
|
||||
addNormal( ia, ib, ic );
|
||||
|
||||
} else {
|
||||
|
||||
id = parseNormalIndex( nd );
|
||||
|
||||
addNormal( ia, ib, id );
|
||||
addNormal( ib, ic, id );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// create mesh if no objects in text
|
||||
|
||||
if ( /^o /gm.test( text ) === false ) {
|
||||
|
||||
geometry = {
|
||||
vertices: [],
|
||||
normals: [],
|
||||
uvs: []
|
||||
};
|
||||
|
||||
material = {
|
||||
name: ''
|
||||
};
|
||||
|
||||
object = {
|
||||
name: '',
|
||||
geometry: geometry,
|
||||
material: material
|
||||
};
|
||||
|
||||
objects.push( object );
|
||||
|
||||
}
|
||||
|
||||
var vertices = [];
|
||||
var normals = [];
|
||||
var uvs = [];
|
||||
|
||||
// v float float float
|
||||
|
||||
var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
|
||||
|
||||
// vn float float float
|
||||
|
||||
var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
|
||||
|
||||
// vt float float
|
||||
|
||||
var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
|
||||
|
||||
// f vertex vertex vertex ...
|
||||
|
||||
var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/;
|
||||
|
||||
// f vertex/uv vertex/uv vertex/uv ...
|
||||
|
||||
var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/;
|
||||
|
||||
// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
|
||||
|
||||
var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/;
|
||||
|
||||
// f vertex//normal vertex//normal vertex//normal ...
|
||||
|
||||
var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/
|
||||
|
||||
//
|
||||
|
||||
var lines = text.split( '\n' );
|
||||
|
||||
for ( var i = 0; i < lines.length; i ++ ) {
|
||||
|
||||
var line = lines[ i ];
|
||||
line = line.trim();
|
||||
|
||||
var result;
|
||||
|
||||
if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
|
||||
|
||||
continue;
|
||||
|
||||
} else if ( ( result = vertex_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
||||
|
||||
vertices.push(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] ),
|
||||
parseFloat( result[ 3 ] )
|
||||
);
|
||||
|
||||
} else if ( ( result = normal_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
||||
|
||||
normals.push(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] ),
|
||||
parseFloat( result[ 3 ] )
|
||||
);
|
||||
|
||||
} else if ( ( result = uv_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["vt 0.1 0.2", "0.1", "0.2"]
|
||||
|
||||
uvs.push(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] )
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern1.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1 2 3", "1", "2", "3", undefined]
|
||||
|
||||
addFace(
|
||||
result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ]
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern2.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
|
||||
|
||||
addFace(
|
||||
result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ],
|
||||
result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ]
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern3.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
|
||||
|
||||
addFace(
|
||||
result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ],
|
||||
result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ],
|
||||
result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ]
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern4.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
|
||||
|
||||
addFace(
|
||||
result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ],
|
||||
undefined, undefined, undefined, undefined,
|
||||
result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ]
|
||||
);
|
||||
|
||||
} else if ( /^o /.test( line ) ) {
|
||||
|
||||
geometry = {
|
||||
vertices: [],
|
||||
normals: [],
|
||||
uvs: []
|
||||
};
|
||||
|
||||
material = {
|
||||
name: ''
|
||||
};
|
||||
|
||||
object = {
|
||||
name: line.substring( 2 ).trim(),
|
||||
geometry: geometry,
|
||||
material: material
|
||||
};
|
||||
|
||||
objects.push( object )
|
||||
|
||||
} else if ( /^g /.test( line ) ) {
|
||||
|
||||
// group
|
||||
|
||||
} else if ( /^usemtl /.test( line ) ) {
|
||||
|
||||
// material
|
||||
|
||||
material.name = line.substring( 7 ).trim();
|
||||
|
||||
} else if ( /^mtllib /.test( line ) ) {
|
||||
|
||||
// mtl file
|
||||
|
||||
} else if ( /^s /.test( line ) ) {
|
||||
|
||||
// smooth shading
|
||||
|
||||
} else {
|
||||
|
||||
// console.log( "THREE.OBJLoader: Unhandled line " + line );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var container = new THREE.Object3D();
|
||||
|
||||
for ( var i = 0, l = objects.length; i < l; i ++ ) {
|
||||
|
||||
object = objects[ i ];
|
||||
geometry = object.geometry;
|
||||
|
||||
var buffergeometry = new THREE.BufferGeometry();
|
||||
|
||||
buffergeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( geometry.vertices ), 3 ) );
|
||||
|
||||
if ( geometry.normals.length > 0 ) {
|
||||
buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) );
|
||||
}
|
||||
|
||||
if ( geometry.uvs.length > 0 ) {
|
||||
buffergeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geometry.uvs ), 2 ) );
|
||||
}
|
||||
|
||||
material = new THREE.MeshLambertMaterial();
|
||||
material.name = object.material.name;
|
||||
|
||||
var mesh = new THREE.Mesh( buffergeometry, material );
|
||||
mesh.name = object.name;
|
||||
|
||||
container.add( mesh );
|
||||
|
||||
}
|
||||
|
||||
console.timeEnd( 'OBJLoader' );
|
||||
|
||||
return container;
|
||||
|
||||
}
|
||||
|
||||
};
|
365
js/three/OBJMTLLoader.js
Normal file
365
js/three/OBJMTLLoader.js
Normal file
@ -0,0 +1,365 @@
|
||||
/**
|
||||
* Loads a Wavefront .obj file with materials
|
||||
*
|
||||
* @author mrdoob / http://mrdoob.com/
|
||||
* @author angelxuanchang
|
||||
*/
|
||||
|
||||
THREE.OBJMTLLoader = function ( manager ) {
|
||||
|
||||
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
|
||||
|
||||
};
|
||||
|
||||
THREE.OBJMTLLoader.prototype = {
|
||||
|
||||
constructor: THREE.OBJMTLLoader,
|
||||
|
||||
load: function ( url, mtlurl, onLoad, onProgress, onError ) {
|
||||
|
||||
var scope = this;
|
||||
|
||||
var mtlLoader = new THREE.MTLLoader( url.substr( 0, url.lastIndexOf( "/" ) + 1 ) );
|
||||
mtlLoader.crossOrigin = scope.crossOrigin;
|
||||
mtlLoader.load( mtlurl, function ( materials ) {
|
||||
|
||||
var materialsCreator = materials;
|
||||
materialsCreator.preload();
|
||||
|
||||
var loader = new THREE.XHRLoader( scope.manager );
|
||||
loader.setCrossOrigin( scope.crossOrigin );
|
||||
loader.load( url, function ( text ) {
|
||||
|
||||
var object = scope.parse( text );
|
||||
|
||||
object.traverse( function ( object ) {
|
||||
|
||||
if ( object instanceof THREE.Mesh ) {
|
||||
|
||||
if ( object.material.name ) {
|
||||
|
||||
var material = materialsCreator.create( object.material.name );
|
||||
|
||||
if ( material ) object.material = material;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} );
|
||||
|
||||
onLoad( object );
|
||||
|
||||
}, onProgress, onError );
|
||||
|
||||
}, onProgress, onError );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Parses loaded .obj file
|
||||
* @param data - content of .obj file
|
||||
* @param mtllibCallback - callback to handle mtllib declaration (optional)
|
||||
* @return {THREE.Object3D} - Object3D (with default material)
|
||||
*/
|
||||
|
||||
parse: function ( data, mtllibCallback ) {
|
||||
|
||||
function vector( x, y, z ) {
|
||||
|
||||
return new THREE.Vector3( x, y, z );
|
||||
|
||||
}
|
||||
|
||||
function uv( u, v ) {
|
||||
|
||||
return new THREE.Vector2( u, v );
|
||||
|
||||
}
|
||||
|
||||
function face3( a, b, c, normals ) {
|
||||
|
||||
return new THREE.Face3( a, b, c, normals );
|
||||
|
||||
}
|
||||
|
||||
var face_offset = 0;
|
||||
|
||||
function meshN( meshName, materialName ) {
|
||||
|
||||
if ( vertices.length > 0 ) {
|
||||
|
||||
geometry.vertices = vertices;
|
||||
|
||||
geometry.mergeVertices();
|
||||
geometry.computeFaceNormals();
|
||||
geometry.computeBoundingSphere();
|
||||
|
||||
object.add( mesh );
|
||||
|
||||
geometry = new THREE.Geometry();
|
||||
mesh = new THREE.Mesh( geometry, material );
|
||||
|
||||
}
|
||||
|
||||
if ( meshName !== undefined ) mesh.name = meshName;
|
||||
|
||||
if ( materialName !== undefined ) {
|
||||
|
||||
material = new THREE.MeshLambertMaterial();
|
||||
material.name = materialName;
|
||||
|
||||
mesh.material = material;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var group = new THREE.Group();
|
||||
var object = group;
|
||||
|
||||
var geometry = new THREE.Geometry();
|
||||
var material = new THREE.MeshLambertMaterial();
|
||||
var mesh = new THREE.Mesh( geometry, material );
|
||||
|
||||
var vertices = [];
|
||||
var normals = [];
|
||||
var uvs = [];
|
||||
|
||||
function add_face( a, b, c, normals_inds ) {
|
||||
|
||||
if ( normals_inds === undefined ) {
|
||||
|
||||
geometry.faces.push( face3(
|
||||
parseInt( a ) - (face_offset + 1),
|
||||
parseInt( b ) - (face_offset + 1),
|
||||
parseInt( c ) - (face_offset + 1)
|
||||
) );
|
||||
|
||||
} else {
|
||||
|
||||
geometry.faces.push( face3(
|
||||
parseInt( a ) - (face_offset + 1),
|
||||
parseInt( b ) - (face_offset + 1),
|
||||
parseInt( c ) - (face_offset + 1),
|
||||
[
|
||||
normals[ parseInt( normals_inds[ 0 ] ) - 1 ].clone(),
|
||||
normals[ parseInt( normals_inds[ 1 ] ) - 1 ].clone(),
|
||||
normals[ parseInt( normals_inds[ 2 ] ) - 1 ].clone()
|
||||
]
|
||||
) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function add_uvs( a, b, c ) {
|
||||
|
||||
geometry.faceVertexUvs[ 0 ].push( [
|
||||
uvs[ parseInt( a ) - 1 ].clone(),
|
||||
uvs[ parseInt( b ) - 1 ].clone(),
|
||||
uvs[ parseInt( c ) - 1 ].clone()
|
||||
] );
|
||||
|
||||
}
|
||||
|
||||
function handle_face_line(faces, uvs, normals_inds) {
|
||||
|
||||
if ( faces[ 3 ] === undefined ) {
|
||||
|
||||
add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds );
|
||||
|
||||
if (!(uvs === undefined) && uvs.length > 0) {
|
||||
add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] );
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (!(normals_inds === undefined) && normals_inds.length > 0) {
|
||||
|
||||
add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ]);
|
||||
add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ]);
|
||||
|
||||
} else {
|
||||
|
||||
add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ]);
|
||||
add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ]);
|
||||
|
||||
}
|
||||
|
||||
if (!(uvs === undefined) && uvs.length > 0) {
|
||||
|
||||
add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] );
|
||||
add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// v float float float
|
||||
|
||||
var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
|
||||
|
||||
// vn float float float
|
||||
|
||||
var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
|
||||
|
||||
// vt float float
|
||||
|
||||
var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
|
||||
|
||||
// f vertex vertex vertex ...
|
||||
|
||||
var face_pattern1 = /f( +\d+)( +\d+)( +\d+)( +\d+)?/;
|
||||
|
||||
// f vertex/uv vertex/uv vertex/uv ...
|
||||
|
||||
var face_pattern2 = /f( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))?/;
|
||||
|
||||
// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
|
||||
|
||||
var face_pattern3 = /f( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))?/;
|
||||
|
||||
// f vertex//normal vertex//normal vertex//normal ...
|
||||
|
||||
var face_pattern4 = /f( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))?/
|
||||
|
||||
//
|
||||
|
||||
var lines = data.split( "\n" );
|
||||
|
||||
for ( var i = 0; i < lines.length; i ++ ) {
|
||||
|
||||
var line = lines[ i ];
|
||||
line = line.trim();
|
||||
|
||||
var result;
|
||||
|
||||
if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
|
||||
|
||||
continue;
|
||||
|
||||
} else if ( ( result = vertex_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
||||
|
||||
vertices.push( vector(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] ),
|
||||
parseFloat( result[ 3 ] )
|
||||
) );
|
||||
|
||||
} else if ( ( result = normal_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
||||
|
||||
normals.push( vector(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] ),
|
||||
parseFloat( result[ 3 ] )
|
||||
) );
|
||||
|
||||
} else if ( ( result = uv_pattern.exec( line ) ) !== null ) {
|
||||
|
||||
// ["vt 0.1 0.2", "0.1", "0.2"]
|
||||
|
||||
uvs.push( uv(
|
||||
parseFloat( result[ 1 ] ),
|
||||
parseFloat( result[ 2 ] )
|
||||
) );
|
||||
|
||||
} else if ( ( result = face_pattern1.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1 2 3", "1", "2", "3", undefined]
|
||||
|
||||
handle_face_line([ result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] ]);
|
||||
|
||||
} else if ( ( result = face_pattern2.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
|
||||
|
||||
handle_face_line(
|
||||
[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
|
||||
[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern3.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
|
||||
|
||||
handle_face_line(
|
||||
[ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces
|
||||
[ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv
|
||||
[ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal
|
||||
);
|
||||
|
||||
} else if ( ( result = face_pattern4.exec( line ) ) !== null ) {
|
||||
|
||||
// ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
|
||||
|
||||
handle_face_line(
|
||||
[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
|
||||
[ ], //uv
|
||||
[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal
|
||||
);
|
||||
|
||||
} else if ( /^o /.test( line ) ) {
|
||||
|
||||
// object
|
||||
|
||||
meshN();
|
||||
face_offset = face_offset + vertices.length;
|
||||
vertices = [];
|
||||
object = new THREE.Object3D();
|
||||
object.name = line.substring( 2 ).trim();
|
||||
group.add( object );
|
||||
|
||||
} else if ( /^g /.test( line ) ) {
|
||||
|
||||
// group
|
||||
|
||||
meshN( line.substring( 2 ).trim(), undefined );
|
||||
|
||||
} else if ( /^usemtl /.test( line ) ) {
|
||||
|
||||
// material
|
||||
|
||||
meshN( undefined, line.substring( 7 ).trim() );
|
||||
|
||||
} else if ( /^mtllib /.test( line ) ) {
|
||||
|
||||
// mtl file
|
||||
|
||||
if ( mtllibCallback ) {
|
||||
|
||||
var mtlfile = line.substring( 7 );
|
||||
mtlfile = mtlfile.trim();
|
||||
mtllibCallback( mtlfile );
|
||||
|
||||
}
|
||||
|
||||
} else if ( /^s /.test( line ) ) {
|
||||
|
||||
// Smooth shading
|
||||
|
||||
} else {
|
||||
|
||||
console.log( "THREE.OBJMTLLoader: Unhandled line " + line );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Add last object
|
||||
meshN(undefined, undefined);
|
||||
|
||||
return group;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
THREE.EventDispatcher.prototype.apply( THREE.OBJMTLLoader.prototype );
|
706
js/three/OrbitControls.js
Normal file
706
js/three/OrbitControls.js
Normal file
@ -0,0 +1,706 @@
|
||||
/**
|
||||
* @author qiao / https://github.com/qiao
|
||||
* @author mrdoob / http://mrdoob.com
|
||||
* @author alteredq / http://alteredqualia.com/
|
||||
* @author WestLangley / http://github.com/WestLangley
|
||||
* @author erich666 / http://erichaines.com
|
||||
*/
|
||||
/*global THREE, console */
|
||||
|
||||
// This set of controls performs orbiting, dollying (zooming), and panning. It maintains
|
||||
// the "up" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is
|
||||
// supported.
|
||||
//
|
||||
// Orbit - left mouse / touch: one finger move
|
||||
// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
|
||||
// Pan - right mouse, or arrow keys / touch: three finter swipe
|
||||
|
||||
THREE.OrbitControls = function ( object, domElement ) {
|
||||
|
||||
this.object = object;
|
||||
this.domElement = ( domElement !== undefined ) ? domElement : document;
|
||||
|
||||
// API
|
||||
|
||||
// Set to false to disable this control
|
||||
this.enabled = true;
|
||||
|
||||
// "target" sets the location of focus, where the control orbits around
|
||||
// and where it pans with respect to.
|
||||
this.target = new THREE.Vector3();
|
||||
|
||||
// center is old, deprecated; use "target" instead
|
||||
this.center = this.target;
|
||||
|
||||
// This option actually enables dollying in and out; left as "zoom" for
|
||||
// backwards compatibility
|
||||
this.noZoom = false;
|
||||
this.zoomSpeed = 1.0;
|
||||
|
||||
// Limits to how far you can dolly in and out ( PerspectiveCamera only )
|
||||
this.minDistance = 0;
|
||||
this.maxDistance = Infinity;
|
||||
|
||||
// Limits to how far you can zoom in and out ( OrthographicCamera only )
|
||||
this.minZoom = 0;
|
||||
this.maxZoom = Infinity;
|
||||
|
||||
// Set to true to disable this control
|
||||
this.noRotate = false;
|
||||
this.rotateSpeed = 1.0;
|
||||
|
||||
// Set to true to disable this control
|
||||
this.noPan = false;
|
||||
this.keyPanSpeed = 7.0; // pixels moved per arrow key push
|
||||
|
||||
// Set to true to automatically rotate around the target
|
||||
this.autoRotate = false;
|
||||
this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
|
||||
|
||||
// How far you can orbit vertically, upper and lower limits.
|
||||
// Range is 0 to Math.PI radians.
|
||||
this.minPolarAngle = 0; // radians
|
||||
this.maxPolarAngle = Math.PI; // radians
|
||||
|
||||
// How far you can orbit horizontally, upper and lower limits.
|
||||
// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].
|
||||
this.minAzimuthAngle = - Infinity; // radians
|
||||
this.maxAzimuthAngle = Infinity; // radians
|
||||
|
||||
// Set to true to disable use of the keys
|
||||
this.noKeys = false;
|
||||
|
||||
// The four arrow keys
|
||||
this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };
|
||||
|
||||
// Mouse buttons
|
||||
this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };
|
||||
|
||||
////////////
|
||||
// internals
|
||||
|
||||
var scope = this;
|
||||
|
||||
var EPS = 0.000001;
|
||||
|
||||
var rotateStart = new THREE.Vector2();
|
||||
var rotateEnd = new THREE.Vector2();
|
||||
var rotateDelta = new THREE.Vector2();
|
||||
|
||||
var panStart = new THREE.Vector2();
|
||||
var panEnd = new THREE.Vector2();
|
||||
var panDelta = new THREE.Vector2();
|
||||
var panOffset = new THREE.Vector3();
|
||||
|
||||
var offset = new THREE.Vector3();
|
||||
|
||||
var dollyStart = new THREE.Vector2();
|
||||
var dollyEnd = new THREE.Vector2();
|
||||
var dollyDelta = new THREE.Vector2();
|
||||
|
||||
var theta;
|
||||
var phi;
|
||||
var phiDelta = 0;
|
||||
var thetaDelta = 0;
|
||||
var scale = 1;
|
||||
var pan = new THREE.Vector3();
|
||||
|
||||
var lastPosition = new THREE.Vector3();
|
||||
var lastQuaternion = new THREE.Quaternion();
|
||||
|
||||
var STATE = { NONE : -1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };
|
||||
|
||||
var state = STATE.NONE;
|
||||
|
||||
// for reset
|
||||
|
||||
this.target0 = this.target.clone();
|
||||
this.position0 = this.object.position.clone();
|
||||
this.zoom0 = this.object.zoom;
|
||||
|
||||
// so camera.up is the orbit axis
|
||||
|
||||
var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );
|
||||
var quatInverse = quat.clone().inverse();
|
||||
|
||||
// events
|
||||
|
||||
var changeEvent = { type: 'change' };
|
||||
var startEvent = { type: 'start' };
|
||||
var endEvent = { type: 'end' };
|
||||
|
||||
this.rotateLeft = function ( angle ) {
|
||||
|
||||
if ( angle === undefined ) {
|
||||
|
||||
angle = getAutoRotationAngle();
|
||||
|
||||
}
|
||||
|
||||
thetaDelta -= angle;
|
||||
|
||||
};
|
||||
|
||||
this.rotateUp = function ( angle ) {
|
||||
|
||||
if ( angle === undefined ) {
|
||||
|
||||
angle = getAutoRotationAngle();
|
||||
|
||||
}
|
||||
|
||||
phiDelta -= angle;
|
||||
|
||||
};
|
||||
|
||||
// pass in distance in world space to move left
|
||||
this.panLeft = function ( distance ) {
|
||||
|
||||
var te = this.object.matrix.elements;
|
||||
|
||||
// get X column of matrix
|
||||
panOffset.set( te[ 0 ], te[ 1 ], te[ 2 ] );
|
||||
panOffset.multiplyScalar( - distance );
|
||||
|
||||
pan.add( panOffset );
|
||||
|
||||
};
|
||||
|
||||
// pass in distance in world space to move up
|
||||
this.panUp = function ( distance ) {
|
||||
|
||||
var te = this.object.matrix.elements;
|
||||
|
||||
// get Y column of matrix
|
||||
panOffset.set( te[ 4 ], te[ 5 ], te[ 6 ] );
|
||||
panOffset.multiplyScalar( distance );
|
||||
|
||||
pan.add( panOffset );
|
||||
|
||||
};
|
||||
|
||||
// pass in x,y of change desired in pixel space,
|
||||
// right and down are positive
|
||||
this.pan = function ( deltaX, deltaY ) {
|
||||
|
||||
var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
||||
|
||||
if ( scope.object instanceof THREE.PerspectiveCamera ) {
|
||||
|
||||
// perspective
|
||||
var position = scope.object.position;
|
||||
var offset = position.clone().sub( scope.target );
|
||||
var targetDistance = offset.length();
|
||||
|
||||
// half of the fov is center to top of screen
|
||||
targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );
|
||||
|
||||
// we actually don't use screenWidth, since perspective camera is fixed to screen height
|
||||
scope.panLeft( 2 * deltaX * targetDistance / element.clientHeight );
|
||||
scope.panUp( 2 * deltaY * targetDistance / element.clientHeight );
|
||||
|
||||
} else if ( scope.object instanceof THREE.OrthographicCamera ) {
|
||||
|
||||
// orthographic
|
||||
scope.panLeft( deltaX * (scope.object.right - scope.object.left) / element.clientWidth );
|
||||
scope.panUp( deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight );
|
||||
|
||||
} else {
|
||||
|
||||
// camera neither orthographic or perspective
|
||||
console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
this.dollyIn = function ( dollyScale ) {
|
||||
|
||||
if ( dollyScale === undefined ) {
|
||||
|
||||
dollyScale = getZoomScale();
|
||||
|
||||
}
|
||||
|
||||
if ( scope.object instanceof THREE.PerspectiveCamera ) {
|
||||
|
||||
scale /= dollyScale;
|
||||
|
||||
} else if ( scope.object instanceof THREE.OrthographicCamera ) {
|
||||
|
||||
scope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom * dollyScale ) );
|
||||
scope.object.updateProjectionMatrix();
|
||||
scope.dispatchEvent( changeEvent );
|
||||
|
||||
} else {
|
||||
|
||||
console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
this.dollyOut = function ( dollyScale ) {
|
||||
|
||||
if ( dollyScale === undefined ) {
|
||||
|
||||
dollyScale = getZoomScale();
|
||||
|
||||
}
|
||||
|
||||
if ( scope.object instanceof THREE.PerspectiveCamera ) {
|
||||
|
||||
scale *= dollyScale;
|
||||
|
||||
} else if ( scope.object instanceof THREE.OrthographicCamera ) {
|
||||
|
||||
scope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / dollyScale ) );
|
||||
scope.object.updateProjectionMatrix();
|
||||
scope.dispatchEvent( changeEvent );
|
||||
|
||||
} else {
|
||||
|
||||
console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
this.update = function () {
|
||||
|
||||
var position = this.object.position;
|
||||
|
||||
offset.copy( position ).sub( this.target );
|
||||
|
||||
// rotate offset to "y-axis-is-up" space
|
||||
offset.applyQuaternion( quat );
|
||||
|
||||
// angle from z-axis around y-axis
|
||||
|
||||
theta = Math.atan2( offset.x, offset.z );
|
||||
|
||||
// angle from y-axis
|
||||
|
||||
phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );
|
||||
|
||||
if ( this.autoRotate && state === STATE.NONE ) {
|
||||
|
||||
this.rotateLeft( getAutoRotationAngle() );
|
||||
|
||||
}
|
||||
|
||||
theta += thetaDelta;
|
||||
phi += phiDelta;
|
||||
|
||||
// restrict theta to be between desired limits
|
||||
theta = Math.max( this.minAzimuthAngle, Math.min( this.maxAzimuthAngle, theta ) );
|
||||
|
||||
// restrict phi to be between desired limits
|
||||
phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) );
|
||||
|
||||
// restrict phi to be betwee EPS and PI-EPS
|
||||
phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );
|
||||
|
||||
var radius = offset.length() * scale;
|
||||
|
||||
// restrict radius to be between desired limits
|
||||
radius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) );
|
||||
|
||||
// move target to panned location
|
||||
this.target.add( pan );
|
||||
|
||||
offset.x = radius * Math.sin( phi ) * Math.sin( theta );
|
||||
offset.y = radius * Math.cos( phi );
|
||||
offset.z = radius * Math.sin( phi ) * Math.cos( theta );
|
||||
|
||||
// rotate offset back to "camera-up-vector-is-up" space
|
||||
offset.applyQuaternion( quatInverse );
|
||||
|
||||
position.copy( this.target ).add( offset );
|
||||
|
||||
this.object.lookAt( this.target );
|
||||
|
||||
thetaDelta = 0;
|
||||
phiDelta = 0;
|
||||
scale = 1;
|
||||
pan.set( 0, 0, 0 );
|
||||
|
||||
// update condition is:
|
||||
// min(camera displacement, camera rotation in radians)^2 > EPS
|
||||
// using small-angle approximation cos(x/2) = 1 - x^2 / 8
|
||||
|
||||
if ( lastPosition.distanceToSquared( this.object.position ) > EPS
|
||||
|| 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS ) {
|
||||
|
||||
this.dispatchEvent( changeEvent );
|
||||
|
||||
lastPosition.copy( this.object.position );
|
||||
lastQuaternion.copy (this.object.quaternion );
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
this.reset = function () {
|
||||
|
||||
state = STATE.NONE;
|
||||
|
||||
this.target.copy( this.target0 );
|
||||
this.object.position.copy( this.position0 );
|
||||
this.object.zoom = this.zoom0;
|
||||
|
||||
this.object.updateProjectionMatrix();
|
||||
this.dispatchEvent( changeEvent );
|
||||
|
||||
this.update();
|
||||
|
||||
};
|
||||
|
||||
this.getPolarAngle = function () {
|
||||
|
||||
return phi;
|
||||
|
||||
};
|
||||
|
||||
this.getAzimuthalAngle = function () {
|
||||
|
||||
return theta
|
||||
|
||||
};
|
||||
|
||||
function getAutoRotationAngle() {
|
||||
|
||||
return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
|
||||
|
||||
}
|
||||
|
||||
function getZoomScale() {
|
||||
|
||||
return Math.pow( 0.95, scope.zoomSpeed );
|
||||
|
||||
}
|
||||
|
||||
function onMouseDown( event ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
event.preventDefault();
|
||||
|
||||
if ( event.button === scope.mouseButtons.ORBIT ) {
|
||||
if ( scope.noRotate === true ) return;
|
||||
|
||||
state = STATE.ROTATE;
|
||||
|
||||
rotateStart.set( event.clientX, event.clientY );
|
||||
|
||||
} else if ( event.button === scope.mouseButtons.ZOOM ) {
|
||||
if ( scope.noZoom === true ) return;
|
||||
|
||||
state = STATE.DOLLY;
|
||||
|
||||
dollyStart.set( event.clientX, event.clientY );
|
||||
|
||||
} else if ( event.button === scope.mouseButtons.PAN ) {
|
||||
if ( scope.noPan === true ) return;
|
||||
|
||||
state = STATE.PAN;
|
||||
|
||||
panStart.set( event.clientX, event.clientY );
|
||||
|
||||
}
|
||||
|
||||
if ( state !== STATE.NONE ) {
|
||||
document.addEventListener( 'mousemove', onMouseMove, false );
|
||||
document.addEventListener( 'mouseup', onMouseUp, false );
|
||||
scope.dispatchEvent( startEvent );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function onMouseMove( event ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
||||
|
||||
if ( state === STATE.ROTATE ) {
|
||||
|
||||
if ( scope.noRotate === true ) return;
|
||||
|
||||
rotateEnd.set( event.clientX, event.clientY );
|
||||
rotateDelta.subVectors( rotateEnd, rotateStart );
|
||||
|
||||
// rotating across whole screen goes 360 degrees around
|
||||
scope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );
|
||||
|
||||
// rotating up and down along whole screen attempts to go 360, but limited to 180
|
||||
scope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );
|
||||
|
||||
rotateStart.copy( rotateEnd );
|
||||
|
||||
} else if ( state === STATE.DOLLY ) {
|
||||
|
||||
if ( scope.noZoom === true ) return;
|
||||
|
||||
dollyEnd.set( event.clientX, event.clientY );
|
||||
dollyDelta.subVectors( dollyEnd, dollyStart );
|
||||
|
||||
if ( dollyDelta.y > 0 ) {
|
||||
|
||||
scope.dollyIn();
|
||||
|
||||
} else if ( dollyDelta.y < 0 ) {
|
||||
|
||||
scope.dollyOut();
|
||||
|
||||
}
|
||||
|
||||
dollyStart.copy( dollyEnd );
|
||||
|
||||
} else if ( state === STATE.PAN ) {
|
||||
|
||||
if ( scope.noPan === true ) return;
|
||||
|
||||
panEnd.set( event.clientX, event.clientY );
|
||||
panDelta.subVectors( panEnd, panStart );
|
||||
|
||||
scope.pan( panDelta.x, panDelta.y );
|
||||
|
||||
panStart.copy( panEnd );
|
||||
|
||||
}
|
||||
|
||||
if ( state !== STATE.NONE ) scope.update();
|
||||
|
||||
}
|
||||
|
||||
function onMouseUp( /* event */ ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
document.removeEventListener( 'mousemove', onMouseMove, false );
|
||||
document.removeEventListener( 'mouseup', onMouseUp, false );
|
||||
scope.dispatchEvent( endEvent );
|
||||
state = STATE.NONE;
|
||||
|
||||
}
|
||||
|
||||
function onMouseWheel( event ) {
|
||||
|
||||
if ( scope.enabled === false || scope.noZoom === true || state !== STATE.NONE ) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
var delta = 0;
|
||||
|
||||
if ( event.wheelDelta !== undefined ) { // WebKit / Opera / Explorer 9
|
||||
|
||||
delta = event.wheelDelta;
|
||||
|
||||
} else if ( event.detail !== undefined ) { // Firefox
|
||||
|
||||
delta = - event.detail;
|
||||
|
||||
}
|
||||
|
||||
if ( delta > 0 ) {
|
||||
|
||||
scope.dollyOut();
|
||||
|
||||
} else if ( delta < 0 ) {
|
||||
|
||||
scope.dollyIn();
|
||||
|
||||
}
|
||||
|
||||
scope.update();
|
||||
scope.dispatchEvent( startEvent );
|
||||
scope.dispatchEvent( endEvent );
|
||||
|
||||
}
|
||||
|
||||
function onKeyDown( event ) {
|
||||
|
||||
if ( scope.enabled === false || scope.noKeys === true || scope.noPan === true ) return;
|
||||
|
||||
switch ( event.keyCode ) {
|
||||
|
||||
case scope.keys.UP:
|
||||
scope.pan( 0, scope.keyPanSpeed );
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
case scope.keys.BOTTOM:
|
||||
scope.pan( 0, - scope.keyPanSpeed );
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
case scope.keys.LEFT:
|
||||
scope.pan( scope.keyPanSpeed, 0 );
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
case scope.keys.RIGHT:
|
||||
scope.pan( - scope.keyPanSpeed, 0 );
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function touchstart( event ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
switch ( event.touches.length ) {
|
||||
|
||||
case 1: // one-fingered touch: rotate
|
||||
|
||||
if ( scope.noRotate === true ) return;
|
||||
|
||||
state = STATE.TOUCH_ROTATE;
|
||||
|
||||
rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
||||
break;
|
||||
|
||||
case 2: // two-fingered touch: dolly
|
||||
|
||||
if ( scope.noZoom === true ) return;
|
||||
|
||||
state = STATE.TOUCH_DOLLY;
|
||||
|
||||
var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
||||
var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
||||
var distance = Math.sqrt( dx * dx + dy * dy );
|
||||
dollyStart.set( 0, distance );
|
||||
break;
|
||||
|
||||
case 3: // three-fingered touch: pan
|
||||
|
||||
if ( scope.noPan === true ) return;
|
||||
|
||||
state = STATE.TOUCH_PAN;
|
||||
|
||||
panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
state = STATE.NONE;
|
||||
|
||||
}
|
||||
|
||||
if ( state !== STATE.NONE ) scope.dispatchEvent( startEvent );
|
||||
|
||||
}
|
||||
|
||||
function touchmove( event ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
||||
|
||||
switch ( event.touches.length ) {
|
||||
|
||||
case 1: // one-fingered touch: rotate
|
||||
|
||||
if ( scope.noRotate === true ) return;
|
||||
if ( state !== STATE.TOUCH_ROTATE ) return;
|
||||
|
||||
rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
||||
rotateDelta.subVectors( rotateEnd, rotateStart );
|
||||
|
||||
// rotating across whole screen goes 360 degrees around
|
||||
scope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );
|
||||
// rotating up and down along whole screen attempts to go 360, but limited to 180
|
||||
scope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );
|
||||
|
||||
rotateStart.copy( rotateEnd );
|
||||
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
case 2: // two-fingered touch: dolly
|
||||
|
||||
if ( scope.noZoom === true ) return;
|
||||
if ( state !== STATE.TOUCH_DOLLY ) return;
|
||||
|
||||
var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
|
||||
var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
|
||||
var distance = Math.sqrt( dx * dx + dy * dy );
|
||||
|
||||
dollyEnd.set( 0, distance );
|
||||
dollyDelta.subVectors( dollyEnd, dollyStart );
|
||||
|
||||
if ( dollyDelta.y > 0 ) {
|
||||
|
||||
scope.dollyOut();
|
||||
|
||||
} else if ( dollyDelta.y < 0 ) {
|
||||
|
||||
scope.dollyIn();
|
||||
|
||||
}
|
||||
|
||||
dollyStart.copy( dollyEnd );
|
||||
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
case 3: // three-fingered touch: pan
|
||||
|
||||
if ( scope.noPan === true ) return;
|
||||
if ( state !== STATE.TOUCH_PAN ) return;
|
||||
|
||||
panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
|
||||
panDelta.subVectors( panEnd, panStart );
|
||||
|
||||
scope.pan( panDelta.x, panDelta.y );
|
||||
|
||||
panStart.copy( panEnd );
|
||||
|
||||
scope.update();
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
state = STATE.NONE;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function touchend( /* event */ ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
scope.dispatchEvent( endEvent );
|
||||
state = STATE.NONE;
|
||||
|
||||
}
|
||||
|
||||
this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
|
||||
this.domElement.addEventListener( 'mousedown', onMouseDown, false );
|
||||
this.domElement.addEventListener( 'mousewheel', onMouseWheel, false );
|
||||
this.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox
|
||||
|
||||
this.domElement.addEventListener( 'touchstart', touchstart, false );
|
||||
this.domElement.addEventListener( 'touchend', touchend, false );
|
||||
this.domElement.addEventListener( 'touchmove', touchmove, false );
|
||||
|
||||
window.addEventListener( 'keydown', onKeyDown, false );
|
||||
|
||||
// force an update at start
|
||||
this.update();
|
||||
|
||||
};
|
||||
|
||||
THREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );
|
||||
THREE.OrbitControls.prototype.constructor = THREE.OrbitControls;
|
63
js/three/PointerLockControls.js
Normal file
63
js/three/PointerLockControls.js
Normal file
@ -0,0 +1,63 @@
|
||||
/**
|
||||
* @author mrdoob / http://mrdoob.com/
|
||||
*/
|
||||
|
||||
THREE.PointerLockControls = function ( camera ) {
|
||||
|
||||
var scope = this;
|
||||
|
||||
camera.rotation.set( 0, 0, 0 );
|
||||
|
||||
var pitchObject = new THREE.Object3D();
|
||||
pitchObject.add( camera );
|
||||
|
||||
var yawObject = new THREE.Object3D();
|
||||
yawObject.position.y = 10;
|
||||
yawObject.add( pitchObject );
|
||||
|
||||
var PI_2 = Math.PI / 2;
|
||||
|
||||
var onMouseMove = function ( event ) {
|
||||
|
||||
if ( scope.enabled === false ) return;
|
||||
|
||||
var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
|
||||
var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
|
||||
|
||||
yawObject.rotation.y -= movementX * 0.002;
|
||||
pitchObject.rotation.x -= movementY * 0.002;
|
||||
|
||||
pitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) );
|
||||
|
||||
};
|
||||
|
||||
document.addEventListener( 'mousemove', onMouseMove, false );
|
||||
|
||||
this.enabled = false;
|
||||
|
||||
this.getObject = function () {
|
||||
|
||||
return yawObject;
|
||||
|
||||
};
|
||||
|
||||
this.getDirection = function() {
|
||||
|
||||
// assumes the camera itself is not rotated
|
||||
|
||||
var direction = new THREE.Vector3( 0, 0, -1 );
|
||||
var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );
|
||||
|
||||
return function( v ) {
|
||||
|
||||
rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );
|
||||
|
||||
v.copy( direction ).applyEuler( rotation );
|
||||
|
||||
return v;
|
||||
|
||||
}
|
||||
|
||||
}();
|
||||
|
||||
};
|
835
js/three/three.min.js
vendored
Normal file
835
js/three/three.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
19
multisphere/index.html
Normal file
19
multisphere/index.html
Normal file
@ -0,0 +1,19 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>The begining</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Here is stuff</h1>
|
||||
<div id="container"></div>
|
||||
<script src="/js/three/three.min.js"></script>
|
||||
<script src="/js/three/OBJLoader.js"></script>
|
||||
<script src="/js/three/OrbitControls.js"></script>
|
||||
<script src="/js/three/PointerLockControls.js"></script>
|
||||
<script src="/js/Cube.js"></script>
|
||||
<script src="/js/BouncingCube.js"></script>
|
||||
<script src="/js/Camera.js"></script>
|
||||
<script src="js/MultiSphere.js"></script>
|
||||
</body>
|
||||
</html>
|
116
multisphere/js/MultiSphere.js
Normal file
116
multisphere/js/MultiSphere.js
Normal file
@ -0,0 +1,116 @@
|
||||
var mesh_number = 25;
|
||||
var renderer, scene, camera, controls, cube, container, plane, mouse= {x:0, y:0};
|
||||
var raycaster;
|
||||
var objects = [];
|
||||
var spheres = new Array(mesh_number);
|
||||
var visible = 0;
|
||||
|
||||
var loader;
|
||||
|
||||
var container_size = new Object();
|
||||
container_size.width = 1067;
|
||||
container_size.height = 600;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init() {
|
||||
// on initialise le moteur de rendu
|
||||
container = document.getElementById('container');
|
||||
container.style.height = container_size.height + 'px';
|
||||
container.style.width = container_size.width + 'px';
|
||||
renderer = new THREE.WebGLRenderer({alpha:"true"});
|
||||
renderer.setSize(container_size.width, container_size.height);
|
||||
renderer.shadowMapEnabled = true;
|
||||
document.getElementById('container').appendChild(renderer.domElement);
|
||||
|
||||
// on initialise la scène
|
||||
scene = new THREE.Scene();
|
||||
raycaster = new THREE.Raycaster();
|
||||
|
||||
// init light
|
||||
var directional_light = new THREE.DirectionalLight(0xffffff);
|
||||
directional_light.position.set(1, 0.5, 1).normalize();
|
||||
directional_light.castShadow = true;
|
||||
scene.add(directional_light);
|
||||
|
||||
var ambient_light = new THREE.AmbientLight(0x444444);
|
||||
scene.add(ambient_light);
|
||||
|
||||
// on initialise la camera que l’on place ensuite sur la scène
|
||||
camera = new Camera(50, container_size.width / container_size.height, 1, 10000);
|
||||
scene.add(camera);
|
||||
|
||||
window.addEventListener('resize', onWindowResize, false);
|
||||
|
||||
container.addEventListener('mousedown', click, false);
|
||||
|
||||
// Création d'un objloader
|
||||
loader = new THREE.OBJLoader();
|
||||
|
||||
for (var i = 0; i < mesh_number; i++) {
|
||||
// Capture of i
|
||||
// I am pretty good
|
||||
(function(i) {
|
||||
loader.load('/data/spheres/' + (i+1) + '.obj', function (object) {
|
||||
object.traverse(function (child) {
|
||||
if (child instanceof THREE.Mesh ) {
|
||||
child.material.color.setHex(0xff0000);
|
||||
child.up = new THREE.Vector3(0,0,1);
|
||||
child.geometry.computeFaceNormals();
|
||||
child.geometry.computeVertexNormals();
|
||||
}
|
||||
});
|
||||
spheres[i] = object;
|
||||
scene.add(object);
|
||||
if (i != 0)
|
||||
hide(object);
|
||||
});
|
||||
})(i);
|
||||
}
|
||||
|
||||
|
||||
plane = new Plane(1000,1000);
|
||||
plane.translate(0,0,-100);
|
||||
plane.addToScene(scene);
|
||||
}
|
||||
|
||||
function animate() {
|
||||
// on appelle la fonction animate() récursivement à chaque frame
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
camera.update();
|
||||
camera.look();
|
||||
|
||||
renderer.render(scene, camera);
|
||||
}
|
||||
|
||||
function onWindowResize() {
|
||||
camera.aspect = container.offsetWidth / container.offsetHeight;
|
||||
camera.updateProjectionMatrix();
|
||||
|
||||
renderer.setSize(container.offsetWidth, container.offsetHeight);
|
||||
renderer.render(scene, camera);
|
||||
}
|
||||
|
||||
function click(event) {
|
||||
++visible;
|
||||
visible %= spheres.length;
|
||||
|
||||
console.log('Mesh ', visible + 1, ' out of ', spheres.length, ' : ', spheres[visible].children[0].geometry.attributes.position.array.length, ' vertices (with duplication...)');
|
||||
|
||||
// hide everything except visible
|
||||
for (var i in spheres)
|
||||
{
|
||||
hide(spheres[i]);
|
||||
}
|
||||
show(spheres[visible]);
|
||||
}
|
||||
|
||||
function hide(object) {
|
||||
object.traverse(function ( object ) { object.visible = false; } );
|
||||
}
|
||||
|
||||
function show(object) {
|
||||
object.traverse(function ( object ) { object.visible = true; } );
|
||||
}
|
26
scene/index.html
Normal file
26
scene/index.html
Normal file
@ -0,0 +1,26 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>The begining</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Here is stuff</h1>
|
||||
<div style="border-width:1px; border-style: solid;" id="container"></div>
|
||||
<script src="/js/three/three.min.js"></script>
|
||||
<script src="/js/three/MTLLoader.js"></script>
|
||||
<script src="/js/three/OBJLoader.js"></script>
|
||||
<script src="/js/three/OBJMTLLoader.js"></script>
|
||||
<script src="/js/three/OrbitControls.js"></script>
|
||||
<script src="/js/three/PointerLockControls.js"></script>
|
||||
<script src="/js/Cube.js"></script>
|
||||
<script src="/js/BouncingCube.js"></script>
|
||||
<script src="/js/Camera.js"></script>
|
||||
<script src="/js/PointerCamera.js"></script>
|
||||
<script src="/js/FixedCamera.js"></script>
|
||||
<script src="/js/CameraContainer.js"></script>
|
||||
<script src="/js/Tools.js"></script>
|
||||
|
||||
<script src="js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
49
scene/js/gen.py
Executable file
49
scene/js/gen.py
Executable file
@ -0,0 +1,49 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import random
|
||||
|
||||
N = 4;
|
||||
|
||||
def rand_vector():
|
||||
print('new THREE.Vector3(', end='')
|
||||
print(random.uniform(-500,500), end='')
|
||||
print(',', end='')
|
||||
print(random.uniform(-500,500), end='')
|
||||
print(',', end='')
|
||||
print(random.uniform(0,500), end='')
|
||||
print(')', end='')
|
||||
|
||||
def rand_color():
|
||||
chars = [ str(x) for x in range(10)] + [chr(x) for x in range(ord('a'), ord('f') + 1)]
|
||||
print('0x', end='')
|
||||
for i in range(6):
|
||||
print(chars[random.randint(0, len(chars)-1)],end='');
|
||||
|
||||
def gen_positions():
|
||||
print('var positions = [')
|
||||
for i in range(N):
|
||||
print(' ', end='')
|
||||
rand_vector()
|
||||
print(',')
|
||||
print(' ', end='')
|
||||
gen_vector()
|
||||
print('\n];')
|
||||
|
||||
def gen_colors():
|
||||
print('var colors = [')
|
||||
for i in range(N):
|
||||
print(' ', end='')
|
||||
rand_color()
|
||||
print(',')
|
||||
print(' ', end='')
|
||||
rand_color()
|
||||
print('\n];')
|
||||
|
||||
|
||||
def main():
|
||||
gen_colors()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
231
scene/js/main.js
Normal file
231
scene/js/main.js
Normal file
@ -0,0 +1,231 @@
|
||||
var mesh_number = 25;
|
||||
var renderer, scene, controls, cube, container, plane, mouse= {x:0, y:0};
|
||||
var bigmesh;
|
||||
var raycaster;
|
||||
var objects = [];
|
||||
var cameras = new CameraContainer();
|
||||
var spheres = new Array(mesh_number);
|
||||
var visible = 0;
|
||||
|
||||
var loader;
|
||||
|
||||
var container_size = new Object();
|
||||
container_size.width = 1067;
|
||||
container_size.height = 600;
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
function init() {
|
||||
// on initialise le moteur de rendu
|
||||
container = document.getElementById('container');
|
||||
container.style.height = container_size.height + 'px';
|
||||
container.style.width = container_size.width + 'px';
|
||||
renderer = new THREE.WebGLRenderer({alpha:"true"});
|
||||
renderer.setSize(container_size.width, container_size.height);
|
||||
renderer.shadowMapEnabled = true;
|
||||
// renderer.setClearColor(0x000000);
|
||||
document.getElementById('container').appendChild(renderer.domElement);
|
||||
|
||||
// on initialise la scène
|
||||
scene = new THREE.Scene();
|
||||
raycaster = new THREE.Raycaster();
|
||||
|
||||
// init light
|
||||
var directional_light = new THREE.DirectionalLight(0x999999);
|
||||
directional_light.position.set(1, 0.5, 1).normalize();
|
||||
directional_light.castShadow = true;
|
||||
scene.add(directional_light);
|
||||
|
||||
var ambient_light = new THREE.AmbientLight(0x333333);
|
||||
scene.add(ambient_light);
|
||||
|
||||
// on initialise la camera que l’on place ensuite sur la scène
|
||||
var camera1 = new PointerCamera(50, container_size.width / container_size.height, 1, 100000);
|
||||
|
||||
var camera2 = new FixedCamera(50,
|
||||
container_size.width / container_size.height,
|
||||
1, 100000,
|
||||
new THREE.Vector3(707,-247,603),
|
||||
new THREE.Vector3(683,-269,580)
|
||||
);
|
||||
|
||||
var camera3 = new FixedCamera(50,
|
||||
container_size.width / container_size.height,
|
||||
1, 100000,
|
||||
new THREE.Vector3(727,165,310),
|
||||
new THREE.Vector3(693,173,291)
|
||||
);
|
||||
|
||||
var camera4 = new FixedCamera(50,
|
||||
container_size.width / container_size.height,
|
||||
1, 100000,
|
||||
new THREE.Vector3(-67,-105,306),
|
||||
new THREE.Vector3(-103,-120,314)
|
||||
);
|
||||
|
||||
scene.add(camera1);
|
||||
cameras.push(camera1);
|
||||
cameras.push(camera2);
|
||||
cameras.push(camera3);
|
||||
cameras.push(camera4);
|
||||
|
||||
camera2.addToScene(scene);
|
||||
camera3.addToScene(scene);
|
||||
camera4.addToScene(scene);
|
||||
|
||||
// var camera3 = new FixedCamera(
|
||||
// 50,
|
||||
// container_size.width / container_size.height,
|
||||
// 1,
|
||||
// 100000,
|
||||
// new THREE.Vector3(500,0,500),
|
||||
// new THREE.Vector3(0,0,0)
|
||||
// );
|
||||
|
||||
// camera3.addToScene(scene);
|
||||
// cameras.push(camera3);
|
||||
|
||||
window.addEventListener('resize', onWindowResize, false);
|
||||
|
||||
container.addEventListener('mousedown', click, false);
|
||||
|
||||
// Load the scene
|
||||
loadScene();
|
||||
|
||||
plane = new Plane(1000,1000);
|
||||
plane.translate(0,0,-100);
|
||||
plane.addToScene(scene);
|
||||
|
||||
}
|
||||
|
||||
function loadScene() {
|
||||
var positions = [
|
||||
new THREE.Vector3(139.4026786273838,135.5184946130355,398.44068539970607),
|
||||
new THREE.Vector3(-435.43466612542625,-213.42817928744614,357.9683852860272),
|
||||
new THREE.Vector3(331.55730402813379,-554.75051838788778,327.9545043861335),
|
||||
new THREE.Vector3(337.83563114154583,494.02776032947725,91.40149126173162),
|
||||
new THREE.Vector3(-483.7218395537484,26.07460345877575,16.1503626453437)
|
||||
];
|
||||
|
||||
var colors = [
|
||||
0x5bf9ef,
|
||||
0xec5e15,
|
||||
0xcac518,
|
||||
0x39c8d6,
|
||||
0x04da72
|
||||
];
|
||||
|
||||
var seen_by = [
|
||||
[],
|
||||
[3],
|
||||
[1],
|
||||
[2],
|
||||
[2]
|
||||
];
|
||||
|
||||
var mesh_number = positions.length;
|
||||
|
||||
loader = new THREE.OBJLoader();
|
||||
for (var i = 0; i < mesh_number; i++) {
|
||||
// Capture of i
|
||||
// I am pretty good
|
||||
(function(i) {
|
||||
var new_id;
|
||||
loader.load('/data/spheres/' + (i+1) + '.obj', function (object) {
|
||||
object.traverse(function (child) {
|
||||
if (child instanceof THREE.Mesh ) {
|
||||
child.material.color.setHex(colors[i]);
|
||||
child.up = new THREE.Vector3(0,0,1);
|
||||
child.geometry.computeVertexNormals();
|
||||
child.translateX(positions[i].x);
|
||||
child.translateY(positions[i].y);
|
||||
child.translateZ(positions[i].z);
|
||||
new_id = child.id;
|
||||
}
|
||||
});
|
||||
spheres[i] = object;
|
||||
scene.add(object);
|
||||
objects.push({obj: object, seen_by: seen_by[i], id: new_id});
|
||||
});
|
||||
})(i);
|
||||
}
|
||||
}
|
||||
|
||||
function animate() {
|
||||
// on appelle la fonction animate() récursivement à chaque frame
|
||||
requestAnimationFrame(animate);
|
||||
|
||||
cameras.update();
|
||||
cameras.look();
|
||||
|
||||
renderer.render(scene, cameras.mainCamera());
|
||||
}
|
||||
|
||||
function onWindowResize() {
|
||||
cameras.forEach(function(camera) {camera.aspect = container.offsetWidth / container.offsetHeight;});
|
||||
cameras.forEach(function(camera) {camera.updateProjectionMatrix();});
|
||||
|
||||
renderer.setSize(container.offsetWidth, container.offsetHeight);
|
||||
renderer.render(scene, cameras.mainCamera());
|
||||
}
|
||||
|
||||
function hide(object) {
|
||||
object.traverse(function(object) {object.visible = false;});
|
||||
}
|
||||
|
||||
function show(object) {
|
||||
object.traverse(function(object) {object.visible = true;});
|
||||
}
|
||||
|
||||
function click(event) {
|
||||
if (cameras.mainCamera() == cameras.get(0)) {
|
||||
var mouse = Object();
|
||||
mouse.x = ( ( event.clientX - renderer.domElement.offsetLeft ) / renderer.domElement.width ) * 2 - 1;
|
||||
mouse.y = - ( ( event.clientY - renderer.domElement.offsetTop ) / renderer.domElement.height ) * 2 + 1;
|
||||
|
||||
var camera = cameras.mainCamera();
|
||||
var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
|
||||
vector.unproject(camera);
|
||||
|
||||
raycaster.set(camera.position, vector.sub(camera.position).normalize());
|
||||
|
||||
var intersects = raycaster.intersectObjects(scene.children, true);
|
||||
|
||||
if ( intersects.length > 0 ) {
|
||||
var minDistance;
|
||||
var bestIndex;
|
||||
|
||||
// Looking for cameras
|
||||
for (i in intersects) {
|
||||
if (typeof minDistance == 'undefined' || intersects[i].distance < minDistance) {
|
||||
// We will not consider a line as clickable
|
||||
if (! (intersects[i].object instanceof THREE.Line)) {
|
||||
minDistance = intersects[i].distance;
|
||||
bestIndex = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof bestIndex!= 'undefined') {
|
||||
console.log(intersects[bestIndex]);
|
||||
cameras.setById(intersects[bestIndex].object.id);
|
||||
}
|
||||
|
||||
// Looking for objects
|
||||
for (o in objects) {
|
||||
if ( intersects[bestIndex].object.id == objects[o].id) {
|
||||
cameras.mainCamera(objects[o].seen_by[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cameras.mainCamera(0);
|
||||
}
|
||||
|
||||
// var pos = cameras.mainCamera().position;
|
||||
// var target = cameras.mainCamera().target
|
||||
// console.log("Position = ", pos.x, pos.y, pos.z);
|
||||
// console.log("Target = ", target.x, target.y, target.z);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user