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 +0 -0
- package/Ground1/floorMap1.png +0 -0
- package/Ground1/floorMap3.png +0 -0
- package/PlaneModal1/planeModal.png +0 -0
- package/Sky/skyMap.png +0 -0
- package/SpriteModal1/spriteModal1.png +0 -0
- package/ThreeBase.d.ts +1 -12
- package/ThreeBase.js +20 -129
- package/package.json +1 -1
- package/shaders.d.ts +2 -10
- package/shaders.js +2 -23
- package/threeLoader.d.ts +2 -0
- package/threeLoader.js +47 -3
package/Grass/grass.jpg
CHANGED
|
Binary file
|
package/Ground1/floorMap1.png
CHANGED
|
Binary file
|
package/Ground1/floorMap3.png
CHANGED
|
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,
|
|
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,
|
|
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,
|
|
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: "
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
package/shaders.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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 {
|
|
8
|
-
|
|
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)
|