|
@@ -41,10 +41,11 @@ body {
|
|
|
|
|
|
<script type="text/javascript" src="../build/Three.js"></script>
|
|
|
<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
|
|
|
+<script type="text/javascript" src="js/Stats.js"></script>
|
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
|
-var scene, camera, renderer, info, mouse2d, sun, loader;
|
|
|
+var scene, camera, renderer, info, mouse2d, sun, loader, stats;
|
|
|
var meshes = [];
|
|
|
|
|
|
var theta = 0;
|
|
@@ -53,7 +54,12 @@ var camdist = 1500;
|
|
|
var totalFaces = 0;
|
|
|
var totalColliders = 0;
|
|
|
|
|
|
+var ray = new THREE.Ray();
|
|
|
+var matrix = new THREE.Matrix4(),
|
|
|
+ matrix2 = new THREE.Matrix4();
|
|
|
+
|
|
|
function init() {
|
|
|
+
|
|
|
container = document.createElement( 'div' );
|
|
|
document.body.appendChild( container );
|
|
|
|
|
@@ -69,7 +75,7 @@ function init() {
|
|
|
|
|
|
renderer = new THREE.WebGLRenderer();
|
|
|
renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
- container.appendChild(renderer.domElement);
|
|
|
+ container.appendChild( renderer.domElement );
|
|
|
|
|
|
var ambientLight = new THREE.AmbientLight( 0x606060 );
|
|
|
scene.addLight( ambientLight );
|
|
@@ -80,12 +86,20 @@ function init() {
|
|
|
|
|
|
loadCube();
|
|
|
|
|
|
+ stats = new Stats();
|
|
|
+ stats.domElement.style.position = 'absolute';
|
|
|
+ stats.domElement.style.top = '0px';
|
|
|
+ container.appendChild( stats.domElement );
|
|
|
+
|
|
|
container.onmousemove = onDocumentMouseMove;
|
|
|
animate();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function loadCube(p) {
|
|
|
- var onGeometry = function( geometry ) {
|
|
|
+
|
|
|
+ var onGeometry = function( geometry ) {
|
|
|
+
|
|
|
var sx = 300;
|
|
|
var sy = 240;
|
|
|
var sz = 300;
|
|
@@ -138,7 +152,7 @@ function loadCube(p) {
|
|
|
addCube( new THREE.Vector3( 0, -sy, -sz*2), geometry );
|
|
|
addCube( new THREE.Vector3( sx,-sy, -sz*2), geometry );
|
|
|
|
|
|
- info.innerHTML = "Total colliders: " + totalColliders + " (Faces: " + totalFaces + ")<br>";
|
|
|
+ //info.innerHTML = "Total colliders: " + totalColliders + " (Faces: " + totalFaces + ")<br>";
|
|
|
|
|
|
};
|
|
|
|
|
@@ -146,9 +160,11 @@ function loadCube(p) {
|
|
|
loader.load( { model: "obj/suzanne/suzanneHi.js", callback: onGeometry } );
|
|
|
}
|
|
|
|
|
|
-function addCube(p, g){
|
|
|
+function addCube( p, g) {
|
|
|
+
|
|
|
totalFaces += g.faces.length;
|
|
|
totalColliders++;
|
|
|
+
|
|
|
var mesh = new THREE.Mesh( g, new THREE.MeshLambertMaterial( { color: 0x003300 } ) );
|
|
|
mesh.position = p;
|
|
|
|
|
@@ -163,57 +179,78 @@ function addCube(p, g){
|
|
|
scene.addObject( mesh );
|
|
|
var mc = THREE.CollisionUtils.MeshColliderWBox(mesh);
|
|
|
THREE.Collisions.colliders.push( mc );
|
|
|
- meshes.push(mesh);
|
|
|
-}
|
|
|
+ meshes.push( mesh );
|
|
|
+
|
|
|
+};
|
|
|
|
|
|
function onDocumentMouseMove( event ) {
|
|
|
+
|
|
|
event.preventDefault();
|
|
|
mouse2d.x = ( event.clientX / window.innerWidth ) * 2 - 1;
|
|
|
mouse2d.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
|
|
|
mouse2d.z = 1;
|
|
|
-}
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
|
|
|
function animate() {
|
|
|
+
|
|
|
requestAnimationFrame( animate );
|
|
|
|
|
|
- var r = new THREE.Ray();
|
|
|
- r.origin = mouse2d.clone();
|
|
|
- var matrix = camera.matrixWorld.clone();
|
|
|
- matrix.multiplySelf( THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
|
|
|
- matrix.multiplyVector3( r.origin );
|
|
|
- r.direction = r.origin.clone().subSelf(camera.position);
|
|
|
+ ray.origin.copy( mouse2d );
|
|
|
+
|
|
|
+ matrix.copy( camera.matrixWorld );
|
|
|
+ matrix.multiplySelf( THREE.Matrix4.makeInvert( camera.projectionMatrix, matrix2 ) );
|
|
|
+ matrix.multiplyVector3( ray.origin );
|
|
|
+
|
|
|
+ ray.direction.copy( ray.origin );
|
|
|
+ ray.direction.subSelf( camera.position );
|
|
|
|
|
|
- if(meshes.length == 0) return;
|
|
|
+ if( meshes.length == 0 ) return;
|
|
|
|
|
|
- for (var i = 0; i < meshes.length; i++) {
|
|
|
- meshes[i].materials[0].color = new THREE.Color(0x003300);
|
|
|
- }
|
|
|
+ var i, l = meshes.length;
|
|
|
|
|
|
- info.innerHTML = "";
|
|
|
+ for ( i = 0; i < l; i++ ) {
|
|
|
|
|
|
- var c = THREE.Collisions.rayCastNearest(r);
|
|
|
+ meshes[ i ].materials[ 0 ].color.setHex( 0x003300 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var c = THREE.Collisions.rayCastNearest( ray );
|
|
|
+
|
|
|
+ if( c ) {
|
|
|
|
|
|
- if(c) {
|
|
|
//info.innerHTML += "Found @ distance " + c.distance;
|
|
|
- c.mesh.materials[0].color = new THREE.Color(0xbb0000);
|
|
|
+ c.mesh.materials[ 0 ].color.setHex( 0xbb0000 );
|
|
|
+
|
|
|
} else {
|
|
|
+
|
|
|
//info.innerHTML += "No intersection";
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- camera.position.x = camdist * Math.cos(theta);
|
|
|
- camera.position.z = camdist * Math.sin(theta);
|
|
|
- camera.position.y = camdist/2 * Math.sin(theta * 2);
|
|
|
- sun.position = camera.position.clone();
|
|
|
+ camera.position.x = camdist * Math.cos( theta );
|
|
|
+ camera.position.z = camdist * Math.sin( theta );
|
|
|
+ camera.position.y = camdist/2 * Math.sin( theta * 2) ;
|
|
|
+
|
|
|
+ sun.position.copy( camera.position );
|
|
|
sun.position.normalize();
|
|
|
+
|
|
|
theta += 0.005;
|
|
|
|
|
|
renderer.render( scene, camera );
|
|
|
-}
|
|
|
+
|
|
|
+ stats.update();
|
|
|
+
|
|
|
+};
|
|
|
|
|
|
function vts(v) {
|
|
|
+
|
|
|
if(!v) return "undefined<br>";
|
|
|
else return v.x + " , " + v.y + " , " + v.z + "<br>";
|
|
|
-}
|
|
|
+
|
|
|
+};
|
|
|
|
|
|
</script>
|
|
|
|