|
@@ -0,0 +1,105 @@
|
|
|
+/**
|
|
|
+ * @author simonThiele / https://github.com/simonThiele
|
|
|
+ */
|
|
|
+
|
|
|
+module( "Raycaster" );
|
|
|
+
|
|
|
+test( "intersectObjects", function() {
|
|
|
+ var raycaster = getRaycaster();
|
|
|
+ var objectsToCheck = getObjectsToCheck();
|
|
|
+
|
|
|
+ ok ( raycaster.intersectObjects(objectsToCheck).length === 1,
|
|
|
+ "no recursive search should lead to one hit" );
|
|
|
+
|
|
|
+ ok ( raycaster.intersectObjects(objectsToCheck, true).length === 3,
|
|
|
+ "recursive search should lead to two hits" );
|
|
|
+
|
|
|
+ var intersections = raycaster.intersectObjects(objectsToCheck, true);
|
|
|
+ for (var i = 0; i < intersections.length - 1; i++) {
|
|
|
+ ok( intersections[i].distance <= intersections[i + 1].distance, "intersections are sorted" );
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+test( "intersectObject", function() {
|
|
|
+ var raycaster = getRaycaster();
|
|
|
+ var objectsToCheck = getObjectsToCheck();
|
|
|
+
|
|
|
+ ok ( raycaster.intersectObject(objectsToCheck[0]).length === 1,
|
|
|
+ "no recursive search should lead to one hit" );
|
|
|
+
|
|
|
+ ok ( raycaster.intersectObject(objectsToCheck[0], true).length === 3,
|
|
|
+ "recursive search should lead to two hits" );
|
|
|
+
|
|
|
+ var intersections = raycaster.intersectObject(objectsToCheck[0], true);
|
|
|
+ for (var i = 0; i < intersections.length - 1; i++) {
|
|
|
+ ok( intersections[i].distance <= intersections[i + 1].distance, "intersections are sorted" );
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+test( "setFromCamera", function() {
|
|
|
+ var raycaster = new THREE.Raycaster();
|
|
|
+ var rayDirection = raycaster.ray.direction;
|
|
|
+ var camera = new THREE.PerspectiveCamera( 90, 1, 1, 1000 );
|
|
|
+
|
|
|
+ raycaster.setFromCamera( { x : 0, y: 0 }, camera );
|
|
|
+ ok( rayDirection.x === 0, rayDirection.y === 0, rayDirection.z === -1,
|
|
|
+ "camera is looking straight to -z and so does the ray in the middle of the screen" );
|
|
|
+
|
|
|
+ var step = 0.1;
|
|
|
+ for (var x = -1; x <= 1; x+=step) {
|
|
|
+ for (var y = -1; y <= 1; y+=step) {
|
|
|
+ raycaster.setFromCamera( { x, y }, camera );
|
|
|
+ var refVector = new THREE.Vector3(x, y, -1).normalize();
|
|
|
+ checkRayDirectionAgainstReferenceVector(rayDirection, refVector);
|
|
|
+ }
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+function checkRayDirectionAgainstReferenceVector(rayDirection, refVector) {
|
|
|
+ ok( refVector.x - rayDirection.x <= Number.EPSILON &&
|
|
|
+ refVector.y - rayDirection.y <= Number.EPSILON &&
|
|
|
+ refVector.z - rayDirection.z <= Number.EPSILON,
|
|
|
+ "camera is pointing to the same direction as expected" );
|
|
|
+}
|
|
|
+
|
|
|
+function getRaycaster() {
|
|
|
+ return raycaster = new THREE.Raycaster(
|
|
|
+ new THREE.Vector3( 0, 0, 0 ),
|
|
|
+ new THREE.Vector3( 0, 0, -1 ),
|
|
|
+ 1,
|
|
|
+ 100
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+function getObjectsToCheck() {
|
|
|
+ var objects = [];
|
|
|
+
|
|
|
+ var sphere1 = getSphere();
|
|
|
+ sphere1.position.set(0, 0, -10);
|
|
|
+ sphere1.name = 1;
|
|
|
+ objects.push(sphere1);
|
|
|
+
|
|
|
+ var sphere11 = getSphere();
|
|
|
+ sphere11.position.set(0, 0, 1);
|
|
|
+ sphere11.name = 11;
|
|
|
+ sphere1.add(sphere11);
|
|
|
+
|
|
|
+ var sphere12 = getSphere();
|
|
|
+ sphere12.position.set(0, 0, -1);
|
|
|
+ sphere12.name = 12;
|
|
|
+ sphere1.add(sphere12);
|
|
|
+
|
|
|
+ var sphere2 = getSphere();
|
|
|
+ sphere2.position.set(-5, 0, -5);
|
|
|
+ sphere2.name = 2;
|
|
|
+ objects.push(sphere2);
|
|
|
+
|
|
|
+ for (var i = 0; i < objects.length; i++) {
|
|
|
+ objects[i].updateMatrixWorld();
|
|
|
+ }
|
|
|
+ return objects;
|
|
|
+}
|
|
|
+
|
|
|
+function getSphere() {
|
|
|
+ return new THREE.Mesh(new THREE.SphereGeometry(1, 100, 100));
|
|
|
+}
|