InitPage.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. var camera, cameraOrtho, scene, sceneOrtho, renderer, orbitCtl, cube, distance;
  2. var width, height, depth;
  3. var languageContent;
  4. function initPage() {
  5. // 解析的url后缀 e.g.:
  6. // ?={"Load":"加载中...","RotateR":"旋转-","RotateL":"旋转+","Move":"移动","Clip":"切割","QuickClip":"AI切割","Delete":"删除","Reset":"重置"}
  7. // let url = location.href;
  8. // let language = decodeURI(
  9. // url.substr(url.indexOf("=") + 1, url.length - url.indexOf("="))
  10. // );
  11. // console.log(language);
  12. // languageContent = JSON.parse(language);
  13. languageContent = {
  14. Load: "加载中...",
  15. RotateR: "旋转-",
  16. RotateL: "旋转+",
  17. Move: "移动",
  18. Clip: "切割",
  19. QuickClip: "AI切割",
  20. Delete: "删除",
  21. Reset: "重置",
  22. };
  23. var text = document.getElementById("loadText");
  24. text.innerHTML = languageContent.Load;
  25. var infoText = document.getElementById("infoText");
  26. infoText.innerHTML = languageContent.QuickClipFail;
  27. OSHelper.init();
  28. scene = new THREE.Scene();
  29. sceneOrtho = new THREE.Scene();
  30. scene.add(new THREE.AmbientLight(0xffffff));
  31. // Renderer
  32. renderer = new THREE.WebGLRenderer({ antialias: true });
  33. renderer.setClearColor(0x373737, 1.0);
  34. renderer.setPixelRatio(window.devicePixelRatio);
  35. renderer.setSize(window.innerWidth, window.innerHeight);
  36. renderer.autoClear = false;
  37. window.addEventListener("resize", onWindowResize, false);
  38. document.body.appendChild(renderer.domElement);
  39. renderer.localClippingEnabled = true;
  40. SpriteManager.init();
  41. LinesDrawingManager.initLine();
  42. // Controls
  43. camera = new THREE.PerspectiveCamera(
  44. 45,
  45. window.innerWidth / window.innerHeight,
  46. 20,
  47. 20000
  48. );
  49. //camera = new THREE.PerspectiveCamera(30, window.innerWidth / window.innerHeight, 20, 20000);
  50. camera.up.set(0, 0, 1);
  51. cameraOrtho = new THREE.OrthographicCamera(
  52. -window.innerWidth / 2,
  53. window.innerWidth / 2,
  54. window.innerHeight / 2,
  55. -window.innerHeight / 2,
  56. 1,
  57. 10
  58. );
  59. cameraOrtho.position.z = 10;
  60. orbitCtl = new THREE.OrbitControls(camera, renderer.domElement);
  61. orbitCtl.enablePan = false;
  62. animate();
  63. initClipArgs();
  64. // 触发方式 setSurface(100,100,100,"../3DWeb/FaceImage")
  65. EventCenter.addEventHandler("SetSurface", createCube);
  66. EventCenter.addEventHandler("ChangeSurface", changeCube);
  67. EventCenter.addEventHandler("ResetCubeImage", resetCubeImage);
  68. EventCenter.addEventHandler("RemoveCube", removeCube);
  69. }
  70. function createCube(surfaceInfo) {
  71. SpriteManager.allowClip = false;
  72. //remove old
  73. removeCube();
  74. //create new
  75. width = surfaceInfo.cubeWidth;
  76. height = surfaceInfo.cubeHeight;
  77. depth = surfaceInfo.cubeDepth;
  78. let surfacePaths = [];
  79. for (let i = 1; i <= 6; i++) {
  80. surfacePaths.push(surfaceInfo.surfaceFolder + "/" + i + ".jpg");
  81. }
  82. let materials = [];
  83. let textures = loadSurface(surfacePaths);
  84. textures.forEach((texture) => {
  85. materials.push(
  86. new THREE.MeshPhongMaterial({ map: texture, clippingPlanes: [] })
  87. );
  88. });
  89. let geometry = new THREE.BoxGeometry(width, height, depth);
  90. cube = new THREE.Mesh(geometry, materials);
  91. cube.position.set(width / 2, height / 2, -depth / 2);
  92. scene.add(cube);
  93. resetCubePosition();
  94. EdgesManager.edgesNeedUpdate = true;
  95. }
  96. function changeCube(surfaceInfo) {
  97. SpriteManager.allowClip = false;
  98. //remove old
  99. removeCube();
  100. //create new
  101. width = surfaceInfo.cubeWidth;
  102. height = surfaceInfo.cubeHeight;
  103. depth = surfaceInfo.cubeDepth;
  104. let surfacePaths = [];
  105. for (const surface of surfaceInfo.surfacesList) {
  106. surfacePaths.push(surface);
  107. }
  108. let materials = [];
  109. let textures = loadBase64Surface(surfacePaths);
  110. textures.forEach((texture) => {
  111. materials.push(
  112. new THREE.MeshPhongMaterial({ map: texture, clippingPlanes: [] })
  113. );
  114. });
  115. let geometry = new THREE.BoxGeometry(width, height, depth);
  116. cube = new THREE.Mesh(geometry, materials);
  117. cube.position.set(width / 2, height / 2, -depth / 2);
  118. scene.add(cube);
  119. resetCubePosition();
  120. EdgesManager.edgesNeedUpdate = true;
  121. }
  122. function resetCubeImage(surfaceFolder) {
  123. let surfacePaths = [];
  124. for (let i = 1; i <= 6; i++) {
  125. surfacePaths.push(surfaceFolder + "/" + i + ".jpg");
  126. }
  127. if (surfacePaths.length > 0) {
  128. loadSurface(surfacePaths, (texture, number) => {
  129. if (cube.material[number] != undefined) {
  130. texture.minFilter = texture.magFilter = THREE.LinearFilter;
  131. texture.mapping = THREE.UVMapping;
  132. cube.material[number].map.dispose();
  133. cube.material[number].map = texture;
  134. }
  135. });
  136. cube.material.needsUpdate = true;
  137. }
  138. }
  139. function removeCube() {
  140. if (cube != undefined) {
  141. SpriteManager.waitMdlFileLoading();
  142. SpriteManager.resetChecked();
  143. cube.material.forEach((material) => {
  144. if (material.map != undefined) {
  145. material.map.dispose();
  146. }
  147. material.dispose();
  148. });
  149. cube.geometry.dispose();
  150. scene.remove(cube);
  151. }
  152. }
  153. function resetCubePosition() {
  154. camera.position.set(width * 1.2, -width * 1.8, depth / 2);
  155. orbitCtl.target = cube.position;
  156. orbitCtl.update();
  157. orbitCtl.maxDistance = width * OSHelper.orbitCtlDistanceMultiple;
  158. orbitCtl.minDistance = width * (OSHelper.orbitCtlDistanceMultiple - 1);
  159. }
  160. function loadSurface(images, callback) {
  161. var textures = [];
  162. for (let i = 0; i < images.length; i++) {
  163. textures[i] = LoaderUtility.loadUniqueTexture(images[i], (texture) => {
  164. texture.minFilter = texture.magFilter = THREE.LinearFilter;
  165. texture.mapping = THREE.UVMapping;
  166. texture.center.set(0.5, 0.5);
  167. if (i === 0) {
  168. texture.rotation = 1.57;
  169. }
  170. if (i === 1) {
  171. texture.rotation = -1.57;
  172. }
  173. if (i === 5) {
  174. texture.rotation = 3.14;
  175. }
  176. if (callback != undefined) {
  177. callback(texture, i);
  178. }
  179. });
  180. }
  181. return textures;
  182. }
  183. function loadBase64Surface(images, callback) {
  184. var textures = [];
  185. for (let i = 0; i < images.length; i++) {
  186. textures[i] = LoaderUtility.loadBase64Texture(images[i], (texture) => {
  187. texture.minFilter = texture.magFilter = THREE.LinearFilter;
  188. texture.mapping = THREE.UVMapping;
  189. texture.center.set(0.5, 0.5);
  190. if (i === 0) {
  191. texture.rotation = 1.57;
  192. }
  193. if (i === 1) {
  194. texture.rotation = -1.57;
  195. }
  196. if (i === 5) {
  197. texture.rotation = 3.14;
  198. }
  199. if (callback != undefined) {
  200. callback(texture, i);
  201. }
  202. });
  203. }
  204. return textures;
  205. }
  206. function onWindowResize() {
  207. camera.aspect = window.innerWidth / window.innerHeight;
  208. camera.updateProjectionMatrix();
  209. cameraOrtho.left = -window.innerWidth / 2;
  210. cameraOrtho.right = window.innerWidth / 2;
  211. cameraOrtho.top = window.innerHeight / 2;
  212. cameraOrtho.bottom = -window.innerHeight / 2;
  213. cameraOrtho.updateProjectionMatrix();
  214. SpriteManager.resetSpritePosition();
  215. renderer.setSize(window.innerWidth, window.innerHeight);
  216. }
  217. function animate() {
  218. renderer.clear();
  219. renderer.render(scene, camera);
  220. renderer.clearDepth();
  221. renderer.render(sceneOrtho, cameraOrtho);
  222. requestAnimationFrame(animate);
  223. }