three-base 2.0.17 → 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
  // 轨道控制器
@@ -132,16 +127,11 @@ export default class ThreeBase extends EventDispatcher {
132
127
  // this.renderer.clear();
133
128
  // this.renderer.render(this.scene, this.camera);
134
129
  }
135
- // 控制器的位置缓动的计算的顶点对象
136
- controlsPosition = (() => {
137
- const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
138
- controlsPosition.setDuration(1000);
139
- controlsPosition.onChange(({ x, y, z }) => {
140
- this.camera.position.set(x, y, z);
141
- this.camera.lookAt(this.controls.target);
142
- this.needRender = true;
143
- });
144
- return controlsPosition;
130
+ // 视角距离过度
131
+ controlsDistance = (() => {
132
+ const controlsDistance = new Transition({ distance: 0 });
133
+ controlsDistance.setDuration(1000);
134
+ return controlsDistance;
145
135
  })();
146
136
  // 控制器的 朝向带缓动的计算的顶点对象
147
137
  controlsCenter = (() => {
@@ -154,6 +144,21 @@ export default class ThreeBase extends EventDispatcher {
154
144
  });
155
145
  return controlsCenter;
156
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
+ })();
157
162
  // 网格辅助线
158
163
  gridHelper = (() => {
159
164
  const gridHelper = new GridHelper(1000, 100, 0x303030, 0x303030);
@@ -175,19 +180,20 @@ export default class ThreeBase extends EventDispatcher {
175
180
  });
176
181
  }
177
182
  // 重置控制器的位置
178
- resetLookAt({ position, center, }) {
183
+ resetLookAt({ position = this.camera.position, center = this.controls.target, }) {
179
184
  // 停止控制器的惯性
180
185
  this.controls.enableDamping = false;
181
186
  this.controls.saveState();
182
187
  this.controls.update();
183
188
  this.controls.reset();
184
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)) });
185
191
  position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
186
192
  center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
187
193
  this.needRender = true;
188
194
  }
189
195
  // 设置控制器的位置 以动画的方式移动控制器
190
- async setLookAt({ position, center, duration = 1000 }) {
196
+ async setLookAt({ position = this.camera.position, center = this.controls.target, duration = 1000 }) {
191
197
  // 停止控制器的惯性
192
198
  this.controls.enableDamping = false;
193
199
  this.controls.saveState();
@@ -199,19 +205,20 @@ export default class ThreeBase extends EventDispatcher {
199
205
  // 等待动画执行完成
200
206
  await Promise.all([
201
207
  new Promise(async (resolve, reject) => {
202
- if (position) {
203
- this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
204
- await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
205
- }
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)) });
206
210
  resolve();
207
211
  }),
208
212
  new Promise(async (resolve, reject) => {
209
- if (center) {
210
- this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
211
- await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
212
- }
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 });
213
215
  resolve();
214
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
+ })
215
222
  ]);
216
223
  }
217
224
  // 获取控制的位置和朝向 保留3位小数
@@ -221,7 +228,7 @@ export default class ThreeBase extends EventDispatcher {
221
228
  return {
222
229
  center: new Vector3(...center),
223
230
  position: new Vector3(...position),
224
- centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
231
+ centerPosition: `position: new Vector3(${position.join(",")}),center: new Vector3(${center.join(",")})`
225
232
  };
226
233
  }
227
234
  // 三维向量转化成屏幕上的2维向量
@@ -290,12 +297,16 @@ export default class ThreeBase extends EventDispatcher {
290
297
  }
291
298
  // 渲染场景
292
299
  this.dispatchEvent({ type: "beforeRender" });
293
- //TODO 渲染了2次, 还有优化空间
294
300
  this.renderer.setRenderTarget(this.baseRenderTarget);
295
301
  this.renderer.clear();
296
302
  this.renderer.render(this.scene, this.camera);
297
303
  this.renderer.setRenderTarget(null);
298
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);
299
310
  this.renderer.render(this.scene, this.camera);
300
311
  // 查找需要绘制描边的对象,并且绘制描边
301
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);
@@ -158,16 +153,11 @@ export default class ThreeBase extends EventDispatcher {
158
153
  // this.renderer.render(this.scene, this.camera);
159
154
  }
