Raycaster.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /**
  2. * @author simonThiele / https://github.com/simonThiele
  3. */
  4. module( "Raycaster" );
  5. test( "intersectObjects", function() {
  6. var raycaster = getRaycaster();
  7. var objectsToCheck = getObjectsToCheck();
  8. ok ( raycaster.intersectObjects( objectsToCheck ).length === 1,
  9. "no recursive search should lead to one hit" );
  10. ok ( raycaster.intersectObjects( objectsToCheck, true ).length === 3,
  11. "recursive search should lead to three hits" );
  12. var intersections = raycaster.intersectObjects( objectsToCheck, true );
  13. for ( var i = 0; i < intersections.length - 1; i++ ) {
  14. ok( intersections[ i ].distance <= intersections[ i + 1 ].distance, "intersections are sorted" );
  15. }
  16. });
  17. test( "intersectObject", function() {
  18. var raycaster = getRaycaster();
  19. var objectsToCheck = getObjectsToCheck();
  20. ok ( raycaster.intersectObject( objectsToCheck[ 0 ] ).length === 1,
  21. "no recursive search should lead to one hit" );
  22. ok ( raycaster.intersectObject( objectsToCheck[ 0 ], true ).length === 3,
  23. "recursive search should lead to three hits" );
  24. var intersections = raycaster.intersectObject( objectsToCheck[ 0 ], true );
  25. for ( var i = 0; i < intersections.length - 1; i++ ) {
  26. ok( intersections[ i ].distance <= intersections[ i + 1 ].distance, "intersections are sorted" );
  27. }
  28. });
  29. test( "setFromCamera", function() {
  30. var raycaster = new THREE.Raycaster();
  31. var rayDirection = raycaster.ray.direction;
  32. var camera = new THREE.PerspectiveCamera( 90, 1, 1, 1000 );
  33. raycaster.setFromCamera( { x : 0, y: 0 }, camera );
  34. ok( rayDirection.x === 0, rayDirection.y === 0, rayDirection.z === -1,
  35. "camera is looking straight to -z and so does the ray in the middle of the screen" );
  36. var step = 0.1;
  37. for ( var x = -1; x <= 1; x += step ) {
  38. for ( var y = -1; y <= 1; y += step ) {
  39. raycaster.setFromCamera( { x, y }, camera );
  40. var refVector = new THREE.Vector3( x, y, -1 ).normalize();
  41. checkRayDirectionAgainstReferenceVector( rayDirection, refVector );
  42. }
  43. }
  44. });
  45. function checkRayDirectionAgainstReferenceVector( rayDirection, refVector ) {
  46. ok( refVector.x - rayDirection.x <= Number.EPSILON &&
  47. refVector.y - rayDirection.y <= Number.EPSILON &&
  48. refVector.z - rayDirection.z <= Number.EPSILON,
  49. "camera is pointing to the same direction as expected" );
  50. }
  51. function getRaycaster() {
  52. return raycaster = new THREE.Raycaster(
  53. new THREE.Vector3( 0, 0, 0 ),
  54. new THREE.Vector3( 0, 0, -1 ),
  55. 1,
  56. 100
  57. );
  58. }
  59. function getObjectsToCheck() {
  60. var objects = [];
  61. var sphere1 = getSphere();
  62. sphere1.position.set( 0, 0, -10 );
  63. sphere1.name = 1;
  64. objects.push( sphere1 );
  65. var sphere11 = getSphere();
  66. sphere11.position.set( 0, 0, 1 );
  67. sphere11.name = 11;
  68. sphere1.add( sphere11 );
  69. var sphere12 = getSphere();
  70. sphere12.position.set( 0, 0, -1 );
  71. sphere12.name = 12;
  72. sphere1.add( sphere12 );
  73. var sphere2 = getSphere();
  74. sphere2.position.set( -5, 0, -5 );
  75. sphere2.name = 2;
  76. objects.push( sphere2 );
  77. for ( var i = 0; i < objects.length; i++ ) {
  78. objects[ i ].updateMatrixWorld();
  79. }
  80. return objects;
  81. }
  82. function getSphere() {
  83. return new THREE.Mesh( new THREE.SphereGeometry( 1, 100, 100 ) );
  84. }