three-base 1.129.0 → 1.129.2

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.
Files changed (53) hide show
  1. package/index.js +34 -0
  2. package/index.ts +5 -1
  3. package/lib/{ApngTexture.ts → ApngTexture.js} +11 -41
  4. package/lib/{ApngTextureManage.ts → ApngTextureManage.js} +13 -56
  5. package/lib/EventMesh.js +59 -0
  6. package/lib/{ExtrudeMesh.ts → ExtrudeMesh.js} +77 -284
  7. package/lib/{FPScontrol.ts → FPScontrol.js} +25 -64
  8. package/lib/InstancedGroupMesh.js +63 -0
  9. package/lib/{KeyFrameAnimation.ts → KeyFrameAnimation.js} +19 -63
  10. package/lib/{PlaneText.ts → PlaneText.js} +5 -34
  11. package/lib/{PointLight.ts → PointLight.js} +4 -18
  12. package/lib/Sky/{Sky.ts → Sky.js} +4 -12
  13. package/lib/Text3D/Text3D.js +60 -0
  14. package/lib/Text3D/fontController.js +200 -0
  15. package/lib/Text3D/gentilis.json +811 -0
  16. package/lib/{ThreeBase.ts → ThreeBase.js} +75 -131
  17. package/lib/{ThreeMouse.ts → ThreeMouse.js} +61 -168
  18. package/lib/{Transition.ts → Transition.js} +30 -101
  19. package/lib/index.d.ts +22 -0
  20. package/lib/{keyContorls.ts → keyContorls.js} +11 -40
  21. package/lib/lib/ApngTexture.d.ts +13 -0
  22. package/lib/lib/ApngTextureManage.d.ts +18 -0
  23. package/lib/lib/EventMesh.d.ts +18 -0
  24. package/lib/lib/ExtrudeMesh.d.ts +111 -0
  25. package/lib/lib/FPScontrol.d.ts +44 -0
  26. package/lib/lib/InstancedGroupMesh.d.ts +10 -0
  27. package/lib/lib/KeyFrameAnimation.d.ts +25 -0
  28. package/lib/lib/PlaneText.d.ts +37 -0
  29. package/lib/lib/PointLight.d.ts +13 -0
  30. package/lib/lib/Sky/Sky.d.ts +13 -0
  31. package/lib/lib/Text3D/Text3D.d.ts +20 -0
  32. package/lib/lib/Text3D/fontController.d.ts +59 -0
  33. package/lib/lib/ThreeBase.d.ts +59 -0
  34. package/lib/lib/ThreeMouse.d.ts +39 -0
  35. package/lib/lib/Transition.d.ts +45 -0
  36. package/lib/lib/keyContorls.d.ts +25 -0
  37. package/lib/lib/planeModal1/PlaneModal1.d.ts +32 -0
  38. package/lib/lib/shaders.d.ts +17 -0
  39. package/lib/lib/spriteModal1/SpriteModal1.d.ts +31 -0
  40. package/lib/lib/threeLoader.d.ts +20 -0
  41. package/lib/lib/threeUtils.d.ts +41 -0
  42. package/lib/lib/type.d.ts +0 -0
  43. package/lib/planeModal1/{PlaneModal1.ts → PlaneModal1.js} +33 -77
  44. package/lib/{shaders.ts → shaders.js} +19 -38
  45. package/lib/spriteModal1/{SpriteModal1.ts → SpriteModal1.js} +33 -80
  46. package/lib/{threeLoader.ts → threeLoader.js} +19 -45
  47. package/lib/{threeUtils.ts → threeUtils.js} +81 -82
  48. package/lib/{type.ts → type.js} +1 -4
  49. package/package.json +7 -6
  50. package/lib/EventMesh.ts +0 -79
  51. package/lib/InstancedGroupMesh.ts +0 -80
  52. package/lib/text/Text2D.ts +0 -41
  53. package/lib/text/Text3D.ts +0 -20
