UEDL8-2——弧线、圆、立方体,几何体

本章代码关键字

1
2
3
4
5
6
Handles.DrawWireArc()            //绘制弧线
Handles.DrawSolidArc() //绘制扇形
Handles.DrawWireDisc() //绘制线框圆
Handles.DrawSolidDisc() //绘制填充圆
Handles.DrawWireCube() //绘制线框立方体
Handles.DrawAAConvexPolygon() //绘制平面多边形

Handles中的弧线和扇形

  • 绘制线框弧线:Handles.DrawWireArc(圆心, 法线, 绘制朝向, 角度, 半径);
  • 绘制填充弧线(扇形):Handles.DrawSolidArc(圆心, 法线, 绘制朝向, 角度, 半径);

参数如下:

  • 参数一:圆心位置(需要注意传入的位置是基于世界坐标系还是自身坐标系的,它会影响对象移动时绘制的效果)
  • 参数二:绘制弧线所在平面的法线(需要注意传入的法线是基于世界坐标系还是自身坐标系的,它会影响对象旋转时绘制的效果)
  • 参数三:从哪个方向开始顺时针绘制(左手螺旋法则,大拇指指向就是法线,注意传入的方向是基于世界坐标系还是自身坐标系的)
  • 参数四:绘制多少角度
  • 参数五:绘制半径

两个方法的区别在于一个是画弧线,一个是画填充弧线也就是扇形(绘制的颜色受到Handles.color​设置的影响)

假设要画以自身为圆点,y轴作为法线,绘制起点朝向为面朝向,绘制角度为30度的半径为5的圆弧和半径为3的扇形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private Lesson26 targetObj;

private void OnEnable()
{
targetObj = target as Lesson26;
}

private void OnSceneGUI()
{
Debug.Log("Scene窗口拓展相关逻辑");
Handles.color = new Color(0f, 0f, 1f, 1f);
Handles.Label(targetObj.transform.position, "绘制30度,蓝色虚线为绘制朝向");
Handles.DrawDottedLine(targetObj.transform.position, targetObj.transform.position + targetObj.transform.forward * 5, 10);

Handles.color = Color.white;
Handles.DrawWireArc(targetObj.transform.position, targetObj.transform.up, targetObj.transform.forward, 30, 5);
Handles.DrawSolidArc(targetObj.transform.position, targetObj.transform.up, targetObj.transform.forward, 30, 3);
}

绘制效果如下:

image

假设要让绘制朝向向左偏移一定角度,可以使用四元数乘向量的方式来旋转绘制朝向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private Lesson26 targetObj;

private void OnEnable()
{
targetObj = target as Lesson26;
}

private void OnSceneGUI()
{
Debug.Log("Scene窗口拓展相关逻辑");
Handles.color = new Color(0f, 0f, 1f, 1f);
Handles.Label(targetObj.transform.position, "绘制30度,蓝色虚线为绘制朝向");
Handles.DrawDottedLine(targetObj.transform.position,
targetObj.transform.position + Quaternion.Euler(0, -15f, 0) * targetObj.transform.forward * 5,
10);

Handles.color = Color.white;
Handles.DrawWireArc(targetObj.transform.position,
targetObj.transform.up,
Quaternion.Euler(0, -15f, 0) * targetObj.transform.forward,
30,
5);
Handles.DrawSolidArc(targetObj.transform.position,
targetObj.transform.up,
Quaternion.Euler(0, -15f, 0) * targetObj.transform.forward,
30,
3);
}

绘制效果如下:

image

Handles中的圆

(绘制的颜色受到Handles.color​设置的影响)

  • 绘制线框圆:Handles.DrawWireDisc(圆心, 法线, 半径);
  • 绘制填充圆:Handles.DrawSolidDisc(圆心, 法线, 半径);

参数如下:

  • 参数一:圆心位置(需要注意传入的位置是基于世界坐标系还是自身坐标系的,它会影响对象移动时绘制的效果)
  • 参数二:绘制圆所在平面的法线(需要注意传入的法线是基于世界坐标系还是自身坐标系的,它会影响对象旋转时绘制的效果)
  • 参数三:绘制半径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Lesson26 targetObj;

private void OnEnable()
{
targetObj = target as Lesson26;
}

private void OnSceneGUI()
{
Handles.color = Color.gray;
Handles.DrawWireDisc(targetObj.transform.position, targetObj.transform.up, 3);
Handles.DrawSolidDisc(targetObj.transform.position, targetObj.transform.up, 2);
Handles.Label(targetObj.transform.position, "绘制半径分别为2和3的实心圆和线框圆");
}

绘制效果:

image

Handles中的立方体线框

Handles.DrawWireCube(中心点, xyz大小);

  • 参数一:立方体的中心点
  • 参数二:立方体长宽高

假设要绘制一个红色的长宽高都为1的立方体(绘制的颜色受到Handles.color​设置的影响)

1
2
3
4
5
6
7
8
9
10
11
12
private Lesson26 targetObj;

private void OnEnable()
{
targetObj = target as Lesson26;
}

private void OnSceneGUI()
{
Handles.color = Color.red;
Handles.DrawWireCube(targetObj.transform.position, Vector3.one);
}

绘制效果:

image

Handles中的几何体

如果要绘制一个奇怪的几何体,需要使用Handles.DrawAAConvexPolygon

假设要绘制一个正方形面片(绘制的颜色受到Handles.color​设置的影响)

1
2
3
4
5
6
7
private void OnSceneGUI()
{
Handles.DrawAAConvexPolygon(Vector3.zero, //(0,0,0)
Vector3.right, //(1,0,0)
Vector3.right + Vector3.forward, //(1,1,0)
Vector3.forward); //(0,0,1)
}

绘制效果:

image

值得一提的是,该方法绘制出来的立体模型效果不佳,在绘制时一些面会被忽略掉填充,因此建议只用来绘制在平面上的多边形