GeometryUtils.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author alteredq / http://alteredqualia.com/
  4. */
  5. THREE.GeometryUtils = {
  6. // Merge two geometries or geometry and geometry from object (using object's transform)
  7. merge: function ( geometry1, object2 /* mesh | geometry */ ) {
  8. var matrix, matrixRotation,
  9. vertexOffset = geometry1.vertices.length,
  10. uvPosition = geometry1.faceVertexUvs[ 0 ].length,
  11. geometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2,
  12. vertices1 = geometry1.vertices,
  13. vertices2 = geometry2.vertices,
  14. faces1 = geometry1.faces,
  15. faces2 = geometry2.faces,
  16. uvs1 = geometry1.faceVertexUvs[ 0 ],
  17. uvs2 = geometry2.faceVertexUvs[ 0 ];
  18. var geo1MaterialsMap = {};
  19. for ( var i = 0; i < geometry1.materials.length; i ++ ) {
  20. var id = geometry1.materials[ i ].id;
  21. geo1MaterialsMap[ id ] = i;
  22. }
  23. if ( object2 instanceof THREE.Mesh ) {
  24. object2.matrixAutoUpdate && object2.updateMatrix();
  25. matrix = object2.matrix;
  26. matrixRotation = new THREE.Matrix4();
  27. matrixRotation.extractRotation( matrix, object2.scale );
  28. }
  29. // vertices
  30. for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
  31. var vertex = vertices2[ i ];
  32. var vertexCopy = vertex.clone();
  33. if ( matrix ) matrix.multiplyVector3( vertexCopy );
  34. vertices1.push( vertexCopy );
  35. }
  36. // faces
  37. for ( i = 0, il = faces2.length; i < il; i ++ ) {
  38. var face = faces2[ i ], faceCopy, normal, color,
  39. faceVertexNormals = face.vertexNormals,
  40. faceVertexColors = face.vertexColors;
  41. if ( face instanceof THREE.Face3 ) {
  42. faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
  43. } else if ( face instanceof THREE.Face4 ) {
  44. faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset );
  45. }
  46. faceCopy.normal.copy( face.normal );
  47. if ( matrixRotation ) matrixRotation.multiplyVector3( faceCopy.normal );
  48. for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
  49. normal = faceVertexNormals[ j ].clone();
  50. if ( matrixRotation ) matrixRotation.multiplyVector3( normal );
  51. faceCopy.vertexNormals.push( normal );
  52. }
  53. faceCopy.color.copy( face.color );
  54. for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
  55. color = faceVertexColors[ j ];
  56. faceCopy.vertexColors.push( color.clone() );
  57. }
  58. if ( face.materialIndex !== undefined ) {
  59. var material2 = geometry2.materials[ face.materialIndex ];
  60. var materialId2 = material2.id;
  61. var materialIndex = geo1MaterialsMap[ materialId2 ];
  62. if ( materialIndex === undefined ) {
  63. materialIndex = geometry1.materials.length;
  64. geo1MaterialsMap[ materialId2 ] = materialIndex;
  65. geometry1.materials.push( material2 );
  66. }
  67. faceCopy.materialIndex = materialIndex;
  68. }
  69. faceCopy.centroid.copy( face.centroid );
  70. if ( matrix ) matrix.multiplyVector3( faceCopy.centroid );
  71. faces1.push( faceCopy );
  72. }
  73. // uvs
  74. for ( i = 0, il = uvs2.length; i < il; i ++ ) {
  75. var uv = uvs2[ i ], uvCopy = [];
  76. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  77. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  78. }
  79. uvs1.push( uvCopy );
  80. }
  81. },
  82. clone: function ( geometry ) {
  83. var cloneGeo = new THREE.Geometry();
  84. var i, il;
  85. var vertices = geometry.vertices,
  86. faces = geometry.faces,
  87. uvs = geometry.faceVertexUvs[ 0 ];
  88. // materials
  89. if ( geometry.materials ) {
  90. cloneGeo.materials = geometry.materials.slice();
  91. }
  92. // vertices
  93. for ( i = 0, il = vertices.length; i < il; i ++ ) {
  94. var vertex = vertices[ i ];
  95. cloneGeo.vertices.push( vertex.clone() );
  96. }
  97. // faces
  98. for ( i = 0, il = faces.length; i < il; i ++ ) {
  99. var face = faces[ i ];
  100. cloneGeo.faces.push( face.clone() );
  101. }
  102. // uvs
  103. for ( i = 0, il = uvs.length; i < il; i ++ ) {
  104. var uv = uvs[ i ], uvCopy = [];
  105. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  106. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  107. }
  108. cloneGeo.faceVertexUvs[ 0 ].push( uvCopy );
  109. }
  110. return cloneGeo;
  111. },
  112. // Get random point in triangle (via barycentric coordinates)
  113. // (uniform distribution)
  114. // http://www.cgafaq.info/wiki/Random_Point_In_Triangle
  115. randomPointInTriangle: function ( vectorA, vectorB, vectorC ) {
  116. var a, b, c,
  117. point = new THREE.Vector3(),
  118. tmp = THREE.GeometryUtils.__v1;
  119. a = THREE.GeometryUtils.random();
  120. b = THREE.GeometryUtils.random();
  121. if ( ( a + b ) > 1 ) {
  122. a = 1 - a;
  123. b = 1 - b;
  124. }
  125. c = 1 - a - b;
  126. point.copy( vectorA );
  127. point.multiplyScalar( a );
  128. tmp.copy( vectorB );
  129. tmp.multiplyScalar( b );
  130. point.addSelf( tmp );
  131. tmp.copy( vectorC );
  132. tmp.multiplyScalar( c );
  133. point.addSelf( tmp );
  134. return point;
  135. },
  136. // Get random point in face (triangle / quad)
  137. // (uniform distribution)
  138. randomPointInFace: function ( face, geometry, useCachedAreas ) {
  139. var vA, vB, vC, vD;
  140. if ( face instanceof THREE.Face3 ) {
  141. vA = geometry.vertices[ face.a ];
  142. vB = geometry.vertices[ face.b ];
  143. vC = geometry.vertices[ face.c ];
  144. return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );
  145. } else if ( face instanceof THREE.Face4 ) {
  146. vA = geometry.vertices[ face.a ];
  147. vB = geometry.vertices[ face.b ];
  148. vC = geometry.vertices[ face.c ];
  149. vD = geometry.vertices[ face.d ];
  150. var area1, area2;
  151. if ( useCachedAreas ) {
  152. if ( face._area1 && face._area2 ) {
  153. area1 = face._area1;
  154. area2 = face._area2;
  155. } else {
  156. area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
  157. area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  158. face._area1 = area1;
  159. face._area2 = area2;
  160. }
  161. } else {
  162. area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ),
  163. area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  164. }
  165. var r = THREE.GeometryUtils.random() * ( area1 + area2 );
  166. if ( r < area1 ) {
  167. return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vD );
  168. } else {
  169. return THREE.GeometryUtils.randomPointInTriangle( vB, vC, vD );
  170. }
  171. }
  172. },
  173. // Get uniformly distributed random points in mesh
  174. // - create array with cumulative sums of face areas
  175. // - pick random number from 0 to total area
  176. // - find corresponding place in area array by binary search
  177. // - get random point in face
  178. randomPointsInGeometry: function ( geometry, n ) {
  179. var face, i,
  180. faces = geometry.faces,
  181. vertices = geometry.vertices,
  182. il = faces.length,
  183. totalArea = 0,
  184. cumulativeAreas = [],
  185. vA, vB, vC, vD;
  186. // precompute face areas
  187. for ( i = 0; i < il; i ++ ) {
  188. face = faces[ i ];
  189. if ( face instanceof THREE.Face3 ) {
  190. vA = vertices[ face.a ];
  191. vB = vertices[ face.b ];
  192. vC = vertices[ face.c ];
  193. face._area = THREE.GeometryUtils.triangleArea( vA, vB, vC );
  194. } else if ( face instanceof THREE.Face4 ) {
  195. vA = vertices[ face.a ];
  196. vB = vertices[ face.b ];
  197. vC = vertices[ face.c ];
  198. vD = vertices[ face.d ];
  199. face._area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
  200. face._area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  201. face._area = face._area1 + face._area2;
  202. }
  203. totalArea += face._area;
  204. cumulativeAreas[ i ] = totalArea;
  205. }
  206. // binary search cumulative areas array
  207. function binarySearchIndices( value ) {
  208. function binarySearch( start, end ) {
  209. // return closest larger index
  210. // if exact number is not found
  211. if ( end < start )
  212. return start;
  213. var mid = start + Math.floor( ( end - start ) / 2 );
  214. if ( cumulativeAreas[ mid ] > value ) {
  215. return binarySearch( start, mid - 1 );
  216. } else if ( cumulativeAreas[ mid ] < value ) {
  217. return binarySearch( mid + 1, end );
  218. } else {
  219. return mid;
  220. }
  221. }
  222. var result = binarySearch( 0, cumulativeAreas.length - 1 )
  223. return result;
  224. }
  225. // pick random face weighted by face area
  226. var r, index,
  227. result = [];
  228. var stats = {};
  229. for ( i = 0; i < n; i ++ ) {
  230. r = THREE.GeometryUtils.random() * totalArea;
  231. index = binarySearchIndices( r );
  232. result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );
  233. if ( ! stats[ index ] ) {
  234. stats[ index ] = 1;
  235. } else {
  236. stats[ index ] += 1;
  237. }
  238. }
  239. return result;
  240. },
  241. // Get triangle area (by Heron's formula)
  242. // http://en.wikipedia.org/wiki/Heron%27s_formula
  243. triangleArea: function ( vectorA, vectorB, vectorC ) {
  244. var s, a, b, c,
  245. tmp = THREE.GeometryUtils.__v1;
  246. tmp.sub( vectorA, vectorB );
  247. a = tmp.length();
  248. tmp.sub( vectorA, vectorC );
  249. b = tmp.length();
  250. tmp.sub( vectorB, vectorC );
  251. c = tmp.length();
  252. s = 0.5 * ( a + b + c );
  253. return Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) );
  254. },
  255. // Center geometry so that 0,0,0 is in center of bounding box
  256. center: function ( geometry ) {
  257. geometry.computeBoundingBox();
  258. var bb = geometry.boundingBox;
  259. var offset = new THREE.Vector3();
  260. offset.add( bb.min, bb.max );
  261. offset.multiplyScalar( -0.5 );
  262. geometry.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) );
  263. geometry.computeBoundingBox();
  264. return offset;
  265. },
  266. // Normalize UVs to be from <0,1>
  267. // (for now just the first set of UVs)
  268. normalizeUVs: function ( geometry ) {
  269. var uvSet = geometry.faceVertexUvs[ 0 ];
  270. for ( var i = 0, il = uvSet.length; i < il; i ++ ) {
  271. var uvs = uvSet[ i ];
  272. for ( var j = 0, jl = uvs.length; j < jl; j ++ ) {
  273. // texture repeat
  274. if( uvs[ j ].u !== 1.0 ) uvs[ j ].u = uvs[ j ].u - Math.floor( uvs[ j ].u );
  275. if( uvs[ j ].v !== 1.0 ) uvs[ j ].v = uvs[ j ].v - Math.floor( uvs[ j ].v );
  276. }
  277. }
  278. },
  279. triangulateQuads: function ( geometry ) {
  280. var i, il, j, jl;
  281. var faces = [];
  282. var faceUvs = [];
  283. var faceVertexUvs = [];
  284. for ( i = 0, il = geometry.faceUvs.length; i < il; i ++ ) {
  285. faceUvs[ i ] = [];
  286. }
  287. for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
  288. faceVertexUvs[ i ] = [];
  289. }
  290. for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
  291. var face = geometry.faces[ i ];
  292. if ( face instanceof THREE.Face4 ) {
  293. var a = face.a;
  294. var b = face.b;
  295. var c = face.c;
  296. var d = face.d;
  297. var triA = new THREE.Face3();
  298. var triB = new THREE.Face3();
  299. triA.color.copy( face.color );
  300. triB.color.copy( face.color );
  301. triA.materialIndex = face.materialIndex;
  302. triB.materialIndex = face.materialIndex;
  303. triA.a = a;
  304. triA.b = b;
  305. triA.c = d;
  306. triB.a = b;
  307. triB.b = c;
  308. triB.c = d;
  309. if ( face.vertexColors.length === 4 ) {
  310. triA.vertexColors[ 0 ] = face.vertexColors[ 0 ].clone();
  311. triA.vertexColors[ 1 ] = face.vertexColors[ 1 ].clone();
  312. triA.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
  313. triB.vertexColors[ 0 ] = face.vertexColors[ 1 ].clone();
  314. triB.vertexColors[ 1 ] = face.vertexColors[ 2 ].clone();
  315. triB.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
  316. }
  317. faces.push( triA, triB );
  318. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  319. if ( geometry.faceVertexUvs[ j ].length ) {
  320. var uvs = geometry.faceVertexUvs[ j ][ i ];
  321. var uvA = uvs[ 0 ];
  322. var uvB = uvs[ 1 ];
  323. var uvC = uvs[ 2 ];
  324. var uvD = uvs[ 3 ];
  325. var uvsTriA = [ uvA.clone(), uvB.clone(), uvD.clone() ];
  326. var uvsTriB = [ uvB.clone(), uvC.clone(), uvD.clone() ];
  327. faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
  328. }
  329. }
  330. for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
  331. if ( geometry.faceUvs[ j ].length ) {
  332. var faceUv = geometry.faceUvs[ j ][ i ];
  333. faceUvs[ j ].push( faceUv, faceUv );
  334. }
  335. }
  336. } else {
  337. faces.push( face );
  338. for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
  339. faceUvs[ j ].push( geometry.faceUvs[ j ][ i ] );
  340. }
  341. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  342. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  343. }
  344. }
  345. }
  346. geometry.faces = faces;
  347. geometry.faceUvs = faceUvs;
  348. geometry.faceVertexUvs = faceVertexUvs;
  349. geometry.computeCentroids();
  350. geometry.computeFaceNormals();
  351. geometry.computeVertexNormals();
  352. if ( geometry.hasTangents ) geometry.computeTangents();
  353. },
  354. // Make all faces use unique vertices
  355. // so that each face can be separated from others
  356. explode: function( geometry ) {
  357. var vertices = [];
  358. for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
  359. var n = vertices.length;
  360. var face = geometry.faces[ i ];
  361. if ( face instanceof THREE.Face4 ) {
  362. var a = face.a;
  363. var b = face.b;
  364. var c = face.c;
  365. var d = face.d;
  366. var va = geometry.vertices[ a ];
  367. var vb = geometry.vertices[ b ];
  368. var vc = geometry.vertices[ c ];
  369. var vd = geometry.vertices[ d ];
  370. vertices.push( va.clone() );
  371. vertices.push( vb.clone() );
  372. vertices.push( vc.clone() );
  373. vertices.push( vd.clone() );
  374. face.a = n;
  375. face.b = n + 1;
  376. face.c = n + 2;
  377. face.d = n + 3;
  378. } else {
  379. var a = face.a;
  380. var b = face.b;
  381. var c = face.c;
  382. var va = geometry.vertices[ a ];
  383. var vb = geometry.vertices[ b ];
  384. var vc = geometry.vertices[ c ];
  385. vertices.push( va.clone() );
  386. vertices.push( vb.clone() );
  387. vertices.push( vc.clone() );
  388. face.a = n;
  389. face.b = n + 1;
  390. face.c = n + 2;
  391. }
  392. }
  393. geometry.vertices = vertices;
  394. delete geometry.__tmpVertices;
  395. },
  396. // Break faces with edges longer than maxEdgeLength
  397. // - not recursive
  398. tessellate: function ( geometry, maxEdgeLength ) {
  399. var i, il, face,
  400. a, b, c, d,
  401. va, vb, vc, vd,
  402. dab, dbc, dac, dcd, dad,
  403. m, m1, m2,
  404. vm, vm1, vm2,
  405. vnm, vnm1, vnm2,
  406. vcm, vcm1, vcm2,
  407. triA, triB,
  408. quadA, quadB,
  409. edge;
  410. var faces = [];
  411. var faceVertexUvs = [];
  412. for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
  413. faceVertexUvs[ i ] = [];
  414. }
  415. for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
  416. face = geometry.faces[ i ];
  417. if ( face instanceof THREE.Face3 ) {
  418. a = face.a;
  419. b = face.b;
  420. c = face.c;
  421. va = geometry.vertices[ a ];
  422. vb = geometry.vertices[ b ];
  423. vc = geometry.vertices[ c ];
  424. dab = va.distanceTo( vb );
  425. dbc = vb.distanceTo( vc );
  426. dac = va.distanceTo( vc );
  427. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
  428. m = geometry.vertices.length;
  429. triA = face.clone();
  430. triB = face.clone();
  431. if ( dab >= dbc && dab >= dac ) {
  432. vm = va.clone();
  433. vm.lerpSelf( vb, 0.5 );
  434. triA.a = a;
  435. triA.b = m;
  436. triA.c = c;
  437. triB.a = m;
  438. triB.b = b;
  439. triB.c = c;
  440. if ( face.vertexNormals.length === 3 ) {
  441. vnm = face.vertexNormals[ 0 ].clone();
  442. vnm.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
  443. triA.vertexNormals[ 1 ].copy( vnm );
  444. triB.vertexNormals[ 0 ].copy( vnm );
  445. }
  446. if ( face.vertexColors.length === 3 ) {
  447. vcm = face.vertexColors[ 0 ].clone();
  448. vcm.lerpSelf( face.vertexColors[ 1 ], 0.5 );
  449. triA.vertexColors[ 1 ].copy( vcm );
  450. triB.vertexColors[ 0 ].copy( vcm );
  451. }
  452. edge = 0;
  453. } else if ( dbc >= dab && dbc >= dac ) {
  454. vm = vb.clone();
  455. vm.lerpSelf( vc, 0.5 );
  456. triA.a = a;
  457. triA.b = b;
  458. triA.c = m;
  459. triB.a = m;
  460. triB.b = c;
  461. triB.c = a;
  462. if ( face.vertexNormals.length === 3 ) {
  463. vnm = face.vertexNormals[ 1 ].clone();
  464. vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  465. triA.vertexNormals[ 2 ].copy( vnm );
  466. triB.vertexNormals[ 0 ].copy( vnm );
  467. triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
  468. triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
  469. }
  470. if ( face.vertexColors.length === 3 ) {
  471. vcm = face.vertexColors[ 1 ].clone();
  472. vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  473. triA.vertexColors[ 2 ].copy( vcm );
  474. triB.vertexColors[ 0 ].copy( vcm );
  475. triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
  476. triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
  477. }
  478. edge = 1;
  479. } else {
  480. vm = va.clone();
  481. vm.lerpSelf( vc, 0.5 );
  482. triA.a = a;
  483. triA.b = b;
  484. triA.c = m;
  485. triB.a = m;
  486. triB.b = b;
  487. triB.c = c;
  488. if ( face.vertexNormals.length === 3 ) {
  489. vnm = face.vertexNormals[ 0 ].clone();
  490. vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  491. triA.vertexNormals[ 2 ].copy( vnm );
  492. triB.vertexNormals[ 0 ].copy( vnm );
  493. }
  494. if ( face.vertexColors.length === 3 ) {
  495. vcm = face.vertexColors[ 0 ].clone();
  496. vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  497. triA.vertexColors[ 2 ].copy( vcm );
  498. triB.vertexColors[ 0 ].copy( vcm );
  499. }
  500. edge = 2;
  501. }
  502. faces.push( triA, triB );
  503. geometry.vertices.push( vm );
  504. var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
  505. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  506. if ( geometry.faceVertexUvs[ j ].length ) {
  507. uvs = geometry.faceVertexUvs[ j ][ i ];
  508. uvA = uvs[ 0 ];
  509. uvB = uvs[ 1 ];
  510. uvC = uvs[ 2 ];
  511. // AB
  512. if ( edge === 0 ) {
  513. uvM = uvA.clone();
  514. uvM.lerpSelf( uvB, 0.5 );
  515. uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
  516. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  517. // BC
  518. } else if ( edge === 1 ) {
  519. uvM = uvB.clone();
  520. uvM.lerpSelf( uvC, 0.5 );
  521. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  522. uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
  523. // AC
  524. } else {
  525. uvM = uvA.clone();
  526. uvM.lerpSelf( uvC, 0.5 );
  527. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  528. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  529. }
  530. faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
  531. }
  532. }
  533. } else {
  534. faces.push( face );
  535. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  536. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  537. }
  538. }
  539. } else {
  540. a = face.a;
  541. b = face.b;
  542. c = face.c;
  543. d = face.d;
  544. va = geometry.vertices[ a ];
  545. vb = geometry.vertices[ b ];
  546. vc = geometry.vertices[ c ];
  547. vd = geometry.vertices[ d ];
  548. dab = va.distanceTo( vb );
  549. dbc = vb.distanceTo( vc );
  550. dcd = vc.distanceTo( vd );
  551. dad = va.distanceTo( vd );
  552. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
  553. m1 = geometry.vertices.length;
  554. m2 = geometry.vertices.length + 1;
  555. quadA = face.clone();
  556. quadB = face.clone();
  557. if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
  558. vm1 = va.clone();
  559. vm1.lerpSelf( vb, 0.5 );
  560. vm2 = vc.clone();
  561. vm2.lerpSelf( vd, 0.5 );
  562. quadA.a = a;
  563. quadA.b = m1;
  564. quadA.c = m2;
  565. quadA.d = d;
  566. quadB.a = m1;
  567. quadB.b = b;
  568. quadB.c = c;
  569. quadB.d = m2;
  570. if ( face.vertexNormals.length === 4 ) {
  571. vnm1 = face.vertexNormals[ 0 ].clone();
  572. vnm1.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
  573. vnm2 = face.vertexNormals[ 2 ].clone();
  574. vnm2.lerpSelf( face.vertexNormals[ 3 ], 0.5 );
  575. quadA.vertexNormals[ 1 ].copy( vnm1 );
  576. quadA.vertexNormals[ 2 ].copy( vnm2 );
  577. quadB.vertexNormals[ 0 ].copy( vnm1 );
  578. quadB.vertexNormals[ 3 ].copy( vnm2 );
  579. }
  580. if ( face.vertexColors.length === 4 ) {
  581. vcm1 = face.vertexColors[ 0 ].clone();
  582. vcm1.lerpSelf( face.vertexColors[ 1 ], 0.5 );
  583. vcm2 = face.vertexColors[ 2 ].clone();
  584. vcm2.lerpSelf( face.vertexColors[ 3 ], 0.5 );
  585. quadA.vertexColors[ 1 ].copy( vcm1 );
  586. quadA.vertexColors[ 2 ].copy( vcm2 );
  587. quadB.vertexColors[ 0 ].copy( vcm1 );
  588. quadB.vertexColors[ 3 ].copy( vcm2 );
  589. }
  590. edge = 0;
  591. } else {
  592. vm1 = vb.clone();
  593. vm1.lerpSelf( vc, 0.5 );
  594. vm2 = vd.clone();
  595. vm2.lerpSelf( va, 0.5 );
  596. quadA.a = a;
  597. quadA.b = b;
  598. quadA.c = m1;
  599. quadA.d = m2;
  600. quadB.a = m2;
  601. quadB.b = m1;
  602. quadB.c = c;
  603. quadB.d = d;
  604. if ( face.vertexNormals.length === 4 ) {
  605. vnm1 = face.vertexNormals[ 1 ].clone();
  606. vnm1.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  607. vnm2 = face.vertexNormals[ 3 ].clone();
  608. vnm2.lerpSelf( face.vertexNormals[ 0 ], 0.5 );
  609. quadA.vertexNormals[ 2 ].copy( vnm1 );
  610. quadA.vertexNormals[ 3 ].copy( vnm2 );
  611. quadB.vertexNormals[ 0 ].copy( vnm2 );
  612. quadB.vertexNormals[ 1 ].copy( vnm1 );
  613. }
  614. if ( face.vertexColors.length === 4 ) {
  615. vcm1 = face.vertexColors[ 1 ].clone();
  616. vcm1.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  617. vcm2 = face.vertexColors[ 3 ].clone();
  618. vcm2.lerpSelf( face.vertexColors[ 0 ], 0.5 );
  619. quadA.vertexColors[ 2 ].copy( vcm1 );
  620. quadA.vertexColors[ 3 ].copy( vcm2 );
  621. quadB.vertexColors[ 0 ].copy( vcm2 );
  622. quadB.vertexColors[ 1 ].copy( vcm1 );
  623. }
  624. edge = 1;
  625. }
  626. faces.push( quadA, quadB );
  627. geometry.vertices.push( vm1, vm2 );
  628. var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
  629. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  630. if ( geometry.faceVertexUvs[ j ].length ) {
  631. uvs = geometry.faceVertexUvs[ j ][ i ];
  632. uvA = uvs[ 0 ];
  633. uvB = uvs[ 1 ];
  634. uvC = uvs[ 2 ];
  635. uvD = uvs[ 3 ];
  636. // AB + CD
  637. if ( edge === 0 ) {
  638. uvM1 = uvA.clone();
  639. uvM1.lerpSelf( uvB, 0.5 );
  640. uvM2 = uvC.clone();
  641. uvM2.lerpSelf( uvD, 0.5 );
  642. uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
  643. uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
  644. // BC + AD
  645. } else {
  646. uvM1 = uvB.clone();
  647. uvM1.lerpSelf( uvC, 0.5 );
  648. uvM2 = uvD.clone();
  649. uvM2.lerpSelf( uvA, 0.5 );
  650. uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
  651. uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
  652. }
  653. faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
  654. }
  655. }
  656. } else {
  657. faces.push( face );
  658. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  659. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  660. }
  661. }
  662. }
  663. }
  664. geometry.faces = faces;
  665. geometry.faceVertexUvs = faceVertexUvs;
  666. }
  667. };
  668. THREE.GeometryUtils.random = THREE.Math.random16;
  669. THREE.GeometryUtils.__v1 = new THREE.Vector3();
粤ICP备19079148号