three-base 2.0.110 → 2.0.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Grass/grass.jpg CHANGED
Binary file
Binary file
Binary file
Binary file
package/Sky/skyMap.png CHANGED
Binary file
Binary file
package/ThreeBase.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AxesHelper, BufferGeometry, DepthTexture, EventDispatcher, GridHelper, Object3D, OrthographicCamera, PerspectiveCamera, Scene, Texture, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
1
+ import { AxesHelper, DepthTexture, EventDispatcher, GridHelper, Object3D, OrthographicCamera, PerspectiveCamera, Scene, Texture, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
2
2
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
3
3
  import ThreeMouse from "./ThreeMouse";
4
4
  import Transition from "./Transition";
@@ -75,17 +75,6 @@ export default class ThreeBase extends EventDispatcher {
75
75
  getThumbBase64(): string;
76
76
  getThumbFile(): Promise<File>;
77
77
  download(fileName?: string): Promise<void>;
78
- private _preMesh;
79
- private _preRT;
80
- preloadTexture(src: string): Promise<void>;
81
- preloadGeometry(geometry: BufferGeometry): Promise<void>;
82
- clearRendererTargte(rendererTarget: WebGLRenderTarget | null): void;
83
- copyTextureToRenderTarget(texture: Texture, rendererTarget: WebGLRenderTarget | null, alpha?: boolean, opactity?: number): void;
84
- object3dToRendererTarget(obj: Object3D, rendererTarget: WebGLRenderTarget): void;
85
- rendererTagetAddStroke(rendererTarget: WebGLRenderTarget, strockWidth: number, color: string, opacity: number): void;
86
- renderObject3dStroke(obj: Object3D, strockWidth: number, color: string, opacity: number): void;
87
- renderTargetgaussBlur(rendererTarget: WebGLRenderTarget, radius: number, opacity: number): void;
88
- renderTargetAddGlow(renderTarget: WebGLRenderTarget, width: number, color: string): void;
89
78
  renderRendererTarget(renderTarget: WebGLRenderTarget): void;
90
79
  renderTexture(texture: Texture, alpha?: boolean): void;
91
80
  }
package/ThreeBase.js CHANGED
@@ -5,14 +5,14 @@
5
5
  * @Last Modified time: 2024-09-23 21:20:32
6
6
  */
7
7
  import { round } from "lodash";
8
- import { AxesHelper, Box3, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, MOUSE, Mesh, NoBlending, NormalBlending, OrthographicCamera, PerspectiveCamera, RGBAFormat, ReinhardToneMapping, SRGBColorSpace, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer, } from "three";
8
+ import { AxesHelper, Box3, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, MOUSE, NoBlending, NormalBlending, OrthographicCamera, PerspectiveCamera, RGBAFormat, ReinhardToneMapping, SRGBColorSpace, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer, } from "three";
9
9
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
10
10
  import { degToRad, generateUUID } from "three/src/math/MathUtils";
11
11
  import ThreeMouse from "./ThreeMouse";
12
12
  import Transition from "./Transition";
13
13
  import glow_pass from "./pass/glow_pass";
14
14
  import stroke_pass from "./pass/stroke_pass";
15
- import { baseTextureToRenderShader, clearShader, copyShader, fullScreenMesh, gaussBlurShader, strokeShader, } from "./shaders";
15
+ import { baseTextureToRenderShader, copyShader, fullScreenMesh, } from "./shaders";
16
16
  import threeLoader from "./threeLoader";
17
17
  import threeUtils from "./threeUtils";
18
18
  import cover_pass from "./pass/cover_pass";
@@ -55,7 +55,6 @@ export default class ThreeBase extends EventDispatcher {
55
55
  anisotropy: 16,
56
56
  colorSpace: SRGBColorSpace,
57
57
  });
58
- baseRenderTarget.texture.colorSpace = SRGBColorSpace;
59
58
  return baseRenderTarget;
60
59
  })();
61
60
  // 公用渲染目标1
