three-base 2.0.16 → 2.0.18

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.d.ts CHANGED
@@ -19,18 +19,19 @@ export default class ThreeBase extends EventDispatcher {
19
19
  isRendererContextLost: boolean;
20
20
  setContainer(div: HTMLDivElement | null): Promise<void>;
21
21
  setSize(width: number, height: number): void;
22
- controlsPosition: Transition;
22
+ controlsDistance: Transition;
23
23
  controlsCenter: Transition;
24
+ controlsPosition: Transition;
24
25
  gridHelper: GridHelper;
25
26
  axesHelper: AxesHelper;
26
27
  init(): void;
27
28
  resetLookAt({ position, center, }: {
28
- position?: Vector3;
29
- center?: Vector3;
29
+ position: Vector3;
30
+ center: Vector3;
30
31
  }): void;
31
32
  setLookAt({ position, center, duration }: {
32
- position?: Vector3;
33
- center?: Vector3;
33
+ position: Vector3;
34
+ center: Vector3;
34
35
  duration?: number;
35
36
  }): Promise<void>;
36
37
  getLookAt(): {
package/ThreeBase.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * @Last Modified time: 2023-05-23 23:54:13
6
6
  */
7
7
  import { round } from "lodash";
8
- import { AxesHelper, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
8
+ import { AxesHelper, DepthFormat, DepthTexture, DisplayP3ColorSpace, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
9
9
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
10
10
  import { generateUUID } from "three/src/math/MathUtils";
11
11
  import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
@@ -38,13 +38,11 @@ export default class ThreeBase extends EventDispatcher {
38
38
  stencilBuffer: false,
39
39
  depthTexture: this.baseDepthTexture,
40
40
  anisotropy: 16,
41
- colorSpace: SRGBColorSpace,
41
+ colorSpace: DisplayP3ColorSpace
42
42
  // | typeof NoColorSpace
43
43
  // | typeof SRGBColorSpace
44
44
  // | typeof LinearSRGBColorSpace
45
45
  // | typeof DisplayP3ColorSpace;
46
- // encoding: sRGBEncoding
47
- // LinearEncoding | typeof sRGBEncoding;
48
46
  });
49
47
  // 公用渲染目标1
50
48
  renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
@@ -77,10 +75,7 @@ export default class ThreeBase extends EventDispatcher {
77
75
  //透视相机
78
76
  camera = new PerspectiveCamera(45, 1, 0.0001, 1000000);
79
77
  // 场景对象
80
- scene = (() => {
81
- const scene = new Scene();
82
- return scene;
83
- })();
78
+ scene = new Scene();
84
79
  ///鼠标事件对象
85
80
  threeMouse = new ThreeMouse(this.renderer, this.camera, this.scene);
86
81
  // 轨道控制器
@@ -106,6 +101,7 @@ export default class ThreeBase extends EventDispatcher {
106
101
  div.append(this.renderer.domElement);
107
102
  // 如果上下文被销毁了, 就恢复上下文
108
103
  if (this.isRendererContextLost) {
104
+ this.isRendererContextLost = false;
109
105
  this.renderer.forceContextRestore();
110
106
  await new Promise(resolve => requestAnimationFrame(resolve));
111
107
  await new Promise(resolve => requestAnimationFrame(resolve));
@@ -119,7 +115,7 @@ export default class ThreeBase extends EventDispatcher {
119
115
  }
120
116
  // 修改尺寸
121
117
  setSize(width, height) {
122
- if (this.camera instanceof PerspectiveCamera) {
118
+ if (this.camera.type == 'PerspectiveCamera') {
123
119
  this.camera.aspect = width / height;
124
120
  this.camera.updateProjectionMatrix();
125
121
  }
@@ -131,16 +127,11 @@ export default class ThreeBase extends EventDispatcher {
131
127
  // this.renderer.clear();
132
128
  // this.renderer.render(this.scene, this.camera);
133
129
  }
134
- // 控制器的位置缓动的计算的顶点对象
135
- controlsPosition = (() => {
136
- const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
137
- controlsPosition.setDuration(1000);
138
- controlsPosition.onChange(({ x, y, z }) => {
139
- this.camera.position.set(x, y, z);
140
- this.camera.lookAt(this.controls.target);
141
- this.needRender = true;
142
- });
143
- return controlsPosition;
130
+ // 视角距离过度
131
+ controlsDistance = (() => {
132
+ const controlsDistance = new Transition({ distance: 0 });
133
+ controlsDistance.setDuration(1000);
134
+ return controlsDistance;
144
135
  })();
145
136
  // 控制器的 朝向带缓动的计算的顶点对象
146
137
  controlsCenter = (() => {
@@ -153,6 +144,21 @@ export default class ThreeBase extends EventDispatcher {
153
144
  });
154
145
  return controlsCenter;
155
146
  })();
147
+ // 控制器的位置缓动的计算的顶点对象
148
+ controlsPosition = (() => {
149
+ const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
150
+ controlsPosition.setDuration(1000);
151
+ controlsPosition.onChange(({ x, y, z }) => {
152
+ const distance = this.controlsDistance.get("distance");
153
+ this.camera.position.set(x, y, z)
154
+ .sub(this.controls.target)
155
+ .setLength(distance)
156
+ .add(this.controls.target);
157
+ this.camera.lookAt(this.controls.target);
158
+ this.needRender = true;
159
+ });
160
+ return controlsPosition;
161
+ })();
156
162
  // 网格辅助线
157
163
  gridHelper = (() => {
158
164
  const gridHelper = new GridHelper(1000, 100, 0x303030, 0x303030);
@@ -174,19 +180,20 @@ export default class ThreeBase extends EventDispatcher {
174
180
  });
175
181
  }
176
182
  // 重置控制器的位置
177
- resetLookAt({ position, center, }) {
183
+ resetLookAt({ position = this.camera.position, center = this.controls.target, }) {
178
184
  // 停止控制器的惯性
179
185
  this.controls.enableDamping = false;
180
186
  this.controls.saveState();
181
187
  this.controls.update();
182
188
  this.controls.reset();
183
189
  this.controls.enableDamping = true;
190
+ this.controlsDistance.reset({ distance: new Vector3(position.x, position.y, position.z).distanceTo(new Vector3(center.x, center.y, center.z)) });
184
191
  position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
185
192
  center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
186
193
  this.needRender = true;
187
194
  }
188
195
  // 设置控制器的位置 以动画的方式移动控制器
189
- async setLookAt({ position, center, duration = 1000 }) {
196
+ async setLookAt({ position = this.camera.position, center = this.controls.target, duration = 1000 }) {
190
197
  // 停止控制器的惯性
191
198
  this.controls.enableDamping = false;
192
199
  this.controls.saveState();
@@ -198,19 +205,20 @@ export default class ThreeBase extends EventDispatcher {
198
205
  // 等待动画执行完成
199
206
  await Promise.all([
200
207
  new Promise(async (resolve, reject) => {
201
- if (position) {
202
- this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
203
- await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
204
- }
208
+ this.controlsDistance.setDuration(duration).reset({ distance: this.camera.position.distanceTo(this.controls.target) });
209
+ await this.controlsDistance.set({ distance: new Vector3(position.x, position.y, position.z).distanceTo(new Vector3(center.x, center.y, center.z)) });
205
210
  resolve();
206
211
  }),
207
212
  new Promise(async (resolve, reject) => {
208
- if (center) {
209
- this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
210
- await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
211
- }
213
+ this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
214
+ await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
212
215
  resolve();
213
216
  }),
217
+ new Promise(async (resolve, reject) => {
218
+ this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
219
+ await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
220
+ resolve();
221
+ })
214
222
  ]);
215
223
  }
216
224
  // 获取控制的位置和朝向 保留3位小数
@@ -220,7 +228,7 @@ export default class ThreeBase extends EventDispatcher {
220
228
  return {
221
229
  center: new Vector3(...center),
222
230
  position: new Vector3(...position),
223
- centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
231
+ centerPosition: `position: new Vector3(${position.join(",")}),center: new Vector3(${center.join(",")})`
224
232
  };
225
233
  }
226
234
  // 三维向量转化成屏幕上的2维向量
@@ -289,12 +297,16 @@ export default class ThreeBase extends EventDispatcher {
289
297
  }
290
298
  // 渲染场景
291
299
  this.dispatchEvent({ type: "beforeRender" });
292
- //TODO 渲染了2次, 还有优化空间
293
300
  this.renderer.setRenderTarget(this.baseRenderTarget);
294
301
  this.renderer.clear();
295
302
  this.renderer.render(this.scene, this.camera);
296
303
  this.renderer.setRenderTarget(null);
297
304
  this.renderer.clear();
305
+ //TODO 渲染了2次, 还有优化空间
306
+ // this.renderer.setScissorTest(false);
307
+ // this.renderRendererTarget(this.baseRenderTarget);
308
+ // this.renderer.setScissorTest(true);
309
+ // this.renderer.setScissor(0, 0, 512, 1000);
298
310
  this.renderer.render(this.scene, this.camera);
299
311
  // 查找需要绘制描边的对象,并且绘制描边
300
312
  this.scene.traverse(obj => {
package/ThreeBase.ts CHANGED
@@ -43,13 +43,11 @@ export default class ThreeBase extends EventDispatcher {
43
43
  stencilBuffer: false,
44
44
  depthTexture: this.baseDepthTexture,
45
45
  anisotropy: 16,
46
- colorSpace: SRGBColorSpace,
46
+ colorSpace: DisplayP3ColorSpace
47
47
  // | typeof NoColorSpace
48
48
  // | typeof SRGBColorSpace
49
49
  // | typeof LinearSRGBColorSpace
50
50
  // | typeof DisplayP3ColorSpace;
51
- // encoding: sRGBEncoding
52
- // LinearEncoding | typeof sRGBEncoding;
53
51
  });
54
52
 
55
53
  // 公用渲染目标1
@@ -91,10 +89,7 @@ export default class ThreeBase extends EventDispatcher {
91
89
  camera: Camera = new PerspectiveCamera(45, 1, 0.0001, 1000000);
92
90
 
93
91
  // 场景对象
94
- scene = (() => {
95
- const scene = new Scene();
96
- return scene;
97
- })();
92
+ scene = new Scene();
98
93
 
99
94
  ///鼠标事件对象
100
95
  threeMouse = new ThreeMouse(this.renderer, this.camera, this.scene);
@@ -125,6 +120,7 @@ export default class ThreeBase extends EventDispatcher {
125
120
 
126
121
  // 如果上下文被销毁了, 就恢复上下文
127
122
  if (this.isRendererContextLost) {
123
+ this.isRendererContextLost = false;
128
124
  this.renderer.forceContextRestore();
129
125
  await new Promise(resolve => requestAnimationFrame(resolve));
130
126
  await new Promise(resolve => requestAnimationFrame(resolve));
@@ -141,9 +137,9 @@ export default class ThreeBase extends EventDispatcher {
141
137
 
142
138
  // 修改尺寸
143
139
  setSize(width: number, height: number) {
144
- if (this.camera instanceof PerspectiveCamera) {
145
- this.camera.aspect = width / height;
146
- this.camera.updateProjectionMatrix();
140
+ if ((this.camera as PerspectiveCamera).type == 'PerspectiveCamera') {
141
+ (this.camera as PerspectiveCamera).aspect = width / height;
142
+ (this.camera as PerspectiveCamera).updateProjectionMatrix();
147
143
  }
148
144
 
149
145
  this.renderer.setPixelRatio(window.devicePixelRatio);
@@ -157,16 +153,11 @@ export default class ThreeBase extends EventDispatcher {
157
153
  // this.renderer.render(this.scene, this.camera);
158
154
  }
159
155
 
160
- // 控制器的位置缓动的计算的顶点对象
161
- controlsPosition = (() => {
162
- const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
163
- controlsPosition.setDuration(1000);
164
- controlsPosition.onChange(({ x, y, z }) => {
165
- this.camera.position.set(x, y, z);
166
- this.camera.lookAt(this.controls.target);
167
- this.needRender = true;
168
- });
169
- return controlsPosition;
156
+ // 视角距离过度
157
+ controlsDistance = (() => {
158
+ const controlsDistance = new Transition({ distance: 0 });
159
+ controlsDistance.setDuration(1000);
160
+ return controlsDistance;
170
161
  })();
171
162
 
172
163
  // 控制器的 朝向带缓动的计算的顶点对象
@@ -181,6 +172,23 @@ export default class ThreeBase extends EventDispatcher {
181
172
  return controlsCenter;
182
173
  })();
183
174
 
175
+ // 控制器的位置缓动的计算的顶点对象
176
+ controlsPosition = (() => {
177
+ const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
178
+ controlsPosition.setDuration(1000);
179
+ controlsPosition.onChange(({ x, y, z }) => {
180
+ const distance = this.controlsDistance.get("distance");
181
+ this.camera.position.set(x, y, z)
182
+ .sub(this.controls.target)
183
+ .setLength(distance)
184
+ .add(this.controls.target);
185
+
186
+ this.camera.lookAt(this.controls.target);
187
+ this.needRender = true;
188
+ });
189
+ return controlsPosition;
190
+ })();
191
+
184
192
  // 网格辅助线
185
193
  gridHelper = (() => {
186
194
  const gridHelper = new GridHelper(1000, 100, 0x303030, 0x303030);
@@ -206,7 +214,10 @@ export default class ThreeBase extends EventDispatcher {
206
214
  }
207
215
 
208
216
  // 重置控制器的位置
209
- resetLookAt({ position, center, }: { position?: Vector3, center?: Vector3, }) {
217
+ resetLookAt({
218
+ position = this.camera.position,
219
+ center = this.controls.target,
220
+ }: { position: Vector3, center: Vector3 }) {
210
221
 
211
222
  // 停止控制器的惯性
212
223
  this.controls.enableDamping = false;
@@ -215,13 +226,18 @@ export default class ThreeBase extends EventDispatcher {
215
226
  this.controls.reset();
216
227
  this.controls.enableDamping = true;
217
228
 
229
+ this.controlsDistance.reset({ distance: new Vector3(position.x, position.y, position.z).distanceTo(new Vector3(center.x, center.y, center.z)) });
218
230
  position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
219
231
  center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
220
232
  this.needRender = true;
221
233
  }
222
234
 
223
235
  // 设置控制器的位置 以动画的方式移动控制器
224
- async setLookAt({ position, center, duration = 1000 }: { position?: Vector3, center?: Vector3, duration?: number }) {
236
+ async setLookAt({
237
+ position = this.camera.position,
238
+ center = this.controls.target,
239
+ duration = 1000
240
+ }: { position: Vector3, center: Vector3, duration?: number }) {
225
241
 
226
242
  // 停止控制器的惯性
227
243
  this.controls.enableDamping = false;
@@ -236,20 +252,20 @@ export default class ThreeBase extends EventDispatcher {
236
252
  // 等待动画执行完成
237
253
  await Promise.all([
238
254
  new Promise<void>(async (resolve, reject) => {
239
- if (position) {
240
- this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
241
- await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
242
- }
255
+ this.controlsDistance.setDuration(duration).reset({ distance: this.camera.position.distanceTo(this.controls.target) });
256
+ await this.controlsDistance.set({ distance: new Vector3(position.x, position.y, position.z).distanceTo(new Vector3(center.x, center.y, center.z)) });
243
257
  resolve();
244
258
  }),
245
259
  new Promise<void>(async (resolve, reject) => {
246
- if (center) {
247
- this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
248
- await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
249
- }
260
+ this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
261
+ await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
250
262
  resolve();
251
263
  }),
252
-
264
+ new Promise<void>(async (resolve, reject) => {
265
+ this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
266
+ await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
267
+ resolve();
268
+ })
253
269
  ]);
254
270
 
255
271
  }
@@ -261,7 +277,7 @@ export default class ThreeBase extends EventDispatcher {
261
277
  return {
262
278
  center: new Vector3(...center),
263
279
  position: new Vector3(...position),
264
- centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
280
+ centerPosition: `position: new Vector3(${position.join(",")}),center: new Vector3(${center.join(",")})`
265
281
  }
266
282
  }
267
283
 
@@ -347,15 +363,22 @@ export default class ThreeBase extends EventDispatcher {
347
363
  // 渲染场景
348
364
  this.dispatchEvent({ type: "beforeRender" });
349
365
 
350
- //TODO 渲染了2次, 还有优化空间
351
366
  this.renderer.setRenderTarget(this.baseRenderTarget);
352
367
  this.renderer.clear();
353
368
  this.renderer.render(this.scene, this.camera);
354
369
 
355
370
  this.renderer.setRenderTarget(null);
356
371
  this.renderer.clear();
372
+
373
+ //TODO 渲染了2次, 还有优化空间
374
+ // this.renderer.setScissorTest(false);
375
+ // this.renderRendererTarget(this.baseRenderTarget);
376
+ // this.renderer.setScissorTest(true);
377
+ // this.renderer.setScissor(0, 0, 512, 1000);
357
378
  this.renderer.render(this.scene, this.camera);
358
379
 
380
+
381
+
359
382
  // 查找需要绘制描边的对象,并且绘制描边
360
383
  this.scene.traverse(obj => {
361
384
  stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-base",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "description": "three 3d three-base",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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 = stroke_width / 4;
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
- 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);
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;
@@ -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 = stroke_width / 4;
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
- renderer.setRenderTarget(blur2TextureTarget);
537
- blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
538
- fsQuad.render(renderer, blurShader);
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, SRGBColorSpace, TextureLoader, VideoTexture } from "three";
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 = 1;
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 = 1;
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, BufferGeometry, Clock, EventDispatcher, Object3D, Vector3 } from "three";
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 instanceof Object3D) {
111
+ if (object3d.isObject3D) {
112
112
  this._box3.setFromObject(object3d);
113
113
  this._box3.getCenter(this._center);
114
114
  }
115
- else if (object3d instanceof BufferGeometry) {
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 instanceof Object3D) {
123
+ if (object3d.isObject3D) {
124
124
  this._box3.setFromObject(object3d);
125
125
  this._box3.getSize(this._size);
126
126
  }
127
- else if (object3d instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof Object3D) {
168
+ if (object3d.isObject3D) {
169
169
  object3d.scale.multiplyScalar(scale);
170
170
  object3d.updateMatrixWorld(true);
171
171
  }
172
- else if (object3d instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof 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 instanceof BufferGeometry) {
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 instanceof Object3D) {
196
- object3d.scale.multiplyScalar(scale);
197
- object3d.updateMatrixWorld(true);
198
- } else if (object3d instanceof BufferGeometry) {
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