Unity动态绘制mesh:点,线,面,模型


MeshEdito一:3D网格线段   

给定起始点以及结束点的两个vector3,以及为其指定材质和半径,便可以画出一条线段,效果如下:
Unity动态绘制mesh:点,线,面,模型_第1张图片 

部分代码:
[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) 
             }; 
         }



 



同时,提供起点终点以及弯曲弧度还能画出一段曲线,如下:
Unity动态绘制mesh:点,线,面,模型_第2张图片
部分代码:
[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); 
         }

你可能感兴趣的:(Unity)