@@ -83,7 +82,7 @@ export default class ThreeBase extends EventDispatcher {
83
82
  const renderer = new WebGLRenderer({
84
83
  alpha: true,
85
84
  antialias: false,
86
- precision: "lowp",
85
+ precision: "highp",
87
86
  logarithmicDepthBuffer: true,
88
87
  preserveDrawingBuffer: true,
89
88
  stencil: false, // 模版
@@ -435,9 +434,10 @@ export default class ThreeBase extends EventDispatcher {
435
434
  this.stopRender();
436
435
  return;
437
436
  }
437
+ // 相机的朝向
438
+ const center = new Vector3(...this.controls.target.toArray().map((v) => round(v, 3)));
438
439
  //透视相机和正交相机参数的时时转换
439
440
  if (this.cameraType === "perspectiveCamera") {
440
- const { center } = this.getLookAt();
441
441
  const { fov } = this.perspectiveCamera;
442
442
  const distaned = this.perspectiveCamera.position
443
443
  .clone()
@@ -451,7 +451,6 @@ export default class ThreeBase extends EventDispatcher {
451
451
  .add(center);
452
452
  }
453
453
  else if (this.cameraType === "orthographicCamera") {
454
- const { center } = this.getLookAt();
455
454
  const { fov } = this.perspectiveCamera;
456
455
  const { zoom } = this.orthographicCamera;
457
456
  const distaned = 1 / zoom / Math.tan(degToRad(fov) / 2);
@@ -500,7 +499,12 @@ export default class ThreeBase extends EventDispatcher {
500
499
  renderBindThis = this.render.bind(this);
501
500
  //获取渲染图blob对象
502
501
  async getThumbBlob() {
503
- this.render();
502
+ this.renderer.setRenderTarget(this.baseRenderTarget);
503
+ this.renderer.clear();
504
+ this.renderer.render(this.scene, this.getCamera());
505
+ this.renderer.setRenderTarget(null);
506
+ this.renderer.clear();
507
+ this.renderRendererTarget(this.baseRenderTarget);
504
508
  const blob = await new Promise((resolve, reject) => {
505
509
  this.renderer.domElement.toBlob((blob) => {
506
510
  resolve(blob);
@@ -510,7 +514,12 @@ export default class ThreeBase extends EventDispatcher {
510
514
  }
511
515
  //获取渲染图base64
512
516
  getThumbBase64() {
513
- this.render();
517
+ this.renderer.setRenderTarget(this.baseRenderTarget);
518
+ this.renderer.clear();
519
+ this.renderer.render(this.scene, this.getCamera());
520
+ this.renderer.setRenderTarget(null);
521
+ this.renderer.clear();
522
+ this.renderRendererTarget(this.baseRenderTarget);
514
523
  const base64 = this.renderer.domElement.toDataURL("image/png");
515
524
  return base64;
516
525
  }
@@ -522,7 +531,6 @@ export default class ThreeBase extends EventDispatcher {
522
531
  }
523
532
  // 下载渲染图
524
533
  async download(fileName = "download") {
525
- this.render();
526
534
  const blob = await this.getThumbBlob();
527
535
  let saveLink = document.createElement("a");
528
536
  saveLink.download = `${fileName}.png`;
@@ -530,134 +538,17 @@ export default class ThreeBase extends EventDispatcher {
530
538
  document.body.append(saveLink);
531
539
  saveLink.click();
532
540
  }
533
- _preMesh = new Mesh();
534
- _preRT = new WebGLRenderTarget(128, 128, {
535
- minFilter: LinearFilter,
536
- magFilter: LinearFilter,
537
- format: RGBAFormat,
538
- });
539
- //预加载纹理图片
540
- async preloadTexture(src) {
541
- const texture = threeLoader.getTexture(src);
542
- while ((texture && !texture.image) ||
543
- !texture.image.complete) {
544
- await new Promise((resolve) => setTimeout(resolve, 50));
545
- }
546
- // 添加到计划任务中去
547
- threeUtils.addWork(() => {
548
- const originRenderTarget = this.renderer.getRenderTarget();
549
- this.renderer.setRenderTarget(this._preRT);
550
- this._preMesh.material.map = texture;
551
- this.renderer.render(this._preMesh, this.perspectiveCamera);
552
- this.renderer.setRenderTarget(originRenderTarget);
553
- });
554
- }
555
- //预加载网格
556
- async preloadGeometry(geometry) {
557
- // 添加到计划任务中去
558
- threeUtils.addWork(() => {
559
- const originRenderTarget = this.renderer.getRenderTarget();
560
- this.renderer.setRenderTarget(this._preRT);
561
- this._preMesh.geometry = geometry;
562
- this.renderer.render(this._preMesh, this.perspectiveCamera);
563
- this.renderer.setRenderTarget(originRenderTarget);
564
- });
565
- }
566
- // 清理渲染目标
567
- clearRendererTargte(rendererTarget) {
568
- const originTarget = this.renderer.getRenderTarget();
569
- this.renderer.setRenderTarget(rendererTarget);
570
- fullScreenMesh.material = clearShader;
571
- fullScreenMesh.render(this.renderer);
572
- this.renderer.clearDepth();
573
- this.renderer.setRenderTarget(originTarget);
574
- }
575
- // 拷贝纹理到渲染目标
576
- copyTextureToRenderTarget(texture, rendererTarget, alpha = false, opactity = 1) {
577
- const originTarget = this.renderer.getRenderTarget();
578
- if (rendererTarget) {
579
- this.renderer.getSize(this.tempVector2);
580
- rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
581
- }
582
- this.renderer.setRenderTarget(rendererTarget);
583
- fullScreenMesh.material = copyShader;
584
- copyShader.uniforms.map.value = texture;
585
- copyShader.uniforms.opacity.value = opactity;
586
- copyShader.blending = alpha ? NoBlending : NormalBlending;
587
- fullScreenMesh.render(this.renderer);
588
- this.renderer.setRenderTarget(originTarget);
589
- }
590
- // 把对象绘制到渲染目标中
591
- object3dToRendererTarget(obj, rendererTarget) {
592
- this.clearRendererTargte(rendererTarget);
593
- const originTarget = this.renderer.getRenderTarget();
594
- this.renderer.setRenderTarget(rendererTarget);
595
- this.renderer.getSize(this.tempVector2);
596
- rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
597
- this.renderer.render(obj, this.getCamera());
598
- this.renderer.setRenderTarget(originTarget);
599
- }
600
- // 给渲染目标的内容加描边
601
- rendererTagetAddStroke(rendererTarget, strockWidth, color, opacity) {
602
- const originTarget = this.renderer.getRenderTarget();
603
- this.clearRendererTargte(this.renderTarget2);
604
- this.renderer.setRenderTarget(this.renderTarget2);
605
- this.renderer.getSize(this.tempVector2);
606
- this.renderTarget2.setSize(this.tempVector2.x, this.tempVector2.y);
607
- fullScreenMesh.material = strokeShader;
608
- strokeShader.uniforms.map.value = rendererTarget.texture;
609
- strokeShader.uniforms.resolution.value.set(this.tempVector2.x, this.tempVector2.y);
610
- strokeShader.uniforms.strokeWidth.value = strockWidth;
611
- strokeShader.uniforms.strokeColor.value.set(color);
612
- strokeShader.uniforms.opacity.value = opacity;
613
- fullScreenMesh.render(this.renderer);
614
- this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
615
- this.renderer.setRenderTarget(originTarget);
616
- }
617
- // 渲染对象的描边
618
- renderObject3dStroke(obj, strockWidth, color, opacity) {
619
- this.object3dToRendererTarget(obj, this.renderTarget);
620
- this.rendererTagetAddStroke(this.renderTarget, strockWidth, color, opacity);
621
- this.copyTextureToRenderTarget(this.renderTarget.texture, null);
622
- }
623
- //给渲染目标加上高斯模糊计算
624
- renderTargetgaussBlur(rendererTarget, radius, opacity) {
625
- const originTarget = this.renderer.getRenderTarget();
626
- this.clearRendererTargte(this.renderTarget2);
627
- this.renderer.setRenderTarget(this.renderTarget2);
628
- this.renderer.getSize(this.tempVector2);
629
- this.renderTarget2.setSize(this.tempVector2.x, this.tempVector2.y);
630
- fullScreenMesh.material = gaussBlurShader;
631
- gaussBlurShader.uniforms.map.value = rendererTarget.texture;
632
- gaussBlurShader.uniforms.radius.value = radius;
633
- gaussBlurShader.uniforms.opacity.value = opacity;
634
- gaussBlurShader.uniforms.resolution.value.set(this.tempVector2.x, this.tempVector2.y);
635
- fullScreenMesh.render(this.renderer);
636
- this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
637
- this.renderer.setRenderTarget(originTarget);
638
- }
639
- // 渲染目标上的纹理添加辉光效果
640
- renderTargetAddGlow(renderTarget, width, color) {
641
- this.rendererTagetAddStroke(renderTarget, 1 * width, color, 0.3);
642
- this.rendererTagetAddStroke(renderTarget, 2 * width, color, 0.2);
643
- this.rendererTagetAddStroke(renderTarget, 3 * width, color, 0.05);
644
- this.renderTargetgaussBlur(renderTarget, 1, 1);
645
- this.renderTargetgaussBlur(renderTarget, 1, 1);
646
- this.renderTargetgaussBlur(renderTarget, 1, 1);
647
- }
648
- // 需要做抗锯齿处理 渲染 渲染目标
541
+ //把渲染目标渲染到canvas上
649
542
  renderRendererTarget(renderTarget) {
650
543
  baseTextureToRenderShader.uniforms.map.value = renderTarget.texture;
651
544
  baseTextureToRenderShader.uniforms.opacity.value = 1.0;
652
- fullScreenMesh.material = baseTextureToRenderShader;
653
- fullScreenMesh.render(this.renderer);
545
+ fullScreenMesh.render(this.renderer, baseTextureToRenderShader);
654
546
  }
655
547
  // 渲染纹理
656
548
  renderTexture(texture, alpha = false) {
657
549
  copyShader.uniforms.map.value = texture;
658
550
  copyShader.uniforms.opacity.value = 1.0;
659
- fullScreenMesh.material = copyShader;
660
551
  copyShader.blending = alpha ? NoBlending : NormalBlending;
661
- fullScreenMesh.render(this.renderer);
552
+ fullScreenMesh.render(this.renderer, copyShader);
662
553
  }
663
554
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-base",
3
- "version": "2.0.110",
3
+ "version": "2.0.112",
4
4
  "description": "three 3d three-base",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
package/shaders.d.ts CHANGED
@@ -1,12 +1,5 @@
1
- import { Mesh, OrthographicCamera, ShaderMaterial, WebGLRenderer } from "three";
2
- declare class FullScreenQuad {
3
- constructor();
4
- _mesh: Mesh;
5
- dispose(): void;
6
- render(renderer: WebGLRenderer): void;
7
- get material(): import("three").Material | import("three").Material[];
8
- set material(value: import("three").Material | import("three").Material[]);
9
- }
1
+ import { OrthographicCamera, ShaderMaterial } from "three";
2
+ import FullScreenQuad from "./pass/FullScreenQuad";
10
3
  export declare const fullScreenMesh: FullScreenQuad;
11
4
  export declare const orthographicCamera: OrthographicCamera;
12
5
  export declare const clearShader: ShaderMaterial;
@@ -15,4 +8,3 @@ export declare const copyShader: ShaderMaterial;
15
8
  export declare const baseTextureToRenderShader: ShaderMaterial;
16
9
  export declare const strokeShader: ShaderMaterial;
17
10
  export declare const gaussBlurShader: ShaderMaterial;
18
- export {};
package/shaders.js CHANGED
@@ -4,29 +4,8 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2022-04-02 18:28:38
6
6
  */
7
- import { BufferGeometry, Color, Float32BufferAttribute, Mesh, NoBlending, OrthographicCamera, ShaderChunk, ShaderMaterial, Vector2, } from "three";
8
- // https://github.com/mrdoob/three.js/pull/21358
9
- const _geometry = new BufferGeometry();
10
- _geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
11
- _geometry.setAttribute("uv", new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));
12
- class FullScreenQuad {
13
- constructor() {
14
- this._mesh = new Mesh(_geometry);
15
- }
16
- _mesh;
17
- dispose() {
18
- this._mesh.geometry.dispose();
19
- }
20
- render(renderer) {
21
- renderer.render(this._mesh, orthographicCamera);
22
- }
23
- get material() {
24
- return this._mesh.material;
25
- }
26
- set material(value) {
27
- this._mesh.material = value;
28
- }
29
- }
7
+ import { Color, NoBlending, OrthographicCamera, ShaderChunk, ShaderMaterial, Vector2 } from "three";
8
+ import FullScreenQuad from "./pass/FullScreenQuad";
30
9
  // 常用着色器及工具
31
10
  // 全屏渲染模型
32
11
  export const fullScreenMesh = new FullScreenQuad();
package/threeLoader.d.ts CHANGED
@@ -5,6 +5,7 @@ import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader";
5
5
  import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
6
6
  import { STLLoader } from "three/examples/jsm/loaders/STLLoader";
7
7
  import { USDZLoader } from "three/examples/jsm/loaders/USDZLoader";
8
+ import { PLYLoader } from "three/examples/jsm/Addons.js";
8
9
  declare class ThreeLoader extends EventDispatcher {
9
10
  constructor();
10
11
  getFilename(url: string): string;
@@ -20,6 +21,7 @@ declare class ThreeLoader extends EventDispatcher {
20
21
  fbxLoader: FBXLoader;
21
22
  objLoader: OBJLoader;
22
23
  stlLoader: STLLoader;
24
+ plyLoader: PLYLoader;
23
25
  mtlLoader: MTLLoader;
24
26
  gltfLoader: GLTFLoader;
25
27
  usdzLoader: USDZLoader;
package/threeLoader.js CHANGED
@@ -26,7 +26,7 @@ import { isArray, isEmpty, isNull, isString, isUndefined } from "lodash";
26
26
  import { generateUUID } from "three/src/math/MathUtils";
27
27
  import dracoDecoderWASM from "./lib/draco/draco_decoder.wasm?url";
28
28
  import threeUtils from "./threeUtils";
29
- import { TGALoader } from "three/examples/jsm/Addons.js";
29
+ import { PLYLoader, TGALoader } from "three/examples/jsm/Addons.js";
30
30
  DefaultLoadingManager.addHandler(/tga$/, new TGALoader());
31
31
  // 加载器
32
32
  class ThreeLoader extends EventDispatcher {
@@ -135,6 +135,8 @@ class ThreeLoader extends EventDispatcher {
135
135
  objLoader = new OBJLoader();
136
136
  // stl 加载器
137
137
  stlLoader = new STLLoader();
138
+ //ply加载器
139
+ plyLoader = new PLYLoader();
138
140
  // 材质加载器
139
141
  mtlLoader = new MTLLoader();
140
142
  // gltf 加载器
@@ -221,6 +223,7 @@ class ThreeLoader extends EventDispatcher {
221
223
  "fbx",
222
224
  "dae",
223
225
  "stl",
226
+ "ply",
224
227
  "usdz",
225
228
  ];
226
229
  for (let file of url) {
@@ -358,13 +361,18 @@ class ThreeLoader extends EventDispatcher {
358
361
  if (stl) {
359
362
  return await this.loadModel(stl);
360
363
  }
364
+ //如果有ply文件就加载ply文件
365
+ let ply = Object.keys(zip.files).find((filename) => /\.ply$/.test(filename));
366
+ if (ply) {
367
+ return await this.loadModel(ply);
368
+ }
361
369
  //如果有zip文件就加载zip文件
362
370
  let zipFile = Object.keys(zip.files).find((filename) => /\.zip$/.test(filename));
363
371
  if (zipFile) {
364
372
  return await this.loadModel(zipFile);
365
373
  }
366
- if ([obj, gltf, dae, fbx, usdz, stl].every((v) => !v)) {
367
- throw new Error(`${url}压缩包里没有obj.glb.gltf.dae.fbx.usde.stl等模型文件`);
374
+ if ([obj, gltf, dae, fbx, usdz, stl, ply].every((v) => !v)) {
375
+ throw new Error(`${url}压缩包里没有obj.glb.gltf.dae.fbx.usde.stl,ply模型文件`);
368
376
  }
369
377
  });
370
378
  case "fbx":
@@ -411,6 +419,42 @@ class ThreeLoader extends EventDispatcher {
411
419
  .catch(() => {
412
420
  console.log(`${url},加载失败`);
413
421
  });
422
+ case "ply":
423
+ return await threeLoader.plyLoader
424
+ .loadAsync(modelurl)
425
+ .then(async (geometry) => {
426
+ revokeObjectfile.map((filename) => {
427
+ URL.revokeObjectURL(this._blobs[filename]);
428
+ delete this._blobs[filename];
429
+ });
430
+ // 没有法线就创建法线
431
+ if (!geometry.getAttribute("normal")) {
432
+ geometry.computeVertexNormals();
433
+ }
434
+ //是否需要绕x轴旋转
435
+ const plyNeedRotationX = await new Promise(async (resolve) => {
436
+ // 读取文件内容
437
+ const res = await axios.get(modelurl);
438
+ debugger;
439
+ // if (res.match(/\b(Blender|binary_little_endian)\b/)) {
440
+ // resolve(true);
441
+ // } else {
442
+ // resolve(false);
443
+ // }
444
+ });
445
+ const plyMesh = new Mesh(geometry, new MeshStandardMaterial({
446
+ metalness: 0.5,
447
+ roughness: 0.5,
448
+ vertexColors: Boolean(geometry.getAttribute("color")),
449
+ }));
450
+ if (plyNeedRotationX) {
451
+ plyMesh.rotation.x = -Math.PI / 2;
452
+ }
453
+ return plyMesh;
454
+ })
455
+ .catch(() => {
456
+ console.log(`${url},加载失败`);
457
+ });
414
458
  case "usdz":
415
459
  return await threeLoader.usdzLoader
416
460
  .loadAsync(modelurl)