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.
- package/index.js +34 -0
- package/index.ts +5 -1
- package/lib/{ApngTexture.ts → ApngTexture.js} +11 -41
- package/lib/{ApngTextureManage.ts → ApngTextureManage.js} +13 -56
- package/lib/EventMesh.js +59 -0
- package/lib/{ExtrudeMesh.ts → ExtrudeMesh.js} +77 -284
- package/lib/{FPScontrol.ts → FPScontrol.js} +25 -64
- package/lib/InstancedGroupMesh.js +63 -0
- package/lib/{KeyFrameAnimation.ts → KeyFrameAnimation.js} +19 -63
- package/lib/{PlaneText.ts → PlaneText.js} +5 -34
- package/lib/{PointLight.ts → PointLight.js} +4 -18
- package/lib/Sky/{Sky.ts → Sky.js} +4 -12
- package/lib/Text3D/Text3D.js +60 -0
- package/lib/Text3D/fontController.js +200 -0
- package/lib/Text3D/gentilis.json +811 -0
- package/lib/{ThreeBase.ts → ThreeBase.js} +75 -131
- package/lib/{ThreeMouse.ts → ThreeMouse.js} +61 -168
- package/lib/{Transition.ts → Transition.js} +30 -101
- package/lib/index.d.ts +22 -0
- package/lib/{keyContorls.ts → keyContorls.js} +11 -40
- package/lib/lib/ApngTexture.d.ts +13 -0
- package/lib/lib/ApngTextureManage.d.ts +18 -0
- package/lib/lib/EventMesh.d.ts +18 -0
- package/lib/lib/ExtrudeMesh.d.ts +111 -0
- package/lib/lib/FPScontrol.d.ts +44 -0
- package/lib/lib/InstancedGroupMesh.d.ts +10 -0
- package/lib/lib/KeyFrameAnimation.d.ts +25 -0
- package/lib/lib/PlaneText.d.ts +37 -0
- package/lib/lib/PointLight.d.ts +13 -0
- package/lib/lib/Sky/Sky.d.ts +13 -0
- package/lib/lib/Text3D/Text3D.d.ts +20 -0
- package/lib/lib/Text3D/fontController.d.ts +59 -0
- package/lib/lib/ThreeBase.d.ts +59 -0
- package/lib/lib/ThreeMouse.d.ts +39 -0
- package/lib/lib/Transition.d.ts +45 -0
- package/lib/lib/keyContorls.d.ts +25 -0
- package/lib/lib/planeModal1/PlaneModal1.d.ts +32 -0
- package/lib/lib/shaders.d.ts +17 -0
- package/lib/lib/spriteModal1/SpriteModal1.d.ts +31 -0
- package/lib/lib/threeLoader.d.ts +20 -0
- package/lib/lib/threeUtils.d.ts +41 -0
- package/lib/lib/type.d.ts +0 -0
- package/lib/planeModal1/{PlaneModal1.ts → PlaneModal1.js} +33 -77
- package/lib/{shaders.ts → shaders.js} +19 -38
- package/lib/spriteModal1/{SpriteModal1.ts → SpriteModal1.js} +33 -80
- package/lib/{threeLoader.ts → threeLoader.js} +19 -45
- package/lib/{threeUtils.ts → threeUtils.js} +81 -82
- package/lib/{type.ts → type.js} +1 -4
- package/package.json +7 -6
- package/lib/EventMesh.ts +0 -79
- package/lib/InstancedGroupMesh.ts +0 -80
- package/lib/text/Text2D.ts +0 -41
- 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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
}
|
|
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
|
|
112
|
-
|
|
68
|
+
computerPointerWidthRadius(paths, closed) {
|
|
113
69
|
// 路径小于2个就不执行计算
|
|
114
|
-
if (paths.length < 2) {
|
|
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
|
-
|
|
222
|
-
)
|
|
223
|
-
.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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
|
|
421
|
-
|
|
278
|
+
let geometryPoint = [];
|
|
422
279
|
// 网格模型每个点对应的uv坐标
|
|
423
|
-
let uvPoint
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
523
|
-
|
|
336
|
+
let geometryPoint = [];
|
|
524
337
|
// 网格模型每个点对应的uv坐标
|
|
525
|
-
let uvPoint
|
|
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
|
+
}
|