MeshEdito一:3D网格线段

给定起始点以及结束点的两个vector3,以及为其指定材质和半径,便可以画出一条线段,效果如下:

部分代码:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
bool
trade =
false
;
//线段所在轴
float
Xgap = Mathf.Abs(startPositon.x - endPosition.x);
float
Ygap = Mathf.Abs(startPositon.y - endPosition.y);
float
Zgap = Mathf.Abs(startPositon.z - endPosition.z);
Vector3[] _Vertices =
new
Vector3[24];
if
(Xgap >= Ygap && Xgap >= Zgap)
{
Vector3 middle;
//线段方向对调(有时候需要获取线段位置时必须获取它的开始位置)
if
(startPositon.x < endPosition.x)
{
middle = startPositon;
startPositon = endPosition;
endPosition = middle;
trade =
true
;
}
//创建线段
_Vertices =
new
Vector3[24]
{
new
Vector3(startPositon.x, startPositon.y, startPositon.z + radius),
new
Vector3(startPositon.x, startPositon.y + Mathf.Sin(3.14f/180*30) * radius, startPositon.z + Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(startPositon.x, startPositon.y + Mathf.Sin(3.14f/180*60) * radius, startPositon.z + Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(startPositon.x, startPositon.y + radius, startPositon.z),
new
Vector3(startPositon.x, startPositon.y + Mathf.Sin(3.14f/180*60) * radius, startPositon.z - Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(startPositon.x, startPositon.y + Mathf.Sin(3.14f/180*30) * radius, startPositon.z - Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(startPositon.x, startPositon.y, startPositon.z - radius),
new
Vector3(startPositon.x, startPositon.y - Mathf.Sin(3.14f/180*30) * radius, startPositon.z - Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(startPositon.x, startPositon.y - Mathf.Sin(3.14f/180*60) * radius, startPositon.z - Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(startPositon.x, startPositon.y - radius, startPositon.z),
new
Vector3(startPositon.x, startPositon.y - Mathf.Sin(3.14f/180*60) * radius, startPositon.z + Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(startPositon.x, startPositon.y - Mathf.Sin(3.14f/180*30) * radius, startPositon.z + Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(endPosition.x, endPosition.y, endPosition.z + radius),
new
Vector3(endPosition.x, endPosition.y + Mathf.Sin(3.14f/180*30) * radius, endPosition.z + Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(endPosition.x, endPosition.y + Mathf.Sin(3.14f/180*60) * radius, endPosition.z + Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(endPosition.x, endPosition.y + radius, endPosition.z),
new
Vector3(endPosition.x, endPosition.y + Mathf.Sin(3.14f/180*60) * radius, endPosition.z - Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(endPosition.x, endPosition.y + Mathf.Sin(3.14f/180*30) * radius, endPosition.z - Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(endPosition.x, endPosition.y, endPosition.z - radius),
new
Vector3(endPosition.x, endPosition.y - Mathf.Sin(3.14f/180*30) * radius, endPosition.z - Mathf.Cos(3.14f/180*30) * radius),
new
Vector3(endPosition.x, endPosition.y - Mathf.Sin(3.14f/180*60) * radius, endPosition.z - Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(endPosition.x, endPosition.y - radius, endPosition.z),
new
Vector3(endPosition.x, endPosition.y - Mathf.Sin(3.14f/180*60) * radius, endPosition.z + Mathf.Cos(3.14f/180*60) * radius),
new
Vector3(endPosition.x, endPosition.y - Mathf.Sin(3.14f/180*30) * radius, endPosition.z + Mathf.Cos(3.14f/180*30) * radius)
};
}
|

同时,提供起点终点以及弯曲弧度还能画出一段曲线,如下:
部分代码:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
if
(length % 2 != 0) length += 1;
//曲线过渡点
Vector3 LostMedium;
Vector3 NewMedium;
//曲线平均衰减值
float
xD = (endPosition.x - startPositon.x) / length;
float
yD = (endPosition.y - startPositon.y) / length;
float
zD = (endPosition.z - startPositon.z) / length;
//曲线减速衰减值
float
XWeakValue = radian.x / (length / 2);
float
YWeakValue = radian.y / (length / 2);
float
ZWeakValue = radian.z / (length / 2);
//曲线弧度延伸值
float
XBendingValue = 0;
float
YBendingValue = 0;
float
ZBendingValue = 0;
GameObject _Line =
new
GameObject(
"Curve"
);
_Line.transform.localScale = Vector3.one;
_Line.transform.position = Vector3.zero;
_Line.transform.rotation = Quaternion.Euler(0, 0, 0);
XBendingValue += radian.x;
YBendingValue += radian.y;
ZBendingValue += radian.z;
LostMedium = startPositon;
NewMedium =
new
Vector3(startPositon.x + xD + XBendingValue, startPositon.y + yD + YBendingValue, startPositon.z + zD + ZBendingValue);
Draw(LostMedium, NewMedium, lineMaterial, radius).transform.SetParent(_Line.transform);
//循环画线段
for
(
int
i = 2; i <= length / 2; i++)
{
XBendingValue += (radian.x - XWeakValue * (i - 1));
YBendingValue += (radian.y - YWeakValue * (i - 1));
ZBendingValue += (radian.z - ZWeakValue * (i - 1));
LostMedium = NewMedium;
NewMedium =
new
Vector3(startPositon.x + xD * i + XBendingValue, startPositon.y + yD * i + YBendingValue, startPositon.z + zD * i + ZBendingValue);
Draw(LostMedium, NewMedium, lineMaterial, radius).transform.SetParent(_Line.transform);
}
|