three-base 2.0.15 → 2.0.17
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/ThreeBase.js +3 -3
- package/ThreeBase.ts +5 -5
- package/package.json +1 -1
- package/pass/stroke_pass.js +11 -10
- package/pass/stroke_pass.ts +12 -11
- package/threeLoader.js +4 -4
- package/threeLoader.ts +3 -3
- package/threeUtils.js +12 -12
- package/threeUtils.ts +30 -30
package/ThreeBase.js
CHANGED
|
@@ -106,6 +106,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
106
106
|
div.append(this.renderer.domElement);
|
|
107
107
|
// 如果上下文被销毁了, 就恢复上下文
|
|
108
108
|
if (this.isRendererContextLost) {
|
|
109
|
+
this.isRendererContextLost = false;
|
|
109
110
|
this.renderer.forceContextRestore();
|
|
110
111
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
111
112
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
@@ -119,7 +120,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
119
120
|
}
|
|
120
121
|
// 修改尺寸
|
|
121
122
|
setSize(width, height) {
|
|
122
|
-
if (this.camera
|
|
123
|
+
if (this.camera.type == 'PerspectiveCamera') {
|
|
123
124
|
this.camera.aspect = width / height;
|
|
124
125
|
this.camera.updateProjectionMatrix();
|
|
125
126
|
}
|
|
@@ -295,8 +296,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
295
296
|
this.renderer.render(this.scene, this.camera);
|
|
296
297
|
this.renderer.setRenderTarget(null);
|
|
297
298
|
this.renderer.clear();
|
|
298
|
-
this.
|
|
299
|
-
// this.renderer.render(this.scene, this.camera);
|
|
299
|
+
this.renderer.render(this.scene, this.camera);
|
|
300
300
|
// 查找需要绘制描边的对象,并且绘制描边
|
|
301
301
|
this.scene.traverse(obj => {
|
|
302
302
|
stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
|
package/ThreeBase.ts
CHANGED
|
@@ -125,6 +125,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
125
125
|
|
|
126
126
|
// 如果上下文被销毁了, 就恢复上下文
|
|
127
127
|
if (this.isRendererContextLost) {
|
|
128
|
+
this.isRendererContextLost = false;
|
|
128
129
|
this.renderer.forceContextRestore();
|
|
129
130
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
130
131
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
@@ -141,9 +142,9 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
141
142
|
|
|
142
143
|
// 修改尺寸
|
|
143
144
|
setSize(width: number, height: number) {
|
|
144
|
-
if (this.camera
|
|
145
|
-
this.camera.aspect = width / height;
|
|
146
|
-
this.camera.updateProjectionMatrix();
|
|
145
|
+
if ((this.camera as PerspectiveCamera).type == 'PerspectiveCamera') {
|
|
146
|
+
(this.camera as PerspectiveCamera).aspect = width / height;
|
|
147
|
+
(this.camera as PerspectiveCamera).updateProjectionMatrix();
|
|
147
148
|
}
|
|
148
149
|
|
|
149
150
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
@@ -354,8 +355,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
354
355
|
|
|
355
356
|
this.renderer.setRenderTarget(null);
|
|
356
357
|
this.renderer.clear();
|
|
357
|
-
this.
|
|
358
|
-
// this.renderer.render(this.scene, this.camera);
|
|
358
|
+
this.renderer.render(this.scene, this.camera);
|
|
359
359
|
|
|
360
360
|
// 查找需要绘制描边的对象,并且绘制描边
|
|
361
361
|
this.scene.traverse(obj => {
|
package/package.json
CHANGED
package/pass/stroke_pass.js
CHANGED
|
@@ -371,7 +371,6 @@ const blurShader = new RawShaderMaterial({
|
|
|
371
371
|
vec4 stroke(){
|
|
372
372
|
vec4 blurColor = vec4(0.0);
|
|
373
373
|
vec4 Color = vec4(0.0);
|
|
374
|
-
int vSum = 0; // 周围像素点中和 visibleColor 相似的数量
|
|
375
374
|
for (int i = 0; i < 24; i++ ) {
|
|
376
375
|
Color = texture2D(tDiffuse, vUv + (offset[i] * piexl));
|
|
377
376
|
if (Color.a > 0.0) {
|
|
@@ -485,7 +484,7 @@ export default function stroke_pass(renderer, camera, object3d, baseDepthTexture
|
|
|
485
484
|
FXAAShaderMaterial.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
|
|
486
485
|
//描边颜色
|
|
487
486
|
blurShader.uniforms.color.value.set(stroke_color);
|
|
488
|
-
blurShader.uniforms.width.value =
|
|
487
|
+
blurShader.uniforms.width.value = 1;
|
|
489
488
|
//深度测试
|
|
490
489
|
renderer.setRenderTarget(selectDethpTestTextureTarget);
|
|
491
490
|
renderer.clear();
|
|
@@ -501,14 +500,16 @@ export default function stroke_pass(renderer, camera, object3d, baseDepthTexture
|
|
|
501
500
|
renderer.setRenderTarget(blur2TextureTarget);
|
|
502
501
|
blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
503
502
|
fsQuad.render(renderer, blurShader);
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
503
|
+
for (let i = 0; i < stroke_width - 2; i++) {
|
|
504
|
+
//一次描边
|
|
505
|
+
renderer.setRenderTarget(blur1TextureTarget);
|
|
506
|
+
blurShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
|
507
|
+
fsQuad.render(renderer, blurShader);
|
|
508
|
+
//二次描边
|
|
509
|
+
renderer.setRenderTarget(blur2TextureTarget);
|
|
510
|
+
blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
511
|
+
fsQuad.render(renderer, blurShader);
|
|
512
|
+
}
|
|
512
513
|
//最后抗锯齿
|
|
513
514
|
renderer.setRenderTarget(blur1TextureTarget);
|
|
514
515
|
FXAAShaderMaterial.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
package/pass/stroke_pass.ts
CHANGED
|
@@ -383,7 +383,6 @@ const blurShader = new RawShaderMaterial({
|
|
|
383
383
|
vec4 stroke(){
|
|
384
384
|
vec4 blurColor = vec4(0.0);
|
|
385
385
|
vec4 Color = vec4(0.0);
|
|
386
|
-
int vSum = 0; // 周围像素点中和 visibleColor 相似的数量
|
|
387
386
|
for (int i = 0; i < 24; i++ ) {
|
|
388
387
|
Color = texture2D(tDiffuse, vUv + (offset[i] * piexl));
|
|
389
388
|
if (Color.a > 0.0) {
|
|
@@ -505,7 +504,7 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
|
|
|
505
504
|
FXAAShaderMaterial.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
|
|
506
505
|
//描边颜色
|
|
507
506
|
blurShader.uniforms.color.value.set(stroke_color);
|
|
508
|
-
blurShader.uniforms.width.value =
|
|
507
|
+
blurShader.uniforms.width.value = 1;
|
|
509
508
|
|
|
510
509
|
|
|
511
510
|
//深度测试
|
|
@@ -516,7 +515,6 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
|
|
|
516
515
|
depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
|
|
517
516
|
fsQuad.render(renderer, depthTestShader);
|
|
518
517
|
|
|
519
|
-
|
|
520
518
|
//一次描边
|
|
521
519
|
renderer.setRenderTarget(blur1TextureTarget);
|
|
522
520
|
blurShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
|
|
@@ -527,15 +525,18 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
|
|
|
527
525
|
blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
528
526
|
fsQuad.render(renderer, blurShader);
|
|
529
527
|
|
|
530
|
-
//三次描边
|
|
531
|
-
renderer.setRenderTarget(blur1TextureTarget);
|
|
532
|
-
blurShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
|
533
|
-
fsQuad.render(renderer, blurShader);
|
|
534
528
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
529
|
+
for (let i = 0; i < stroke_width - 2; i++) {
|
|
530
|
+
//一次描边
|
|
531
|
+
renderer.setRenderTarget(blur1TextureTarget);
|
|
532
|
+
blurShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
|
533
|
+
fsQuad.render(renderer, blurShader);
|
|
534
|
+
|
|
535
|
+
//二次描边
|
|
536
|
+
renderer.setRenderTarget(blur2TextureTarget);
|
|
537
|
+
blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
538
|
+
fsQuad.render(renderer, blurShader);
|
|
539
|
+
}
|
|
539
540
|
|
|
540
541
|
//最后抗锯齿
|
|
541
542
|
renderer.setRenderTarget(blur1TextureTarget);
|
package/threeLoader.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Last Modified by: xiaosihan
|
|
5
5
|
* @Last Modified time: 2023-02-07 11:11:48
|
|
6
6
|
*/
|
|
7
|
-
import { CanvasTexture, DefaultLoadingManager, EventDispatcher, RepeatWrapping,
|
|
7
|
+
import { CanvasTexture, DefaultLoadingManager, EventDispatcher, RepeatWrapping, TextureLoader, VideoTexture } from "three";
|
|
8
8
|
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
|
|
9
9
|
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
|
|
10
10
|
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader";
|
|
@@ -33,7 +33,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
// 各向异性
|
|
36
|
-
anisotropy =
|
|
36
|
+
anisotropy = 16;
|
|
37
37
|
// 设置各向异性 由渲染器来调用并设置
|
|
38
38
|
setAnisotropy(v) {
|
|
39
39
|
this.anisotropy = v;
|
|
@@ -49,7 +49,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
49
49
|
const canvasTexture = new CanvasTexture(src);
|
|
50
50
|
canvasTexture.wrapS = canvasTexture.wrapT = RepeatWrapping;
|
|
51
51
|
canvasTexture.anisotropy = this.anisotropy;
|
|
52
|
-
canvasTexture.colorSpace = SRGBColorSpace;
|
|
52
|
+
// canvasTexture.colorSpace = SRGBColorSpace;
|
|
53
53
|
return canvasTexture;
|
|
54
54
|
}
|
|
55
55
|
let texture = this.textureMap.get(src);
|
|
@@ -77,7 +77,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
77
77
|
}
|
|
78
78
|
texture.wrapS = texture.wrapT = RepeatWrapping;
|
|
79
79
|
texture.anisotropy = this.anisotropy;
|
|
80
|
-
texture.colorSpace = SRGBColorSpace;
|
|
80
|
+
// texture.colorSpace = SRGBColorSpace;
|
|
81
81
|
return texture;
|
|
82
82
|
}
|
|
83
83
|
;
|
package/threeLoader.ts
CHANGED
|
@@ -41,7 +41,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// 各向异性
|
|
44
|
-
anisotropy =
|
|
44
|
+
anisotropy = 16;
|
|
45
45
|
|
|
46
46
|
// 设置各向异性 由渲染器来调用并设置
|
|
47
47
|
setAnisotropy(v: number) {
|
|
@@ -62,7 +62,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
62
62
|
const canvasTexture = new CanvasTexture(src);
|
|
63
63
|
canvasTexture.wrapS = canvasTexture.wrapT = RepeatWrapping;
|
|
64
64
|
canvasTexture.anisotropy = this.anisotropy;
|
|
65
|
-
canvasTexture.colorSpace = SRGBColorSpace;
|
|
65
|
+
// canvasTexture.colorSpace = SRGBColorSpace;
|
|
66
66
|
|
|
67
67
|
return canvasTexture;
|
|
68
68
|
}
|
|
@@ -96,7 +96,7 @@ class ThreeLoader extends EventDispatcher {
|
|
|
96
96
|
|
|
97
97
|
texture.wrapS = texture.wrapT = RepeatWrapping;
|
|
98
98
|
texture.anisotropy = this.anisotropy;
|
|
99
|
-
texture.colorSpace = SRGBColorSpace;
|
|
99
|
+
// texture.colorSpace = SRGBColorSpace;
|
|
100
100
|
|
|
101
101
|
return texture as Texture;
|
|
102
102
|
};
|
package/threeUtils.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Last Modified by: xiaosihan
|
|
5
5
|
* @Last Modified time: 2023-05-03 00:36:18
|
|
6
6
|
*/
|
|
7
|
-
import { Box3,
|
|
7
|
+
import { Box3, Clock, EventDispatcher, Vector3 } from "three";
|
|
8
8
|
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';
|
|
9
9
|
class ThreeUtils extends EventDispatcher {
|
|
10
10
|
constructor() {
|
|
@@ -108,11 +108,11 @@ class ThreeUtils extends EventDispatcher {
|
|
|
108
108
|
}
|
|
109
109
|
// 获取中心点
|
|
110
110
|
getCenter(object3d) {
|
|
111
|
-
if (object3d
|
|
111
|
+
if (object3d.isObject3D) {
|
|
112
112
|
this._box3.setFromObject(object3d);
|
|
113
113
|
this._box3.getCenter(this._center);
|
|
114
114
|
}
|
|
115
|
-
else if (object3d
|
|
115
|
+
else if (object3d.isBufferGeometry) {
|
|
116
116
|
object3d.computeBoundingBox();
|
|
117
117
|
object3d.boundingBox.getCenter(this._center);
|
|
118
118
|
}
|
|
@@ -120,11 +120,11 @@ class ThreeUtils extends EventDispatcher {
|
|
|
120
120
|
}
|
|
121
121
|
// 获取模型大小
|
|
122
122
|
getSize(object3d) {
|
|
123
|
-
if (object3d
|
|
123
|
+
if (object3d.isObject3D) {
|
|
124
124
|
this._box3.setFromObject(object3d);
|
|
125
125
|
this._box3.getSize(this._size);
|
|
126
126
|
}
|
|
127
|
-
else if (object3d
|
|
127
|
+
else if (object3d.isBufferGeometry) {
|
|
128
128
|
object3d.computeBoundingBox();
|
|
129
129
|
object3d.boundingBox.getSize(this._size);
|
|
130
130
|
}
|
|
@@ -132,7 +132,7 @@ class ThreeUtils extends EventDispatcher {
|
|
|
132
132
|
}
|
|
133
133
|
// 模型对齐底面
|
|
134
134
|
alignBottom(object3d, y = 0) {
|
|
135
|
-
if (object3d
|
|
135
|
+
if (object3d.isObject3D) {
|
|
136
136
|
this._box3.setFromObject(object3d);
|
|
137
137
|
this._box3.getCenter(this._center);
|
|
138
138
|
this._box3.getSize(this._size);
|
|
@@ -140,20 +140,20 @@ class ThreeUtils extends EventDispatcher {
|
|
|
140
140
|
object3d.position.y += y;
|
|
141
141
|
object3d.updateMatrixWorld(true);
|
|
142
142
|
}
|
|
143
|
-
else if (object3d
|
|
143
|
+
else if (object3d.isBufferGeometry) {
|
|
144
144
|
object3d.computeBoundingBox();
|
|
145
145
|
object3d.translate(0, -object3d.boundingBox.min.y + y, 0);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
// 居中对象
|
|
149
149
|
centerObject3D(object3d) {
|
|
150
|
-
if (object3d
|
|
150
|
+
if (object3d.isObject3D) {
|
|
151
151
|
this._box3.setFromObject(object3d);
|
|
152
152
|
this._box3.getCenter(this._center);
|
|
153
153
|
object3d.position.sub(this._center);
|
|
154
154
|
object3d.updateMatrixWorld(true);
|
|
155
155
|
}
|
|
156
|
-
else if (object3d
|
|
156
|
+
else if (object3d.isBufferGeometry) {
|
|
157
157
|
object3d.center();
|
|
158
158
|
}
|
|
159
159
|
}
|
|
@@ -161,15 +161,15 @@ class ThreeUtils extends EventDispatcher {
|
|
|
161
161
|
center(object3d) {
|
|
162
162
|
this.centerObject3D(object3d);
|
|
163
163
|
}
|
|
164
|
-
//
|
|
164
|
+
// 使用指定的维度(xyz)计算, 缩放至指定大小;
|
|
165
165
|
scaleTo(object3d, size = 1, key = ["x", "y", "z"]) {
|
|
166
166
|
const originSize = this.getSize(object3d);
|
|
167
167
|
const scale = size / Math.max(...key.map(k => originSize[k]));
|
|
168
|
-
if (object3d
|
|
168
|
+
if (object3d.isObject3D) {
|
|
169
169
|
object3d.scale.multiplyScalar(scale);
|
|
170
170
|
object3d.updateMatrixWorld(true);
|
|
171
171
|
}
|
|
172
|
-
else if (object3d
|
|
172
|
+
else if (object3d.isBufferGeometry) {
|
|
173
173
|
object3d.scale(scale, scale, scale);
|
|
174
174
|
}
|
|
175
175
|
}
|
package/threeUtils.ts
CHANGED
|
@@ -131,12 +131,12 @@ class ThreeUtils extends EventDispatcher {
|
|
|
131
131
|
|
|
132
132
|
// 获取中心点
|
|
133
133
|
getCenter(object3d: Object3D | BufferGeometry) {
|
|
134
|
-
if (object3d
|
|
135
|
-
this._box3.setFromObject(object3d);
|
|
134
|
+
if ((object3d as Object3D).isObject3D) {
|
|
135
|
+
this._box3.setFromObject(object3d as Object3D);
|
|
136
136
|
this._box3.getCenter(this._center);
|
|
137
|
-
} else if (object3d
|
|
138
|
-
object3d.computeBoundingBox();
|
|
139
|
-
object3d.boundingBox!.getCenter(this._center);
|
|
137
|
+
} else if ((object3d as BufferGeometry).isBufferGeometry) {
|
|
138
|
+
(object3d as BufferGeometry).computeBoundingBox();
|
|
139
|
+
(object3d as BufferGeometry).boundingBox!.getCenter(this._center);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
return this._center;
|
|
@@ -144,12 +144,12 @@ class ThreeUtils extends EventDispatcher {
|
|
|
144
144
|
|
|
145
145
|
// 获取模型大小
|
|
146
146
|
getSize(object3d: Object3D | BufferGeometry) {
|
|
147
|
-
if (object3d
|
|
148
|
-
this._box3.setFromObject(object3d);
|
|
147
|
+
if ((object3d as Object3D).isObject3D) {
|
|
148
|
+
this._box3.setFromObject(object3d as Object3D);
|
|
149
149
|
this._box3.getSize(this._size);
|
|
150
|
-
} else if (object3d
|
|
151
|
-
object3d.computeBoundingBox();
|
|
152
|
-
object3d.boundingBox!.getSize(this._size);
|
|
150
|
+
} else if ((object3d as BufferGeometry).isBufferGeometry) {
|
|
151
|
+
(object3d as BufferGeometry).computeBoundingBox();
|
|
152
|
+
(object3d as BufferGeometry).boundingBox!.getSize(this._size);
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
return this._size;
|
|
@@ -157,28 +157,28 @@ class ThreeUtils extends EventDispatcher {
|
|
|
157
157
|
|
|
158
158
|
// 模型对齐底面
|
|
159
159
|
alignBottom(object3d: Object3D | BufferGeometry, y = 0) {
|
|
160
|
-
if (object3d
|
|
161
|
-
this._box3.setFromObject(object3d);
|
|
160
|
+
if ((object3d as Object3D).isObject3D) {
|
|
161
|
+
this._box3.setFromObject(object3d as Object3D);
|
|
162
162
|
this._box3.getCenter(this._center);
|
|
163
163
|
this._box3.getSize(this._size);
|
|
164
|
-
object3d.position.y -= (this._center.y - (this._size.y * 0.5));
|
|
165
|
-
object3d.position.y += y;
|
|
166
|
-
object3d.updateMatrixWorld(true);
|
|
167
|
-
} else if (object3d
|
|
168
|
-
object3d.computeBoundingBox();
|
|
169
|
-
object3d.translate(0, -object3d.boundingBox!.min.y + y, 0);
|
|
164
|
+
(object3d as Object3D).position.y -= (this._center.y - (this._size.y * 0.5));
|
|
165
|
+
(object3d as Object3D).position.y += y;
|
|
166
|
+
(object3d as Object3D).updateMatrixWorld(true);
|
|
167
|
+
} else if ((object3d as BufferGeometry).isBufferGeometry) {
|
|
168
|
+
(object3d as BufferGeometry).computeBoundingBox();
|
|
169
|
+
(object3d as BufferGeometry).translate(0, -(object3d as BufferGeometry).boundingBox!.min.y + y, 0);
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
// 居中对象
|
|
174
174
|
centerObject3D(object3d: Object3D | BufferGeometry) {
|
|
175
|
-
if (object3d
|
|
176
|
-
this._box3.setFromObject(object3d);
|
|
175
|
+
if ((object3d as Object3D).isObject3D) {
|
|
176
|
+
this._box3.setFromObject(object3d as Object3D);
|
|
177
177
|
this._box3.getCenter(this._center);
|
|
178
|
-
object3d.position.sub(this._center);
|
|
179
|
-
object3d.updateMatrixWorld(true);
|
|
180
|
-
} else if (object3d
|
|
181
|
-
object3d.center();
|
|
178
|
+
(object3d as Object3D).position.sub(this._center);
|
|
179
|
+
(object3d as Object3D).updateMatrixWorld(true);
|
|
180
|
+
} else if ((object3d as BufferGeometry).isBufferGeometry) {
|
|
181
|
+
(object3d as BufferGeometry).center();
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
|
|
@@ -187,16 +187,16 @@ class ThreeUtils extends EventDispatcher {
|
|
|
187
187
|
this.centerObject3D(object3d);
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
//
|
|
190
|
+
// 使用指定的维度(xyz)计算, 缩放至指定大小;
|
|
191
191
|
scaleTo(object3d: Object3D | BufferGeometry, size: number = 1, key: Array<"x" | "y" | "z"> = ["x", "y", "z"]) {
|
|
192
192
|
const originSize = this.getSize(object3d);
|
|
193
193
|
const scale = size / Math.max(...key.map(k => originSize[k]));
|
|
194
194
|
|
|
195
|
-
if (object3d
|
|
196
|
-
object3d.scale.multiplyScalar(scale);
|
|
197
|
-
object3d.updateMatrixWorld(true);
|
|
198
|
-
} else if (object3d
|
|
199
|
-
object3d.scale(scale, scale, scale);
|
|
195
|
+
if ((object3d as Object3D).isObject3D) {
|
|
196
|
+
(object3d as Object3D).scale.multiplyScalar(scale);
|
|
197
|
+
(object3d as Object3D).updateMatrixWorld(true);
|
|
198
|
+
} else if ((object3d as BufferGeometry).isBufferGeometry) {
|
|
199
|
+
(object3d as BufferGeometry).scale(scale, scale, scale);
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|