操作说明:因涉及到触发对象后操作,所以旋转和缩放需要通过扳机键切换来使用。通过按住拾取键左手柄平移,右手柄旋转,当点击右手柄扳机键后切换为缩放,此时旋转功能将无法使用,左右手柄均可平移,双手柄操作为缩放。再点击右手柄扳机键,右手柄可恢复旋转功能。
一、平移缩放
1、新建一个球形触发器作为操作对象,需要操作的模型可以作为此触发球的子对象,自行调节触发范围。
2、平移使用抓取模型的功能即可。下图小箭头,是默认左手柄触发平移。
3、VRTK_AxisScaleGrabAction 为VRTK缩放对象脚本
二、旋转
update函数写的是通过获取手柄的位置来对模型对象进行旋转控制。
后面三个都是手柄控制器按键事件,最后一个是扳机键按下用来切换旋转和缩放功能的。
Vector3 previousPosition;
Vector3 offset;
bool isRotate = true;
private bool isOpertion = false;
void Update()
{
//抓取键 是否进行操作
if (!isOpertion)
{
previousPosition = controllerRight.position;
}else
{
//通过手柄位置来控制模型的旋转
offset = controllerRight.position - previousPosition;
previousPosition = controllerRight.position;
float xdis = Mathf.Abs(offset.x);
float ydis = Mathf.Abs(offset.y);
if (xdis > ydis)
{
if (offset.x > 0)
{
sphereMoveObj.transform.Rotate(Vector3.down, offset.magnitude * 80f, Space.World);
}
if (offset.x < 0)
{
sphereMoveObj.transform.Rotate(Vector3.up, offset.magnitude * 80f, Space.World);
}
}
else
{
if (offset.y > 0)
{
sphereMoveObj.transform.Rotate(Vector3.right , offset.magnitude * 80f, Space.World);
}
if (offset.y < 0)
{
sphereMoveObj.transform.Rotate(Vector3.left, offset.magnitude * 80f, Space.World);
}
}
}
}
//右手柄释放抓取按钮时发出
private void VrtkIG_Right_GrabButtonReleased(object sender, ControllerInteractionEventArgs e)
{
isOpertion = false;
}
//右手柄在抓取有效对象时发出
private void VrtkIG_Right_ControllerGrabInteractableObject(object sender, ObjectInteractEventArgs e)
{
if (isRotate)
{
isOpertion = true;
}
}
//当触发器受到少量挤压时发出
private void VrtkCE_Right_TriggerTouchStart(object sender, ControllerInteractionEventArgs e)
{
//切换旋转和平移
if (sphereMoveObj.transform.GetComponent<VRTK_InteractableObject>().allowedGrabControllers == VRTK_InteractableObject.AllowedController.Both)
{
sphereMoveObj.transform.GetComponent<VRTK_InteractableObject>().allowedGrabControllers = VRTK_InteractableObject.AllowedController.LeftOnly;
isRotate = true;
}
else
{
sphereMoveObj.transform.GetComponent<VRTK_InteractableObject>().allowedGrabControllers = VRTK_InteractableObject.AllowedController.Both;
isRotate = false;
}
}