LOD.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /**
  2. * @author mikael emtinger / http://gomo.se/
  3. * @author alteredq / http://alteredqualia.com/
  4. * @author mrdoob / http://mrdoob.com/
  5. */
  6. THREE.LOD = function () {
  7. THREE.Object3D.call( this );
  8. this.type = 'LOD';
  9. Object.defineProperties( this, {
  10. levels: {
  11. enumerable: true,
  12. value: []
  13. },
  14. objects: {
  15. get: function () {
  16. console.warn( 'THREE.LOD: .objects has been renamed to .levels.' );
  17. return this.levels;
  18. }
  19. }
  20. } );
  21. };
  22. THREE.LOD.prototype = Object.create( THREE.Object3D.prototype );
  23. THREE.LOD.prototype.constructor = THREE.LOD;
  24. THREE.LOD.prototype.addLevel = function ( object, distance ) {
  25. if ( distance === undefined ) distance = 0;
  26. distance = Math.abs( distance );
  27. var levels = this.levels;
  28. for ( var l = 0; l < levels.length; l ++ ) {
  29. if ( distance < levels[ l ].distance ) {
  30. break;
  31. }
  32. }
  33. levels.splice( l, 0, { distance: distance, object: object } );
  34. this.add( object );
  35. };
  36. THREE.LOD.prototype.getObjectForDistance = function ( distance ) {
  37. var levels = this.levels;
  38. for ( var i = 1, l = levels.length; i < l; i ++ ) {
  39. if ( distance < levels[ i ].distance ) {
  40. break;
  41. }
  42. }
  43. return levels[ i - 1 ].object;
  44. };
  45. THREE.LOD.prototype.raycast = ( function () {
  46. var matrixPosition = new THREE.Vector3();
  47. return function raycast( raycaster, intersects ) {
  48. matrixPosition.setFromMatrixPosition( this.matrixWorld );
  49. var distance = raycaster.ray.origin.distanceTo( matrixPosition );
  50. this.getObjectForDistance( distance ).raycast( raycaster, intersects );
  51. };
  52. }() );
  53. THREE.LOD.prototype.update = function () {
  54. var v1 = new THREE.Vector3();
  55. var v2 = new THREE.Vector3();
  56. return function update( camera ) {
  57. var levels = this.levels;
  58. if ( levels.length > 1 ) {
  59. v1.setFromMatrixPosition( camera.matrixWorld );
  60. v2.setFromMatrixPosition( this.matrixWorld );
  61. var distance = v1.distanceTo( v2 );
  62. levels[ 0 ].object.visible = true;
  63. for ( var i = 1, l = levels.length; i < l; i ++ ) {
  64. if ( distance >= levels[ i ].distance ) {
  65. levels[ i - 1 ].object.visible = false;
  66. levels[ i ].object.visible = true;
  67. } else {
  68. break;
  69. }
  70. }
  71. for ( ; i < l; i ++ ) {
  72. levels[ i ].object.visible = false;
  73. }
  74. }
  75. };
  76. }();
  77. THREE.LOD.prototype.copy = function ( source ) {
  78. THREE.Object3D.prototype.copy.call( this, source, false );
  79. var levels = source.levels;
  80. for ( var i = 0, l = levels.length; i < l; i ++ ) {
  81. var level = levels[ i ];
  82. this.addLevel( level.object.clone(), level.distance );
  83. }
  84. return this;
  85. };
  86. THREE.LOD.prototype.toJSON = function ( meta ) {
  87. var data = THREE.Object3D.prototype.toJSON.call( this, meta );
  88. data.object.levels = [];
  89. var levels = this.levels;
  90. for ( var i = 0, l = levels.length; i < l; i ++ ) {
  91. var level = levels[ i ];
  92. data.object.levels.push( {
  93. object: level.object.uuid,
  94. distance: level.distance
  95. } );
  96. }
  97. return data;
  98. };
粤ICP备19079148号