three-base 2.0.26 → 2.0.27

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/MeshBase.d.ts CHANGED
@@ -1,4 +1,19 @@
1
- import { Group } from "three";
1
+ import { Group, Mesh, Object3D, Vector3 } from "three";
2
2
  export default class MeshBase extends Group {
3
- constructor();
3
+ constructor(url?: string);
4
+ static models: Map<string, Object3D>;
5
+ static loadModeling: Map<string, boolean>;
6
+ loaded: boolean;
7
+ loadModel(url: string): Promise<void>;
8
+ frustumCulled: boolean;
9
+ castShadow: boolean;
10
+ receiveShadow: boolean;
11
+ traverseMesh(callback: (mesh: Mesh) => void): Promise<void>;
12
+ updateMatrix(): void;
13
+ applyAllTranstion(): void;
14
+ getSize(): Vector3;
15
+ center(): void;
16
+ alignBottom(y?: number): void;
17
+ scaleTo(size?: number, key?: Array<"x" | "y" | "z">): void;
18
+ expandBynormal(length: number): void;
4
19
  }
package/MeshBase.js CHANGED
@@ -1,13 +1,155 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2024-01-29 10:08:40
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2024-02-05 09:40:17
6
- */
7
- import { Group } from "three";
8
- // 基础模型加载对象
1
+ import { DoubleSide, Group, Object3D, Vector3 } from "three";
2
+ import threeUtils from "./threeUtils";
3
+ import threeLoader from "./threeLoader";
4
+ // 模型基类
9
5
  export default class MeshBase extends Group {
10
- constructor() {
6
+ constructor(url) {
11
7
  super();
8
+ url && this.loadModel(url);
9
+ }
10
+ // 模型对象
11
+ static models = new Map();
12
+ // 模型是否在加载中
13
+ static loadModeling = new Map();
14
+ // 加载完成
15
+ loaded = false;
16
+ async loadModel(url) {
17
+ if (!url) {
18
+ this.clear();
19
+ return;
20
+ }
21
+ this.loaded = false;
22
+ // 没有模型并且没有加载任务时就去加载模型
23
+ if (!MeshBase.models.get(url) && !MeshBase.loadModeling.get(url)) {
24
+ MeshBase.loadModeling.set(url, true);
25
+ let modal = new Object3D();
26
+ if (/\.fbx$/i.test(url)) {
27
+ await threeLoader.fbxLoader.loadAsync(url).then(res => {
28
+ modal = res;
29
+ }).catch(() => {
30
+ console.error(`${url},加载失败`);
31
+ });
32
+ }
33
+ else if (/\.(gltf|glb)$/i.test(url)) {
34
+ await threeLoader.gltfLoader.loadAsync(url).then(res => {
35
+ modal = res.scene;
36
+ }).catch(() => {
37
+ console.error(`${url},加载失败`);
38
+ });
39
+ }
40
+ else {
41
+ console.error(`${url},不支持的格式`);
42
+ }
43
+ threeUtils.center(modal);
44
+ threeUtils.alignBottom(modal);
45
+ modal.updateMatrixWorld(true);
46
+ // 应用全部变换
47
+ modal.traverse(obj => {
48
+ const mesh = obj;
49
+ mesh.position.set(0, 0, 0);
50
+ mesh.rotation.set(0, 0, 0);
51
+ mesh.scale.set(1, 1, 1);
52
+ if (mesh.isMesh) {
53
+ mesh.geometry.applyMatrix4(mesh.matrixWorld);
54
+ mesh.material.side = DoubleSide;
55
+ }
56
+ });
57
+ MeshBase.models.set(url, modal);
58
+ MeshBase.loadModeling.set(url, false);
59
+ }
60
+ // 如果模型还在加载中, 就等待模型加载完成
61
+ do {
62
+ await new Promise(resolve => setTimeout(resolve, 200));
63
+ } while (MeshBase.loadModeling.get(url));
64
+ if (MeshBase.models.get(url)) {
65
+ const mesh = MeshBase.models.get(url).clone();
66
+ this.clear();
67
+ this.add(mesh);
68
+ this.applyAllTranstion();
69
+ }
70
+ await new Promise(resolve => requestAnimationFrame(resolve));
71
+ // 加载完成事件
72
+ this.dispatchEvent({ type: "loaded" });
73
+ this.loaded = true;
74
+ }
75
+ // 超出绘制区域时不绘制
76
+ frustumCulled = false;
77
+ // 创建阴影
78
+ castShadow = false;
79
+ // 接受阴影
80
+ receiveShadow = false;
81
+ //遍历模型
82
+ async traverseMesh(callback) {
83
+ while (!this.loaded) {
84
+ await new Promise(resolve => setTimeout(resolve, 100));
85
+ }
86
+ this.traverse(obj => {
87
+ const mesh = obj;
88
+ if (mesh.isMesh) {
89
+ callback(mesh);
90
+ }
91
+ });
92
+ }
93
+ updateMatrix() {
94
+ // 深度应用属性
95
+ this.traverse(obj => {
96
+ const mesh = obj;
97
+ if (mesh.isMesh) {
98
+ mesh.frustumCulled = this.frustumCulled;
99
+ mesh.castShadow = this.castShadow;
100
+ mesh.receiveShadow = this.receiveShadow;
101
+ }
102
+ });
103
+ super.updateMatrix();
104
+ }
105
+ // 应用全部变化
106
+ applyAllTranstion() {
107
+ this.updateMatrixWorld(true);
108
+ // 应用全部变换
109
+ this.traverse(obj => {
110
+ const mesh = obj;
111
+ mesh.position.set(0, 0, 0);
112
+ mesh.rotation.set(0, 0, 0);
113
+ mesh.scale.set(1, 1, 1);
114
+ if (mesh.isMesh) {
115
+ mesh.geometry.applyMatrix4(mesh.matrixWorld);
116
+ mesh.material.side = DoubleSide;
117
+ }
118
+ });
119
+ }
120
+ // 获取模型的尺寸
121
+ getSize() {
122
+ return threeUtils.getSize(this);
123
+ }
124
+ // 居中
125
+ center() {
126
+ threeUtils.center(this);
127
+ }
128
+ //底对齐
129
+ alignBottom(y = 0) {
130
+ threeUtils.alignBottom(this, y);
131
+ }
132
+ // 放大到指定尺寸
133
+ scaleTo(size = 1, key = ["x", "y", "z"]) {
134
+ threeUtils.scaleTo(this, size, key);
135
+ }
136
+ //按照法线拓展
137
+ expandBynormal(length) {
138
+ this.traverseMesh(mesh => {
139
+ // 没有法线就计算法线
140
+ mesh.geometry = mesh.geometry.clone();
141
+ if (!mesh.geometry.getAttribute("normal")) {
142
+ mesh.geometry.computeVertexNormals();
143
+ }
144
+ const normal = mesh.geometry.getAttribute("normal");
145
+ const position = mesh.geometry.getAttribute("position");
146
+ const v3 = new Vector3(0, 0, 0);
147
+ for (let i = 0; i < position.count; i++) {
148
+ v3.set(normal.getX(i), normal.getY(i), normal.getZ(i));
149
+ v3.setLength(length);
150
+ position.setXYZ(i, position.getX(i) + v3.x, position.getY(i) + v3.y, position.getZ(i) + v3.z);
151
+ }
152
+ position.needsUpdate = true;
153
+ });
12
154
  }
13
155
  }
package/MeshBase.ts CHANGED
@@ -1,19 +1,189 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2024-01-29 10:08:40
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2024-02-05 09:40:17
6
- */
7
1
 
8
- import { Group } from "three";
2
+ import { DoubleSide, Group, Mesh, MeshStandardMaterial, Object3D, Vector3 } from "three";
3
+ import threeUtils from "./threeUtils";
4
+ import threeLoader from "./threeLoader";
9
5
 
10
- // 基础模型加载对象
6
+ // 模型基类
11
7
  export default class MeshBase extends Group {
12
-
13
- constructor() {
8
+ constructor(url?: string) {
14
9
  super();
10
+ url && this.loadModel(url);
15
11
  }
16
12
 
13
+ // 模型对象
14
+ static models: Map<string, Object3D> = new Map();
15
+
16
+ // 模型是否在加载中
17
+ static loadModeling: Map<string, boolean> = new Map();
18
+
19
+ // 加载完成
20
+ loaded = false;
21
+
22
+ async loadModel(url: string) {
23
+ if (!url) {
24
+ this.clear();
25
+ return;
26
+ }
27
+
28
+ this.loaded = false;
29
+
30
+ // 没有模型并且没有加载任务时就去加载模型
31
+ if (!MeshBase.models.get(url) && !MeshBase.loadModeling.get(url)) {
32
+ MeshBase.loadModeling.set(url, true);
33
+
34
+ let modal = new Object3D();
35
+
36
+ if (/\.fbx$/i.test(url)) {
37
+ await threeLoader.fbxLoader.loadAsync(url).then(res => {
38
+ modal = res;
39
+ }).catch(() => {
40
+ console.error(`${url},加载失败`);
41
+ })
42
+ } else if (/\.(gltf|glb)$/i.test(url)) {
43
+ await threeLoader.gltfLoader.loadAsync(url).then(res => {
44
+ modal = res.scene;
45
+ }).catch(() => {
46
+ console.error(`${url},加载失败`);
47
+ })
48
+ } else {
49
+ console.error(`${url},不支持的格式`);
50
+ }
51
+
52
+ threeUtils.center(modal);
53
+ threeUtils.alignBottom(modal);
54
+ modal.updateMatrixWorld(true);
55
+
56
+ // 应用全部变换
57
+ modal.traverse(obj => {
58
+ const mesh = obj as Mesh;
59
+ mesh.position.set(0, 0, 0);
60
+ mesh.rotation.set(0, 0, 0);
61
+ mesh.scale.set(1, 1, 1);
62
+ if (mesh.isMesh) {
63
+ mesh.geometry.applyMatrix4(mesh.matrixWorld);
64
+ (mesh.material as MeshStandardMaterial).side = DoubleSide;
65
+ }
66
+ });
67
+
68
+ MeshBase.models.set(url, modal);
69
+ MeshBase.loadModeling.set(url, false);
70
+ }
71
+
72
+ // 如果模型还在加载中, 就等待模型加载完成
73
+ do {
74
+ await new Promise(resolve => setTimeout(resolve, 200));
75
+ } while (MeshBase.loadModeling.get(url));
76
+
77
+ if (MeshBase.models.get(url)) {
78
+ const mesh = MeshBase.models.get(url)!.clone();
79
+ this.clear();
80
+ this.add(mesh);
81
+ this.applyAllTranstion();
82
+ }
83
+
84
+ await new Promise(resolve => requestAnimationFrame(resolve));
85
+
86
+ // 加载完成事件
87
+ this.dispatchEvent({ type: "loaded" } as never);
88
+
89
+ this.loaded = true;
90
+ }
91
+
92
+ // 超出绘制区域时不绘制
93
+ frustumCulled = false;
94
+
95
+ // 创建阴影
96
+ castShadow: boolean = false;
97
+
98
+ // 接受阴影
99
+ receiveShadow: boolean = false;
100
+
101
+ //遍历模型
102
+ async traverseMesh(callback: (mesh: Mesh) => void) {
17
103
 
104
+ while (!this.loaded) {
105
+ await new Promise(resolve => setTimeout(resolve, 100));
106
+ }
107
+
108
+ this.traverse(obj => {
109
+ const mesh = obj as Mesh;
110
+ if (mesh.isMesh) {
111
+ callback(mesh);
112
+ }
113
+ });
114
+ }
115
+
116
+ updateMatrix(): void {
117
+
118
+ // 深度应用属性
119
+ this.traverse(obj => {
120
+ const mesh = obj as Mesh;
121
+ if (mesh.isMesh) {
122
+ mesh.frustumCulled = this.frustumCulled;
123
+ mesh.castShadow = this.castShadow;
124
+ mesh.receiveShadow = this.receiveShadow;
125
+ }
126
+ });
127
+
128
+ super.updateMatrix();
129
+ }
130
+
131
+ // 应用全部变化
132
+ applyAllTranstion() {
133
+ this.updateMatrixWorld(true);
134
+ // 应用全部变换
135
+ this.traverse(obj => {
136
+ const mesh = obj as Mesh;
137
+ mesh.position.set(0, 0, 0);
138
+ mesh.rotation.set(0, 0, 0);
139
+ mesh.scale.set(1, 1, 1);
140
+ if (mesh.isMesh) {
141
+ mesh.geometry.applyMatrix4(mesh.matrixWorld);
142
+ (mesh.material as MeshStandardMaterial).side = DoubleSide;
143
+ }
144
+ });
145
+ }
146
+
147
+ // 获取模型的尺寸
148
+ getSize() {
149
+ return threeUtils.getSize(this);
150
+ }
151
+
152
+ // 居中
153
+ center() {
154
+ threeUtils.center(this);
155
+ }
156
+
157
+ //底对齐
158
+ alignBottom(y: number = 0) {
159
+ threeUtils.alignBottom(this, y);
160
+ }
161
+
162
+ // 放大到指定尺寸
163
+ scaleTo(size: number = 1, key: Array<"x" | "y" | "z"> = ["x", "y", "z"]) {
164
+ threeUtils.scaleTo(this, size, key);
165
+ }
166
+
167
+ //按照法线拓展
168
+ expandBynormal(length: number) {
169
+ this.traverseMesh(mesh => {
170
+ // 没有法线就计算法线
171
+ mesh.geometry = mesh.geometry.clone();
172
+ if (!mesh.geometry.getAttribute("normal")) {
173
+ mesh.geometry.computeVertexNormals();
174
+ }
175
+
176
+ const normal = mesh.geometry.getAttribute("normal");
177
+ const position = mesh.geometry.getAttribute("position");
178
+ const v3 = new Vector3(0, 0, 0);
179
+ for (let i = 0; i < position.count; i++) {
180
+ v3.set(normal.getX(i), normal.getY(i), normal.getZ(i));
181
+ v3.setLength(length);
182
+ position.setXYZ(i, position.getX(i) + v3.x, position.getY(i) + v3.y, position.getZ(i) + v3.z);
183
+ }
184
+ position.needsUpdate = true;
185
+
186
+ })
187
+ }
18
188
 
19
189
  }
package/PlaneText.d.ts CHANGED
@@ -22,15 +22,15 @@ export default class PlaneText extends Mesh {
22
22
  spriteText: SpriteText;
23
23
  material: MeshBasicMaterial;
24
24
  set(parame: Props): void;
25
- get(prop: keyof SpriteText): string | number | boolean | Vector3 | import("three").Object3D<import("three").Object3DEventMap> | import("three").BufferGeometry<import("three").NormalBufferAttributes> | ((force?: boolean) => void) | import("three").Object3D<import("three").Object3DEventMap>[] | HTMLCanvasElement | import("three").Vector2 | import("three").Material | Record<string, any> | import("three").Matrix4 | import("three").Quaternion | (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | import("three").Euler | import("three").Matrix3 | import("three").Layers | import("three").AnimationClip[] | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((matrix: import("three").Matrix4) => void) | ((axis: Vector3, angle: number) => void) | ((euler: import("three").Euler) => void) | ((m: import("three").Matrix4) => void) | ((q: import("three").Quaternion) => void) | ((vector: Vector3) => Vector3) | ((vector: Vector3) => Vector3) | {
25
+ get(prop: keyof SpriteText): string | number | boolean | Vector3 | import("three").Object3D<import("three").Object3DEventMap> | import("three").BufferGeometry<import("three").NormalBufferAttributes> | ((force?: boolean) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | import("three").Object3D<import("three").Object3DEventMap>[] | import("three").Euler | import("three").Material | import("three").Quaternion | import("three").Matrix4 | import("three").Matrix3 | import("three").Layers | import("three").AnimationClip[] | Record<string, any> | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((matrix: import("three").Matrix4) => void) | ((axis: Vector3, angle: number) => void) | ((euler: import("three").Euler) => void) | ((m: import("three").Matrix4) => void) | ((q: import("three").Quaternion) => void) | ((vector: Vector3) => Vector3) | ((vector: Vector3) => Vector3) | {
26
26
  (vector: Vector3): void;
27
27
  (x: number, y: number, z: number): void;
28
- } | ((id: number) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any, optionalTarget?: import("three").Object3D<import("three").Object3DEventMap>[]) => import("three").Object3D<import("three").Object3DEventMap>[]) | ((target: Vector3) => Vector3) | ((target: import("three").Quaternion) => import("three").Quaternion) | ((target: Vector3) => Vector3) | ((target: Vector3) => Vector3) | ((raycaster: import("three").Raycaster, intersects: import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>>[]) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | (() => void) | ((updateParents: boolean, updateChildren: boolean) => void) | ((meta?: {
28
+ } | ((id: number) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any, optionalTarget?: import("three").Object3D<import("three").Object3DEventMap>[]) => import("three").Object3D<import("three").Object3DEventMap>[]) | ((target: Vector3) => Vector3) | ((target: import("three").Quaternion) => import("three").Quaternion) | ((target: Vector3) => Vector3) | ((target: Vector3) => Vector3) | ((raycaster: import("three").Raycaster, intersects: import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>>[]) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | (() => void) | ((updateParents: boolean, updateChildren: boolean) => void) | ((meta?: {
29
29
  geometries: any;
30
30
  materials: any;
31
31
  textures: any;
32
32
  images: any;
33
- }) => any) | import("three").SpriteMaterial | ((source: SpriteText, recursive?: boolean) => SpriteText) | (() => void) | ((quaternion: import("three").Quaternion) => SpriteText) | ((axis: Vector3, angle: number) => SpriteText) | ((axis: Vector3, angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((axis: Vector3, distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((...object: import("three").Object3D<import("three").Object3DEventMap>[]) => SpriteText) | ((...object: import("three").Object3D<import("three").Object3DEventMap>[]) => SpriteText) | (() => SpriteText) | (() => SpriteText) | ((object: import("three").Object3D<import("three").Object3DEventMap>) => SpriteText) | ((recursive?: boolean) => SpriteText) | {
33
+ }) => any) | (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | HTMLCanvasElement | import("three").Vector2 | import("three").SpriteMaterial | ((source: SpriteText, recursive?: boolean) => SpriteText) | (() => void) | ((quaternion: import("three").Quaternion) => SpriteText) | ((axis: Vector3, angle: number) => SpriteText) | ((axis: Vector3, angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((angle: number) => SpriteText) | ((axis: Vector3, distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((distance: number) => SpriteText) | ((...object: import("three").Object3D<import("three").Object3DEventMap>[]) => SpriteText) | ((...object: import("three").Object3D<import("three").Object3DEventMap>[]) => SpriteText) | (() => SpriteText) | (() => SpriteText) | ((object: import("three").Object3D<import("three").Object3DEventMap>) => SpriteText) | ((recursive?: boolean) => SpriteText) | {
34
34
  <T_1 extends keyof import("three").Object3DEventMap>(type: T_1, listener: import("three").EventListener<import("three").Object3DEventMap[T_1], T_1, SpriteText>): void;
35
35
  <T_2 extends string>(type: T_2, listener: import("three").EventListener<{}, T_2, SpriteText>): void;
36
36
  } | {
package/ThreeBase.js CHANGED
@@ -294,9 +294,7 @@ export default class ThreeBase extends EventDispatcher {
294
294
  }
295
295
  // 渲染场景
296
296
  render() {
297
- // 控制器在移动时鼠标不能操作
298
- // this.renderer.domElement.style.pointerEvents = (!this.controlsPosition.isDone() || !this.controlsCenter.isDone()) ? "none" : "all";
299
- // canvas 没有在页面上面的话 就跳过渲染
297
+ // canvas 没有在页面上面的话 就停止渲染
300
298
  if (!threeUtils.inDocument(this.renderer.domElement)) {
301
299
  this.stopRender();
302
300
  return;
package/ThreeBase.ts CHANGED
@@ -363,10 +363,7 @@ export default class ThreeBase extends EventDispatcher {
363
363
 
364
364
  // 渲染场景
365
365
  render() {
366
- // 控制器在移动时鼠标不能操作
367
- // this.renderer.domElement.style.pointerEvents = (!this.controlsPosition.isDone() || !this.controlsCenter.isDone()) ? "none" : "all";
368
-
369
- // canvas 没有在页面上面的话 就跳过渲染
366
+ // canvas 没有在页面上面的话 就停止渲染
370
367
  if (!threeUtils.inDocument(this.renderer.domElement)) {
371
368
  this.stopRender();
372
369
  return;
package/ThreeMouse.js CHANGED
@@ -232,7 +232,7 @@ export default class ThreeMouse {
232
232
  return;
233
233
  }
234
234
  this._mesh_on = intersection.object;
235
- if (this.hasEvent(this._mesh_Down, ["mouseup"])) {
235
+ if (this.hasEvent(this._mesh_on, ["mouseup"])) {
236
236
  this._mesh_on.dispatchEvent({
237
237
  ...intersection,
238
238
  renderer: this._renderer,
package/ThreeMouse.ts CHANGED
@@ -312,7 +312,7 @@ export default class ThreeMouse {
312
312
 
313
313
  this._mesh_on = intersection.object as Object3D;
314
314
 
315
- if (this.hasEvent(this._mesh_Down, ["mouseup"])) {
315
+ if (this.hasEvent(this._mesh_on, ["mouseup"])) {
316
316
 
317
317
  this._mesh_on.dispatchEvent({
318
318
  ...intersection,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-base",
3
- "version": "2.0.26",
3
+ "version": "2.0.27",
4
4
  "description": "three 3d three-base",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
package/threeUtils.d.ts CHANGED
@@ -36,6 +36,7 @@ declare class ThreeUtils extends EventDispatcher {
36
36
  centerObject3D(object3d: Object3D | BufferGeometry): void;
37
37
  center(object3d: Object3D | BufferGeometry): void;
38
38
  scaleTo(object3d: Object3D | BufferGeometry, size?: number, key?: Array<"x" | "y" | "z">): void;
39
+ applyAllTranstion(object3d: Object3D): void;
39
40
  exportGLB(input: Object3D, fileName?: string): void;
40
41
  getVolume(geometry: BufferGeometry): number;
41
42
  signedVolumeOfTriangle(p1: Vector3, p2: Vector3, p3: Vector3): number;
package/threeUtils.js CHANGED
@@ -173,6 +173,19 @@ class ThreeUtils extends EventDispatcher {
173
173
  object3d.scale(scale, scale, scale);
174
174
  }
175
175
  }
176
+ // 应用全部变化
177
+ applyAllTranstion(object3d) {
178
+ object3d.updateMatrixWorld(true);
179
+ // 应用全部变换
180
+ object3d.traverse(obj => {
181
+ obj.position.set(0, 0, 0);
182
+ obj.rotation.set(0, 0, 0);
183
+ obj.scale.set(1, 1, 1);
184
+ if (obj.isMesh) {
185
+ obj.geometry.applyMatrix4(obj.matrixWorld);
186
+ }
187
+ });
188
+ }
176
189
  // 导出 glb
177
190
  exportGLB(input, fileName = "threeUtils.exportGLB") {
178
191
  const gltfExporter = new GLTFExporter();
package/threeUtils.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * @Last Modified time: 2023-05-03 00:36:18
6
6
  */
7
7
 
8
- import { Box3, BufferAttribute, BufferGeometry, Clock, EventDispatcher, Object3D, Vector3 } from "three";
8
+ import { Box3, BufferAttribute, BufferGeometry, Clock, EventDispatcher, Mesh, MeshStandardMaterial, Object3D, Vector3 } from "three";
9
9
  import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';
10
10
 
11
11
  class ThreeUtils extends EventDispatcher {
@@ -200,6 +200,20 @@ class ThreeUtils extends EventDispatcher {
200
200
  }
201
201
  }
202
202
 
203
+ // 应用全部变化
204
+ applyAllTranstion(object3d: Object3D) {
205
+ object3d.updateMatrixWorld(true);
206
+ // 应用全部变换
207
+ object3d.traverse(obj => {
208
+ obj.position.set(0, 0, 0);
209
+ obj.rotation.set(0, 0, 0);
210
+ obj.scale.set(1, 1, 1);
211
+ if ((obj as Mesh).isMesh) {
212
+ (obj as Mesh).geometry.applyMatrix4(obj.matrixWorld);
213
+ }
214
+ });
215
+ }
216
+
203
217
  // 导出 glb
204
218
  exportGLB(input: Object3D, fileName: string = "threeUtils.exportGLB") {
205
219
  const gltfExporter = new GLTFExporter();