@@ -4,26 +4,8 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2022-09-30 00:12:19
6
6
  */
7
-
8
7
  import { clamp, cloneDeep, filter, first, get, isNumber, last } from "lodash";
9
- import { BufferAttribute, BufferGeometry, Material, Matrix4, Mesh, Vector2, Vector3 } from "three";
10
-
11
-
12
- export type ExtrudePath = {
13
- vector3: [number, number, number];
14
- radius: number; // 2 圆角半径
15
- segments: number; // 圆角分段
16
- scale: { x: number, y: number } // 1 当前位置对shape的缩放
17
- name: string; // 备注名字
18
- }
19
-
20
- // 挤出
21
- export interface ExtrudeMeshProps {
22
- paths: Array<ExtrudePath>, // 自动生成路径的
23
- shapePath: Array<[number, number]>,// 被拉伸成模型的平面路径
24
- closed: boolean // 是否闭合路径
25
- }
26
-
8
+ import { BufferAttribute, BufferGeometry, Matrix4, Mesh, Vector2, Vector3 } from "three";
27
9
  /**
28
10
  * 挤出模型
29
11
  * 此组件适合自动生成 公路 河流山川等 2d 平面上的模型
@@ -32,64 +14,39 @@ export interface ExtrudeMeshProps {
32
14
  * @class ExtrudeMesh
33
15
  * @extends {Mesh<BufferGeometry, Material>}
34
16
  */
