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 +6 -5
- package/ThreeBase.js +43 -31
- package/ThreeBase.ts +56 -33
- 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.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
|
// 轨道控制器
|
|
@@ -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
|
|
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
|
-
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
209
|
-
|
|
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: `
|
|
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:
|
|
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
|
|
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
|
-
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
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({
|
|
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({
|
|
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
|
-
|
|
240
|
-
|
|
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
|
-
|
|
247
|
-
|
|
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: `
|
|
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
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
|
|