UEDL8-3——移动、旋转、缩放

本章代码关键字

1
2
3
4
5
6
7
Handles.PositionHandle()            //为某个点加上移动轴,方便在Scene窗口上控制其位移
Handles.DoPositionHandle() //同上
Handles.RotationHandle() //为某个点加上旋转轴,方便在Scene窗口上控制其旋转
Handles.DoRotationHandle() //同上
Handles.ScaleHandle() //为某个点加上缩放轴,方便在Scene窗口上控制其缩放
Handles.DoScaleHandle() //同上
HandleUtility.GetHandleSize() //获取给定位置的操纵器控制柄的世界空间大小,使用当前相机计算合适的大小,需要其返回值需要传入添加缩放轴的方法内

Handles中的移动轴

移动轴指的是Scene窗口上用于移动对象位置的三个箭头:image

移动轴有两个API,它们的作用和用法是一致的,它们都会为场景上某个点(可以是对象的位置)添加移动轴控制器,方便控制其位置移动

  • Handles.DoPositionHandle(位置, 角度);
  • Handles.PositionHandle(位置, 角度);

该方法需要传入 要添加移动轴控制器的点的位置 和 该点的旋转角度,返回由移动轴控制器控制移动过后的位置
(旋转角度用来旋转移动轴控制器,使得移动轴控制器与该点的本地坐标系同步,如果传入0角度,则移动轴控制器控制的移动将会是基于世界坐标系的)

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()
{
//targetObj.transform.position = Handles.DoPositionHandle(targetObj.transform.position, targetObj.transform.rotation);
targetObj.transform.position = Handles.PositionHandle(targetObj.transform.position, targetObj.transform.rotation);
}

效果如下:image(该移动轴会在选中该对象时一直显示在场景上,即使你选择的不是位移工具)

值得一提的是,这个移动轴不一定非要配套对象的位置消息,它还可以用来控制某个Vector3的点在场景上的位置,
如果要使用基于这个Vector3坐标的本地坐标系,还需要声明配套的四元数消息,然后传入到该方法内

例如下面的控制线段的绘制终点代码:

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

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

private void OnSceneGUI()
{
endPos = Handles.PositionHandle(endPos, Quaternion.identity);
Handles.DrawLine(targetObj.transform.position, endPos, 2);
}

效果如下:

image

Handles中的旋转轴

旋转轴指的是Scene窗口上用于旋转对象的三个圆弧:image

关于旋转轴有两个API,它们的作用和用法是一致的,它们都会为场景上某个点(可以是对象的旋转角度)添加旋转轴,方便控制其旋转

  • Handles.DoPositionHandle(位置, 角度);
  • Handles.PositionHandle(位置, 角度);

该方法需要传入要添加旋转轴的旋转角度和位置,返回由旋转轴控制旋转过后的角度(四元数)
(位置用来控制移动轴的位置,使得旋转轴与该点的位置同步,可传入固定的位置,使得旋转轴可以不跟随对象的位置)

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()
{
//targetObj.transform.rotation = Handles.DoRotationHandle(targetObj.transform.rotation, targetObj.transform.position);
targetObj.transform.rotation = Handles.RotationHandle(targetObj.transform.rotation, targetObj.transform.position);
}

效果如下:image

Handles中的缩放轴

缩放轴指的是Scene窗口上用于缩放对象的三个轴:image

关于缩放轴有两个API,它们的作用和用法是一致的,但缩放轴的参数与移动轴和缩放轴有较大的不同:

  • 返回值:由缩放轴控制缩放过后的缩放

  • 参数一:要控制的缩放消息

  • 参数二:位置,决定缩放轴的位置

  • 参数三:角度,决定缩放轴的旋转角度

  • 参数四:HandleUtility.GetHandleSize(位置)

    HandleUtility.GetHandleSize()方法的作用是获取给定位置的操纵器控制柄的世界空间大小
    使用当前相机计算合适的大小,它决定了控制柄的缩放大小

    简单来说,就是如果该方法参数传入的是Vector3.zero,则缩放轴会随着摄像机的距离而改变大小,距离摄像机越远越小
    而如果传入的是被添加缩放轴的点的位置,则缩放轴的大小是恒定的,不会随着摄像机的距离而改变大小,和移动轴和旋转轴的效果一样

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()
{
//targetObj.transform.localScale = Handles.DoScaleHandle(targetObj.transform.localScale,
// targetObj.transform.position,
// targetObj.transform.rotation,
// HandleUtility.GetHandleSize(targetObj.transform.position));
targetObj.transform.localScale = Handles.ScaleHandle(targetObj.transform.localScale,
targetObj.transform.position,
targetObj.transform.rotation,
HandleUtility.GetHandleSize(targetObj.transform.position));
}

效果如下:image