Projector.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /**
  2. * @author mr.doob / http://mrdoob.com/
  3. * @author supereggbert / http://www.paulbrunt.co.uk/
  4. */
  5. THREE.Projector = function() {
  6. var _renderList = null,
  7. _face3, _face3Count, _face3Pool = [],
  8. _face4, _face4Count, _face4Pool = [],
  9. _line, _lineCount, _linePool = [],
  10. _particle, _particleCount, _particlePool = [],
  11. _vector4 = new THREE.Vector4(),
  12. _projScreenMatrix = new THREE.Matrix4(),
  13. _projScreenObjectMatrix = new THREE.Matrix4();
  14. this.projectScene = function ( scene, camera ) {
  15. var o, ol, v, vl, f, fl, objects, object, objectMatrix,
  16. vertices, vertex, vertexPositionScreen, vertex2,
  17. faces, face, v1, v2, v3, v4;
  18. _renderList = [];
  19. _face3Count = 0, _face4Count = 0, _lineCount = 0, _particleCount = 0;
  20. if( camera.autoUpdateMatrix ) {
  21. camera.updateMatrix();
  22. }
  23. _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
  24. objects = scene.objects;
  25. for ( o = 0, ol = objects.length; o < ol; o++ ) {
  26. object = objects[ o ];
  27. objectMatrix = object.matrix;
  28. if( object.autoUpdateMatrix ) {
  29. object.updateMatrix();
  30. }
  31. if ( object instanceof THREE.Mesh ) {
  32. _projScreenObjectMatrix.multiply( _projScreenMatrix, objectMatrix );
  33. // vertices
  34. vertices = object.geometry.vertices;
  35. for ( v = 0, vl = vertices.length; v < vl; v++ ) {
  36. vertex = vertices[ v ];
  37. vertexPositionScreen = vertex.positionScreen;
  38. vertexPositionScreen.copy( vertex.position );
  39. _projScreenObjectMatrix.transform( vertexPositionScreen );
  40. vertex.__visible = vertexPositionScreen.z > 0 && vertexPositionScreen.z < 1;
  41. }
  42. // faces
  43. faces = object.geometry.faces;
  44. for ( f = 0, fl = faces.length; f < fl; f++ ) {
  45. face = faces[ f ];
  46. if ( face instanceof THREE.Face3 ) {
  47. v1 = vertices[ face.a ]; v2 = vertices[ face.b ]; v3 = vertices[ face.c ];
  48. if ( v1.__visible && v2.__visible && v3.__visible ) {
  49. if ( ( object.doubleSided || ( object.flipSided !=
  50. ( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
  51. ( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ) ) ) {
  52. _face3 = _face3Pool[ _face3Count ] = _face3Pool[ _face3Count ] || new THREE.RenderableFace3();
  53. _face3.v1.copy( v1.positionScreen );
  54. _face3.v2.copy( v2.positionScreen );
  55. _face3.v3.copy( v3.positionScreen );
  56. _face3.normalWorld.copy( face.normal );
  57. object.matrixRotation.transform( _face3.normalWorld );
  58. _face3.centroidWorld.copy( face.centroid );
  59. objectMatrix.transform( _face3.centroidWorld );
  60. _face3.centroidScreen.copy( _face3.centroidWorld );
  61. _projScreenMatrix.transform( _face3.centroidScreen );
  62. _face3.z = _face3.centroidScreen.z;
  63. _face3.meshMaterial = object.material;
  64. _face3.faceMaterial = face.material;
  65. _face3.overdraw = object.overdraw;
  66. _face3.uvs = object.geometry.uvs[ f ];
  67. _face3.color = face.color;
  68. _renderList.push( _face3 );
  69. _face3Count ++;
  70. }
  71. }
  72. } else if ( face instanceof THREE.Face4 ) {
  73. v1 = vertices[ face.a ]; v2 = vertices[ face.b ]; v3 = vertices[ face.c ]; v4 = vertices[ face.d ];
  74. if ( v1.__visible && v2.__visible && v3.__visible && v4.__visible ) {
  75. if ( ( object.doubleSided || ( object.flipSided !=
  76. ( ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
  77. ( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ||
  78. ( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) -
  79. ( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0 ) ) ) ) {
  80. _face4 = _face4Pool[ _face4Count ] = _face4Pool[ _face4Count ] || new THREE.RenderableFace4();
  81. _face4.v1.copy( v1.positionScreen );
  82. _face4.v2.copy( v2.positionScreen );
  83. _face4.v3.copy( v3.positionScreen );
  84. _face4.v4.copy( v4.positionScreen );
  85. _face4.normalWorld.copy( face.normal );
  86. object.matrixRotation.transform( _face4.normalWorld );
  87. _face4.centroidWorld.copy( face.centroid );
  88. objectMatrix.transform( _face4.centroidWorld );
  89. _face4.centroidScreen.copy( _face4.centroidWorld );
  90. _projScreenMatrix.transform( _face4.centroidScreen );
  91. _face4.z = _face4.centroidScreen.z;
  92. _face4.meshMaterial = object.material;
  93. _face4.faceMaterial = face.material;
  94. _face4.overdraw = object.overdraw;
  95. _face4.uvs = object.geometry.uvs[ f ];
  96. _face4.color = face.color;
  97. _renderList.push( _face4 );
  98. _face4Count ++;
  99. }
  100. }
  101. }
  102. }
  103. } else if ( object instanceof THREE.Line ) {
  104. _projScreenObjectMatrix.multiply( _projScreenMatrix, objectMatrix );
  105. vertices = object.geometry.vertices;
  106. for ( v = 0, vl = vertices.length; v < vl; v++ ) {
  107. vertex = vertices[ v ];
  108. vertexPositionScreen = vertex.positionScreen;
  109. vertexPositionScreen.copy( vertex.position );
  110. _projScreenObjectMatrix.transform( vertexPositionScreen );
  111. vertex.__visible = vertexPositionScreen.z > 0 && vertexPositionScreen.z < 1;
  112. if ( v > 0 ) {
  113. vertex2 = object.geometry.vertices[ v - 1 ];
  114. if ( vertex.__visible && vertex2.__visible ) {
  115. _line = _linePool[ _lineCount ] = _linePool[ _lineCount ] || new THREE.RenderableLine();
  116. _line.v1.copy( vertex.positionScreen );
  117. _line.v2.copy( vertex2.positionScreen );
  118. // TODO: Use centroids here too.
  119. _line.z = Math.max( vertex.positionScreen.z, vertex2.positionScreen.z );
  120. _line.material = object.material;
  121. _renderList.push( _line );
  122. _lineCount ++;
  123. }
  124. }
  125. }
  126. } else if ( object instanceof THREE.Particle ) {
  127. _vector4.set( object.position.x, object.position.y, object.position.z, 1 );
  128. _projScreenMatrix.transform( _vector4 );
  129. _vector4.z /= _vector4.w;
  130. if ( _vector4.z > 0 && _vector4.z < 1 ) {
  131. _particle = _particlePool[ _particleCount ] = _particlePool[ _particleCount ] || new THREE.RenderableParticle();
  132. _particle.x = _vector4.x / _vector4.w;
  133. _particle.y = _vector4.y / _vector4.w;
  134. _particle.z = _vector4.z;
  135. _particle.rotation = object.rotation.z;
  136. _particle.scale.x = object.scale.x * Math.abs( _particle.x - ( _vector4.x + camera.projectionMatrix.n11 ) / ( _vector4.w + camera.projectionMatrix.n14 ) );
  137. _particle.scale.y = object.scale.y * Math.abs( _particle.y - ( _vector4.y + camera.projectionMatrix.n22 ) / ( _vector4.w + camera.projectionMatrix.n24 ) );
  138. _particle.material = object.material;
  139. _renderList.push( _particle );
  140. _particleCount ++;
  141. }
  142. }
  143. }
  144. _renderList.sort( function ( a, b ) { return b.z - a.z; } );
  145. return _renderList;
  146. };
  147. this.unprojectVector = function ( vector, camera ) {
  148. var matrix = new THREE.Matrix4();
  149. matrix.multiply( THREE.Matrix4.makeInvert( camera.matrix ), THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
  150. matrix.transform( vector );
  151. return vector;
  152. };
  153. };
粤ICP备19079148号