three-base 2.0.17 → 2.0.19
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 +6 -5
- package/ThreeBase.js +41 -30
- package/ThreeBase.ts +52 -30
- package/package.json +1 -1
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
|
-
|
|
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
|
|
29
|
-
center
|
|
29
|
+
position: Vector3;
|
|
30
|
+
center: Vector3;
|
|
30
31
|
}): void;
|
|
31
32
|
setLookAt({ position, center, duration }: {
|
|
32
|
-
position
|
|
33
|
-
center
|
|
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,
|
|
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:
|
|
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
|
-
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
210
|
-
|
|
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: `
|
|
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:
|
|
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
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
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({
|
|
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({
|
|
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
|
-
|
|
241
|
-
|
|
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
|
-
|
|
248
|
-
|
|
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: `
|
|
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);
|