Raycaster.tests.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. * @author simonThiele / https://github.com/simonThiele
  3. */
  4. /* global QUnit */
  5. import { Raycaster } from '../../../../src/core/Raycaster';
  6. import { Vector3 } from '../../../../src/math/Vector3';
  7. import { Mesh } from '../../../../src/objects/Mesh';
  8. import { SphereGeometry } from '../../../../src/geometries/SphereGeometry';
  9. import { PerspectiveCamera } from '../../../../src/cameras/PerspectiveCamera';
  10. import { OrthographicCamera } from '../../../../src/cameras/OrthographicCamera';
  11. function checkRayDirectionAgainstReferenceVector( rayDirection, refVector, assert ) {
  12. assert.ok( refVector.x - rayDirection.x <= Number.EPSILON && refVector.y - rayDirection.y <= Number.EPSILON && refVector.z - rayDirection.z <= Number.EPSILON, "camera is pointing to" +
  13. " the same direction as expected" );
  14. }
  15. function getRaycaster() {
  16. return new Raycaster(
  17. new Vector3( 0, 0, 0 ),
  18. new Vector3( 0, 0, - 1 ),
  19. 1,
  20. 100
  21. );
  22. }
  23. function getObjectsToCheck() {
  24. var objects = [];
  25. var sphere1 = getSphere();
  26. sphere1.position.set( 0, 0, - 10 );
  27. sphere1.name = 1;
  28. objects.push( sphere1 );
  29. var sphere11 = getSphere();
  30. sphere11.position.set( 0, 0, 1 );
  31. sphere11.name = 11;
  32. sphere1.add( sphere11 );
  33. var sphere12 = getSphere();
  34. sphere12.position.set( 0, 0, - 1 );
  35. sphere12.name = 12;
  36. sphere1.add( sphere12 );
  37. var sphere2 = getSphere();
  38. sphere2.position.set( - 5, 0, - 5 );
  39. sphere2.name = 2;
  40. objects.push( sphere2 );
  41. for ( var i = 0; i < objects.length; i ++ ) {
  42. objects[ i ].updateMatrixWorld();
  43. }
  44. return objects;
  45. }
  46. function getSphere() {
  47. return new Mesh( new SphereGeometry( 1, 100, 100 ) );
  48. }
  49. export default QUnit.module( 'Core', () => {
  50. QUnit.module( 'Raycaster', () => {
  51. // INSTANCING
  52. QUnit.todo( "Instancing", ( assert ) => {
  53. assert.ok( false, "everything's gonna be alright" );
  54. } );
  55. // PUBLIC STUFF
  56. QUnit.todo( "linePrecision", ( assert ) => {
  57. assert.ok( false, "everything's gonna be alright" );
  58. } );
  59. QUnit.test( "set", ( assert ) => {
  60. var origin = new Vector3( 0, 0, 0 );
  61. var direction = new Vector3( 0, 0, - 1 );
  62. var a = new Raycaster( origin.clone(), direction.clone() );
  63. assert.deepEqual( a.ray.origin, origin, "Origin is correct" );
  64. assert.deepEqual( a.ray.direction, direction, "Direction is correct" );
  65. origin.set( 1, 1, 1 );
  66. direction.set( - 1, 0, 0 );
  67. a.set( origin, direction );
  68. assert.deepEqual( a.ray.origin, origin, "Origin was set correctly" );
  69. assert.deepEqual( a.ray.direction, direction, "Direction was set correctly" );
  70. } );
  71. QUnit.test( "setFromCamera (Perspective)", ( assert ) => {
  72. var raycaster = new Raycaster();
  73. var rayDirection = raycaster.ray.direction;
  74. var camera = new PerspectiveCamera( 90, 1, 1, 1000 );
  75. raycaster.setFromCamera( {
  76. x: 0,
  77. y: 0
  78. }, camera );
  79. assert.ok( rayDirection.x === 0 && rayDirection.y === 0 && rayDirection.z === - 1,
  80. "camera is looking straight to -z and so does the ray in the middle of the screen" );
  81. var step = 0.1;
  82. for ( var x = - 1; x <= 1; x += step ) {
  83. for ( var y = - 1; y <= 1; y += step ) {
  84. raycaster.setFromCamera( {
  85. x,
  86. y
  87. }, camera );
  88. var refVector = new Vector3( x, y, - 1 ).normalize();
  89. checkRayDirectionAgainstReferenceVector( rayDirection, refVector, assert );
  90. }
  91. }
  92. } );
  93. QUnit.test( "setFromCamera (Orthographic)", ( assert ) => {
  94. var raycaster = new Raycaster();
  95. var rayOrigin = raycaster.ray.origin;
  96. var rayDirection = raycaster.ray.direction;
  97. var camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1000 );
  98. var expectedOrigin = new Vector3( 0, 0, 0 );
  99. var expectedDirection = new Vector3( 0, 0, - 1 );
  100. raycaster.setFromCamera( {
  101. x: 0,
  102. y: 0
  103. }, camera );
  104. assert.deepEqual( rayOrigin, expectedOrigin, "Ray origin has the right coordinates" );
  105. assert.deepEqual( rayDirection, expectedDirection, "Camera and Ray are pointing towards -z" );
  106. } );
  107. QUnit.test( "intersectObject", ( assert ) => {
  108. var raycaster = getRaycaster();
  109. var objectsToCheck = getObjectsToCheck();
  110. assert.ok( raycaster.intersectObject( objectsToCheck[ 0 ] ).length === 1,
  111. "no recursive search should lead to one hit" );
  112. assert.ok( raycaster.intersectObject( objectsToCheck[ 0 ], true ).length === 3,
  113. "recursive search should lead to three hits" );
  114. var intersections = raycaster.intersectObject( objectsToCheck[ 0 ], true );
  115. for ( var i = 0; i < intersections.length - 1; i ++ ) {
  116. assert.ok( intersections[ i ].distance <= intersections[ i + 1 ].distance, "intersections are sorted" );
  117. }
  118. } );
  119. QUnit.test( "intersectObjects", ( assert ) => {
  120. var raycaster = getRaycaster();
  121. var objectsToCheck = getObjectsToCheck();
  122. assert.ok( raycaster.intersectObjects( objectsToCheck ).length === 1,
  123. "no recursive search should lead to one hit" );
  124. assert.ok( raycaster.intersectObjects( objectsToCheck, true ).length === 3,
  125. "recursive search should lead to three hits" );
  126. var intersections = raycaster.intersectObjects( objectsToCheck, true );
  127. for ( var i = 0; i < intersections.length - 1; i ++ ) {
  128. assert.ok( intersections[ i ].distance <= intersections[ i + 1 ].distance, "intersections are sorted" );
  129. }
  130. } );
  131. } );
  132. } );
粤ICP备19079148号