35
- export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
36
-
17
+ export default class ExtrudeMesh extends Mesh {
37
18
  // 临时使用的二维顶点对象
38
19
  static temp1Vector2 = new Vector2();
39
20
  static temp2Vector2 = new Vector2();
40
21
  static temp3Vector2 = new Vector2();
41
-
42
22
  // 临时使用的3维顶点对象
43
23
  static tempVector3 = new Vector3();
44
24
  static temp1Vector3 = new Vector3();
45
25
  static temp2Vector3 = new Vector3();
46
26
  static temp3Vector3 = new Vector3();
47
-
48
27
  // 临时使用的矩阵
49
28
  static temp1Matrix4 = new Matrix4();
50
29
  static temp2Matrix4 = new Matrix4();
51
30
  static temp3Matrix4 = new Matrix4();
52
-
53
- constructor(props: ExtrudeMeshProps, material?: Material) {
31
+ constructor(props, material) {
54
32
  super(undefined, material);
55
33
  this.updateGeometry(props);
56
34
  }
57
-
58
35
  // 通过 props.paths 和圆角属性 计算出来的 最终路径
59
- pointerWidthRadius: Array<{
60
- vector3: [number, number, number], // 点的位置
61
- matrix: [
62
- number, number, number, number,
63
- number, number, number, number,
64
- number, number, number, number,
65
- number, number, number, number
66
- ] // 当前点的变换矩阵
67
- }> = [];
68
-
36
+ pointerWidthRadius = [];
69
37
  // 通过2个顶点和缩放值计算矩阵
70
- computerMatrix(
71
- vector1: [number, number, number],
72
- vector2: [number, number, number],
73
- scale: [number, number, number],
74
- ) {
38
+ computerMatrix(vector1, vector2, scale) {
75
39
  ExtrudeMesh.temp1Matrix4.identity();
76
- ExtrudeMesh.temp1Matrix4.multiply(
77
- ExtrudeMesh.temp2Matrix4.lookAt(
78
- ExtrudeMesh.temp1Vector3.set(vector1[0], vector1[1], vector1[2]),
79
- ExtrudeMesh.temp2Vector3.set(vector2[0], vector1[1], vector2[2]),
80
- ExtrudeMesh.temp3Vector3.set(0, 1, 0)
81
- )
82
- );
40
+ ExtrudeMesh.temp1Matrix4.multiply(ExtrudeMesh.temp2Matrix4.lookAt(ExtrudeMesh.temp1Vector3.set(vector1[0], vector1[1], vector1[2]), ExtrudeMesh.temp2Vector3.set(vector2[0], vector1[1], vector2[2]), ExtrudeMesh.temp3Vector3.set(0, 1, 0)));
83
41
  ExtrudeMesh.temp1Matrix4.scale(ExtrudeMesh.temp1Vector3.set(...scale));
84
42
  return ExtrudeMesh.temp1Matrix4.transpose().toArray();
85
43
  }
86
-
87
44
  /**
88
45
  * @计算渐变值 computerGradient([3,2,4], 0.3);
89
46
  * @渐变区间 values:number[]
90
47
  * @百分比 percentage:number
91
48
  */
92
- computerGradient(values: number[], percentage: number) {
49
+ computerGradient(values, percentage) {
93
50
  // 过滤有效数字类型
94
51
  values = filter(values, v => isNumber(v));
95
52
  // 限定取值范围
@@ -98,7 +55,8 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
98
55
  for (let i = (VL - 1); i >= 0; i--) {
99
56
  if (P === (i / (VL - 1))) {
100
57
  return values[i];
101
- } else if (P > (i / (VL - 1))) {
58
+ }
59
+ else if (P > (i / (VL - 1))) {
102
60
  P -= (i / (VL - 1));
103
61
  P *= 1 / ((i + 1) / (VL - 1) - (i / (VL - 1)));
104
62
  return (values[i + 1] - values[i]) * P + values[i];
@@ -106,83 +64,64 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
106
64
  }
107
65
  return 0;
108
66
  }
109
-
110
67
  // 计算圆角路径 并存到 this.pointerWidthRadius 上
111
- computerPointerWidthRadius(paths: Array<ExtrudePath>, closed: boolean) {
112
-
68
+ computerPointerWidthRadius(paths, closed) {
113
69
  // 路径小于2个就不执行计算
114
- if (paths.length < 2) { return; }
115
-
70
+ if (paths.length < 2) {
71
+ return;
72
+ }
116
73
  // 路径少于3个闭合路径参数不起作用
117
74
  if (paths.length < 3) {
118
75
  closed = false;
119
76
  }
120
-
121
77
  // 清空圆角路径
122
78
  this.pointerWidthRadius = [];
123
-
124
79
  paths = cloneDeep(paths);
125
-
126
80
  // 如果是闭合路径的话就头尾相连
127
81
  if (closed) {
128
82
  Object.defineProperties(paths, {
129
83
  [-1]: {
130
84
  value: last(paths),
131
- configurable: false, // 此属性能否删除和修改
132
- enumerable: false, // 此属性能否被遍历
85
+ configurable: false,
86
+ enumerable: false,
133
87
  writable: false // 此属性的值能否修改
134
88
  },
135
89
  [paths.length]: {
136
90
  value: first(paths),
137
- configurable: false, // 此属性能否删除和修改
138
- enumerable: false, // 此属性能否被遍历
91
+ configurable: false,
92
+ enumerable: false,
139
93
  writable: false // 此属性的值能否修改
140
94
  }
141
95
  });
142
96
  }
143
-
144
97
  paths.map((P, i) => {
145
-
146
- const {
147
- vector3,
148
- radius = 0.1,
149
- segments = 0,
150
- scale = { x: 1, y: 1 }
151
- } = P;
152
-
98
+ const { vector3, radius = 0.1, segments = 0, scale = { x: 1, y: 1 } } = P;
153
99
  //当前点位置前后都有点时就可以做圆角计算
154
100
  if (paths[i - 1] && paths[i + 1]) {
155
-
156
101
  // 第一个向量
157
102
  let v1 = ExtrudeMesh.temp1Vector3
158
103
  .set(...vector3)
159
104
  .sub(ExtrudeMesh.tempVector3.set(...paths[i - 1].vector3))
160
105
  .normalize()
161
106
  .clone();
162
-
163
107
  // 第二个向量
164
108
  let v2 = ExtrudeMesh.temp2Vector3
165
109
  .set(...paths[i + 1].vector3)
166
110
  .sub(ExtrudeMesh.tempVector3.set(...vector3))
167
111
  .normalize()
168
112
  .clone();
169
-
170
113
  // 夹角
171
114
  let innerAngle = v1.clone().multiplyScalar(-1).angleTo(v2);
172
115
  // 边长
173
116
  let sideLength = radius / Math.tan(innerAngle / 2);
174
-
175
117
  // 圆角的起点
176
118
  let startP = new Vector3(...vector3).sub(v1.clone().multiplyScalar(sideLength));
177
119
  // 圆角的终点
178
120
  let endP = new Vector3(...vector3).add(v2.clone().multiplyScalar(sideLength));
179
-
180
121
  // 圆角起点到终点的向量
181
122
  let StoE = endP.clone().sub(startP);
182
-
183
123
  // 弦长
184
124
  let chordLength = radius / Math.sin(innerAngle / 2);
185
-
186
125
  // 圆心位置
187
126
  let circleCenter = v2
188
127
  .clone()
@@ -191,61 +130,39 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
191
130
  .sub(v1)
192
131
  .setLength(chordLength)
193
132
  .add(ExtrudeMesh.tempVector3.set(...vector3));
194
-
195
133
  //向量2是否在 向量1的左边
196
134
  let v2Inv1Left = ExtrudeMesh.temp1Vector3
197
135
  .set(-v1.z, 0, v1.x)
198
- .angleTo(
199
- ExtrudeMesh.temp2Vector3.set(v2.x, 0, v2.z)
200
- )
136
+ .angleTo(ExtrudeMesh.temp2Vector3.set(v2.x, 0, v2.z))
201
137
  < (Math.PI / 2);
202
-
203
138
  // XZ平面上的夹角
204
139
  let innerAngleXZ = ExtrudeMesh.temp1Vector3
205
140
  .set(v1.x, 0, v1.z)
206
- .angleTo(
207
- ExtrudeMesh.temp2Vector3.set(v2.x, 0, v2.z)
208
- );
209
-
141
+ .angleTo(ExtrudeMesh.temp2Vector3.set(v2.x, 0, v2.z));
210
142
  // 如果当前点的位置在前后2点的连线上,就不进行分段计算 并且应用上一个点的矩阵
211
143
  if (innerAngleXZ === 0) {
212
144
  let { x = 1, y = 1 } = scale;
213
-
214
- let lastPointMatrix = last(this.pointerWidthRadius)!.matrix;
215
-
145
+ let lastPointMatrix = last(this.pointerWidthRadius).matrix;
216
146
  this.pointerWidthRadius.push({
217
147
  vector3,
218
148
  matrix: ExtrudeMesh.temp1Matrix4
219
149
  .identity()
220
- .extractRotation(
221
- ExtrudeMesh.temp2Matrix4.set(...lastPointMatrix)
222
- )
223
- .multiply(
224
- ExtrudeMesh.temp3Matrix4
225
- .identity()
226
- .scale(
227
- ExtrudeMesh.temp1Vector3.set(1, y, x)
228
- )
229
- )
150
+ .extractRotation(ExtrudeMesh.temp2Matrix4.set(...lastPointMatrix))
151
+ .multiply(ExtrudeMesh.temp3Matrix4
152
+ .identity()
153
+ .scale(ExtrudeMesh.temp1Vector3.set(1, y, x)))
230
154
  .transpose()
231
155
  .toArray()
232
156
  });
233
-
234
- } else if (segments === 0) { // 分段数为0时不分段
235
-
157
+ }
158
+ else if (segments === 0) { // 分段数为0时不分段
236
159
  let { x = 1, y = 1 } = scale;
237
-
238
160
  this.pointerWidthRadius.push({
239
161
  vector3,
240
- matrix: this.computerMatrix(
241
- (v2Inv1Left ? circleCenter.toArray() : vector3),
242
- (v2Inv1Left ? vector3 : circleCenter.toArray()),
243
- [1, y, x]
244
- )
162
+ matrix: this.computerMatrix((v2Inv1Left ? circleCenter.toArray() : vector3), (v2Inv1Left ? vector3 : circleCenter.toArray()), [1, y, x])
245
163
  });
246
-
247
- } else {
248
-
164
+ }
165
+ else {
249
166
  for (let ii = 0; ii <= segments; ii++) {
250
167
  // 圆角计算的低n个点的角度
251
168
  let Aa = ii * ((Math.PI - innerAngle) / segments);
@@ -255,111 +172,70 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
255
172
  let a = radius * Math.sin(Aa) / Math.sin(Cc);
256
173
  // 每段圆角的弦长
257
174
  let StoEvector = StoE.clone().setLength(a).add(startP);
258
-
259
175
  // 当前点的位置
260
176
  let ridiusP = StoEvector
261
177
  .clone()
262
178
  .sub(circleCenter)
263
179
  .setLength(radius)
264
- .add(circleCenter)
265
-
180
+ .add(circleCenter);
266
181
  let { x: preX = 1, y: preY = 1 } = get(paths[i - 1], ["scale"]) || {};
267
-
268
182
  let { x: nextX = 1, y: nextY = 1 } = get(paths[i + 1], ["scale"]) || {};
269
-
270
183
  let { x = 1, y = 1 } = scale;
271
-
272
184
  // 缩放值过渡计算
273
185
  x = this.computerGradient([(preX + x) / 2, x, (x + nextX) / 2], ii / segments);
274
186
  y = this.computerGradient([(preY + y) / 2, y, (y + nextY) / 2], ii / segments);
275
-
276
187
  // 添加一个带矩阵的点
277
188
  this.pointerWidthRadius.push({
278
189
  vector3: ridiusP.toArray(),
279
- matrix: this.computerMatrix(
280
- (v2Inv1Left ? circleCenter.toArray() : ridiusP.toArray()),
281
- (v2Inv1Left ? ridiusP.toArray() : circleCenter.toArray()),
282
- [1, y, x]
283
- )
190
+ matrix: this.computerMatrix((v2Inv1Left ? circleCenter.toArray() : ridiusP.toArray()), (v2Inv1Left ? ridiusP.toArray() : circleCenter.toArray()), [1, y, x])
284
191
  });
285
192
  }
286
193
  }
287
-
288
- } else {
289
-
194
+ }
195
+ else {
290
196
  // 最后一个位置
291
197
  if (i === paths.length - 1) {
292
-
293
198
  // 如果是闭合的话 就把第一个点的位置加入最后后面
294
199
  if (closed) {
295
- this.pointerWidthRadius.push(first(this.pointerWidthRadius)!);
296
-
297
- } else {
298
-
200
+ this.pointerWidthRadius.push(first(this.pointerWidthRadius));
201
+ }
202
+ else {
299
203
  // 如果路径未闭合并且遍历到最后一个时特殊处理
300
- let lastPoint = last(this.pointerWidthRadius)!;
301
-
204
+ let lastPoint = last(this.pointerWidthRadius);
302
205
  // 在没有闭合的情况下添加第一个点的位置
303
206
  let v = ExtrudeMesh.temp1Vector3
304
207
  .set(...vector3)
305
- .sub(
306
- ExtrudeMesh.temp3Vector3.set(...lastPoint.vector3)
307
- )
308
- .normalize()
309
-
208
+ .sub(ExtrudeMesh.temp3Vector3.set(...lastPoint.vector3))
209
+ .normalize();
310
210
  let lookAtPoint = ExtrudeMesh.temp2Vector3
311
211
  .set(v.z, 0, -v.x)
312
- .add(
313
- ExtrudeMesh.temp3Vector3.set(...vector3)
314
- )
212
+ .add(ExtrudeMesh.temp3Vector3.set(...vector3))
315
213
  .toArray();
316
-
317
214
  let { x = 1, y = 1 } = scale;
318
-
319
215
  this.pointerWidthRadius.push({
320
216
  vector3,
321
- matrix: this.computerMatrix(
322
- vector3,
323
- lookAtPoint,
324
- [1, y, x]
325
- )
217
+ matrix: this.computerMatrix(vector3, lookAtPoint, [1, y, x])
326
218
  });
327
-
328
219
  }
329
-
330
- } else {
331
-
220
+ }
221
+ else {
332
222
  let { x = 1, y = 1 } = scale;
333
-
334
223
  // 在没有闭合的情况下添加第一个点的位置
335
224
  let v2 = ExtrudeMesh.temp1Vector3
336
225
  .set(...paths[i + 1].vector3)
337
- .sub(
338
- ExtrudeMesh.temp2Vector3.set(...vector3)
339
- )
226
+ .sub(ExtrudeMesh.temp2Vector3.set(...vector3))
340
227
  .normalize();
341
-
342
228
  let lookAtPoint = ExtrudeMesh.temp1Vector3
343
229
  .set(v2.z, 0, -v2.x)
344
- .add(
345
- ExtrudeMesh.temp2Vector3.set(...vector3)
346
- )
230
+ .add(ExtrudeMesh.temp2Vector3.set(...vector3))
347
231
  .toArray();
348
-
349
232
  this.pointerWidthRadius.push({
350
233
  vector3,
351
- matrix: this.computerMatrix(
352
- vector3,
353
- lookAtPoint,
354
- [1, y, x]
355
- )
234
+ matrix: this.computerMatrix(vector3, lookAtPoint, [1, y, x])
356
235
  });
357
236
  }
358
-
359
237
  } // else
360
-
361
238
  });
362
-
363
239
  // 清理圆角路径, 如果2个点相距0.001以内就删除一个点
364
240
  // for (let i = 0; i < this.pointerWidthRadius.length; i++) {
365
241
  // while (
@@ -373,9 +249,8 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
373
249
  // }
374
250
  // }
375
251
  }
376
-
377
252
  // 计算三维路径的总长度
378
- computerPathLength(points: [number, number, number][]) {
253
+ computerPathLength(points) {
379
254
  let length = 0;
380
255
  points.map((p, index) => {
381
256
  if (index < points.length - 1) {
@@ -386,45 +261,25 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
386
261
  });
387
262
  return length;
388
263
  }
389
-
390
264
  // 通过一条线段计算挤出模型的各个顶点的位置和 uv坐标
391
- setExtrudeMesh(
392
- startP: [number, number, number], // 起点位置
393
- startMatrix4: [
394
- number, number, number, number,
395
- number, number, number, number,
396
- number, number, number, number,
397
- number, number, number, number,
398
- ],// 起点位置的矩阵
399
- endP: [number, number, number], // 终点位置
400
- endMatrix4: [
401
- number, number, number, number,
402
- number, number, number, number,
403
- number, number, number, number,
404
- number, number, number, number,
405
- ], // 终点位置的矩阵
406
- uvx: number, // uv.x 的起始位置
407
- shapePath: Array<[number, number]>
408
- ) {
409
-
265
+ setExtrudeMesh(startP, // 起点位置
266
+ startMatrix4, // 起点位置的矩阵
267
+ endP, // 终点位置
268
+ endMatrix4, // 终点位置的矩阵
269
+ uvx, // uv.x 的起始位置
270
+ shapePath) {
410
271
  // // 反转路径, 这样uv 坐标看起来习惯一些
411
272
  // shapePath = cloneDeep(shapePath).reverse();
412
-
413
273
  // 计算二维路径的总长度 作为uv坐标的边长
414
274
  let shapePathLength = this.computerPathLength(shapePath.map(p => [...p, 0]));
415
-
416
275
  // 挤出长度
417
276
  let extrudeLength = this.computerPathLength([startP, endP]);
418
-
419
277
  // 网格模型每个点
420
- let geometryPoint: Array<number> = [];
421
-
278
+ let geometryPoint = [];
422
279
  // 网格模型每个点对应的uv坐标
423
- let uvPoint: Array<number> = [];
424
-
280
+ let uvPoint = [];
425
281
  shapePath.map((P, index) => {
426
282
  if (index < shapePath.length - 1) {
427
-
428
283
  // 计算出矩形面的4个顶点
429
284
  //[pa....Pd]
430
285
  //[. .]
@@ -433,50 +288,26 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
433
288
  //[Pb....Pc]
434
289
  let Pa = ExtrudeMesh.tempVector3
435
290
  .set(0, P[1], -P[0])
436
- .applyMatrix4(
437
- ExtrudeMesh.temp1Matrix4.set(...startMatrix4)
438
- )
439
- .add(
440
- ExtrudeMesh.temp1Vector3.set(...startP)
441
- )
442
- .toArray()
443
-
291
+ .applyMatrix4(ExtrudeMesh.temp1Matrix4.set(...startMatrix4))
292
+ .add(ExtrudeMesh.temp1Vector3.set(...startP))
293
+ .toArray();
444
294
  let Pb = ExtrudeMesh.tempVector3
445
295
  .set(0, shapePath[index + 1][1], -shapePath[index + 1][0])
446
- .applyMatrix4(
447
- ExtrudeMesh.temp1Matrix4.set(...startMatrix4)
448
- )
449
- .add(
450
- ExtrudeMesh.temp1Vector3.set(...startP)
451
- )
452
- .toArray()
453
-
296
+ .applyMatrix4(ExtrudeMesh.temp1Matrix4.set(...startMatrix4))
297
+ .add(ExtrudeMesh.temp1Vector3.set(...startP))
298
+ .toArray();
454
299
  let Pc = ExtrudeMesh.tempVector3
455
300
  .set(0, shapePath[index + 1][1], -shapePath[index + 1][0])
456
- .applyMatrix4(
457
- ExtrudeMesh.temp1Matrix4.set(...endMatrix4)
458
- )
459
- .add(
460
- ExtrudeMesh.temp1Vector3.set(...endP)
461
- )
462
- .toArray()
463
-
301
+ .applyMatrix4(ExtrudeMesh.temp1Matrix4.set(...endMatrix4))
302
+ .add(ExtrudeMesh.temp1Vector3.set(...endP))
303
+ .toArray();
464
304
  let Pd = ExtrudeMesh.tempVector3
465
305
  .set(0, P[1], -P[0])
466
- .applyMatrix4(
467
- ExtrudeMesh.temp1Matrix4.set(...endMatrix4)
468
- )
469
- .add(
470
- ExtrudeMesh.temp1Vector3.set(...endP)
471
- )
472
- .toArray()
473
-
306
+ .applyMatrix4(ExtrudeMesh.temp1Matrix4.set(...endMatrix4))
307
+ .add(ExtrudeMesh.temp1Vector3.set(...endP))
308
+ .toArray();
474
309
  // 组成矩形的2个三角面
475
- geometryPoint.push(
476
- ...Pa, ...Pb, ...Pc,
477
- ...Pa, ...Pc, ...Pd
478
- );
479
-
310
+ geometryPoint.push(...Pa, ...Pb, ...Pc, ...Pa, ...Pc, ...Pd);
480
311
  // 计算出矩形面的4个顶点的uv坐标
481
312
  //[Pauv..Pcuv]
482
313
  //[. .]
@@ -484,86 +315,48 @@ export default class ExtrudeMesh extends Mesh<BufferGeometry, Material> {
484
315
  //[. .]
485
316
  //[Pbuv..Pduv]
486
317
  // 当前位置的 uv.y 位置
487
- let currentUvy = this.computerPathLength(
488
- [first(shapePath)!, ...shapePath.slice(0, index + 1)].map(sP => ([...sP, 0] as [number, number, number]))
489
- ) / shapePathLength;
490
-
318
+ let currentUvy = this.computerPathLength([first(shapePath), ...shapePath.slice(0, index + 1)].map(sP => [...sP, 0])) / shapePathLength;
491
319
  // 下一个坐标的 uv.y 位置
492
- let nextUvy = this.computerPathLength(
493
- [first(shapePath)!, ...shapePath.slice(0, index + 2)].map(sP => ([...sP, 0] as [number, number, number]))
494
- ) / shapePathLength;
495
-
320
+ let nextUvy = this.computerPathLength([first(shapePath), ...shapePath.slice(0, index + 2)].map(sP => [...sP, 0])) / shapePathLength;
496
321
  let Pauv = [uvx / shapePathLength, currentUvy];
497
-
498
322
  let Pbuv = [uvx / shapePathLength, nextUvy];
499
-
500
323
  let Pcuv = [(uvx + extrudeLength) / shapePathLength, nextUvy];
501
-
502
324
  let Pduv = [(uvx + extrudeLength) / shapePathLength, currentUvy];
503
-
504
- uvPoint.push(
505
- ...Pauv, ...Pbuv, ...Pcuv,
506
- ...Pauv, ...Pcuv, ...Pduv
507
- );
325
+ uvPoint.push(...Pauv, ...Pbuv, ...Pcuv, ...Pauv, ...Pcuv, ...Pduv);
508
326
  }
509
327
  });
510
-
511
328
  return { geometryPoint, uvPoint };
512
329
  }
513
-
514
330
  //设置模型
515
- updateGeometry(props: ExtrudeMeshProps) {
516
-
331
+ updateGeometry(props) {
517
332
  const { paths, shapePath, closed } = props;
518
333
  // 计算圆角路径
519
334
  this.computerPointerWidthRadius(paths, closed);
520
-
521
335
  //网格模型的每个顶点位置
522
- let geometryPoint: Array<number> = [];
523
-
336
+ let geometryPoint = [];
524
337
  // 网格模型每个点对应的uv坐标
525
- let uvPoint: number[] = [];
526
-
338
+ let uvPoint = [];
527
339
  for (let i = 0; i < this.pointerWidthRadius.length - 1; i++) {
528
-
529
340
  let Point1 = this.pointerWidthRadius[i];
530
341
  let Point2 = this.pointerWidthRadius[i + 1];
531
-
532
342
  let uvx = this.computerPathLength(this.pointerWidthRadius.slice(0, i + 1).map(p => p.vector3));
533
-
534
- const { geometryPoint: geo, uvPoint: uv } = this.setExtrudeMesh(
535
- Point1.vector3,
536
- Point1.matrix,
537
- Point2.vector3,
538
- Point2.matrix,
539
- uvx,
540
- shapePath
541
- );
542
-
343
+ const { geometryPoint: geo, uvPoint: uv } = this.setExtrudeMesh(Point1.vector3, Point1.matrix, Point2.vector3, Point2.matrix, uvx, shapePath);
543
344
  // 把挤出的网格模型的顶点收集起来
544
345
  geometryPoint.push(...geo);
545
-
546
346
  // 把挤出的网格模型顶点的uv坐标收集起来
547
347
  uvPoint.push(...uv);
548
348
  }
549
-
550
-
551
349
  let geometry = new BufferGeometry();
552
350
  // 修改模型
553
351
  let positionArray = new Float32Array(geometryPoint);
554
352
  let position = new BufferAttribute(positionArray, 3, false);
555
353
  geometry.setAttribute("position", position);
556
-
557
354
  let uvArray = new Float32Array(uvPoint);
558
355
  let uv = new BufferAttribute(uvArray, 2, false);
559
356
  geometry.setAttribute("uv", uv);
560
-
561
357
  // 计算顶点法线
562
358
  geometry.computeVertexNormals();
563
-
564
359
  this.geometry.dispose();
565
360
  this.geometry = geometry;
566
361
  }
567
-
568
-
569
- }
362
+ }