160
155
 
161
- // 控制器的位置缓动的计算的顶点对象
162
- controlsPosition = (() => {
163
- const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
164
- controlsPosition.setDuration(1000);
165
- controlsPosition.onChange(({ x, y, z }) => {
166
- this.camera.position.set(x, y, z);
167
- this.camera.lookAt(this.controls.target);
168
- this.needRender = true;
169
- });
170
- return controlsPosition;
156
+ // 视角距离过度
157
+ controlsDistance = (() => {
158
+ const controlsDistance = new Transition({ distance: 0 });
159
+ controlsDistance.setDuration(1000);
160
+ return controlsDistance;
171
161
  })();
172
162
 
173
163
  // 控制器的 朝向带缓动的计算的顶点对象
@@ -182,6 +172,23 @@ export default class ThreeBase extends EventDispatcher {
182
172
  return controlsCenter;
183
173
  })();
184
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
+
185
192
  // 网格辅助线
186
193
  gridHelper = (() => {
187
194
  const gridHelper = new GridHelper(1000, 100, 0x303030, 0x303030);
@@ -207,7 +214,10 @@ export default class ThreeBase extends EventDispatcher {
207
214
  }
208
215
 
209
216
  // 重置控制器的位置
210
- resetLookAt({ position, center, }: { position?: Vector3, center?: Vector3, }) {
217
+ resetLookAt({
218
+ position = this.camera.position,
219
+ center = this.controls.target,
220
+ }: { position: Vector3, center: Vector3 }) {
211
221
 
212
222
  // 停止控制器的惯性
213
223
  this.controls.enableDamping = false;
@@ -216,13 +226,18 @@ export default class ThreeBase extends EventDispatcher {
216
226
  this.controls.reset();
217
227
  this.controls.enableDamping = true;
218
228
 
229
+ this.controlsDistance.reset({ distance: new Vector3(position.x, position.y, position.z).distanceTo(new Vector3(center.x, center.y, center.z)) });
219
230
  position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
220
231
  center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
221
232
  this.needRender = true;
222
233
  }
223
234
 
224
235
  // 设置控制器的位置 以动画的方式移动控制器
225
- 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 }) {
226
241
 
227
242
  // 停止控制器的惯性
228
243
  this.controls.enableDamping = false;
@@ -237,20 +252,20 @@ export default class ThreeBase extends EventDispatcher {
237
252
  // 等待动画执行完成
238
253
  await Promise.all([
239
254
  new Promise<void>(async (resolve, reject) => {
240
- if (position) {
241
- this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
242
- await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
243
- }
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)) });
244
257
  resolve();
245
258
  }),
246
259
  new Promise<void>(async (resolve, reject) => {
247
- if (center) {
248
- this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
249
- await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
250
- }
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 });
251
262
  resolve();
252
263
  }),
253
-
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
+ })
254
269
  ]);
255
270
 
256
271
  }
@@ -262,7 +277,7 @@ export default class ThreeBase extends EventDispatcher {
262
277
  return {
263
278
  center: new Vector3(...center),
264
279
  position: new Vector3(...position),
265
- centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
280
+ centerPosition: `position: new Vector3(${position.join(",")}),center: new Vector3(${center.join(",")})`
266
281
  }
267
282
  }
268
283
 
@@ -348,15 +363,22 @@ export default class ThreeBase extends EventDispatcher {
348
363
  // 渲染场景
349
364
  this.dispatchEvent({ type: "beforeRender" });
350
365
 
351
- //TODO 渲染了2次, 还有优化空间
352
366
  this.renderer.setRenderTarget(this.baseRenderTarget);
353
367
  this.renderer.clear();
354
368
  this.renderer.render(this.scene, this.camera);
355
369
 
356
370
  this.renderer.setRenderTarget(null);
357
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);
358
378
  this.renderer.render(this.scene, this.camera);
359
379
 
380
+
381
+
360
382
  // 查找需要绘制描边的对象,并且绘制描边
361
383
  this.scene.traverse(obj => {
362
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.17",
3
+ "version": "2.0.18",
4
4
  "description": "three 3d three-base",
5
5
  "repository": {
6
6
  "type": "git",