雕刻笔应用开发,3D Systems Openhaptics Unity Plugin插件使用心得

驱动安装:

1、根据设备型号下载对应驱动。

https://3dssupport.microsoftcrmportals.com/knowledgebase/article/KA-01460/en-us 进入官网,下载驱动:

unity打字机动画_3D


2、如果是1394接口,安装Phantom_Device_Drivers_5.1.7_Release:

如果是USB接口,安装Touch_Device_Driver:

3、驱动安装完成后,以管理员身份打开PHANToM Configuration:

unity打字机动画_驱动安装_02


点击Add,添加一个新的名字:Default Device,然后应用。

unity打字机动画_3D_03


unity打字机动画_3D_04


导入插件

1、在Unity商店搜索3D Systems Openhaptics Unity Plugin,下载导入工程:

unity打字机动画_unity打字机动画_05


给笔添加力运行后把Haptic Plugin 脚本上的Physics Manipulation Enable勾上。(这个选项运行后会自动关闭,要用代码更改)

unity打字机动画_System_06


按钮按下事件

(国产设备两个按钮相同效果)

hapticDevice.GetComponent().Buttons [buttonID] == 1

unity打字机动画_3D_07

触碰效果
通常,物体只要改成Touchable标签就有触摸阻挡效果了,如果物体加上了刚体,标签是什么都可以触碰和拿起来。但是有一点需要注意:Touchable标签的物体是根据Mesh Filter来触碰的,非Touchable标签的物体是根据碰撞体来触碰的。

遥控笔移动区域:

在HapticDeviceWithGrabber下的HapticDevice,修改其缩放,就可以改变移动区域了

unity打字机动画_驱动安装_08


unity打字机动画_System_09


Touchable标签的物体由HapticPlugin和HapticGrabber脚本检测到后才起作用的,但检测函数只在运行开始时执行一次。

如果在游戏运行之后添加Touchable标签物体,就需要手动去调用检测函数,分别为:

HapticPlugin里的setupShapes();

HapticGrabber里的disableUnityCollisions();

这两个函数是私有的,要在外面调用,可以自己新建一个公开的方法。

unity打字机动画_3D_10


unity打字机动画_System_11


2D光标

在HapticDeviceWithGrabber下的HapticDevice中添加HapticMouse脚本

unity打字机动画_3D_12


把光标指针挂在Haptic Mouse脚本上的Cursor处,相机也要挂上:

unity打字机动画_unity打字机动画_13


unity打字机动画_驱动安装_14


这个HapticMouse脚本默认是按下每帧执行一次,如果想做成只在按下瞬间执行一次,可以改成如下:

unity打字机动画_System_15


相机旋转

把相机拖到HapticDeviceWithGrabber下,新建一个游戏对象,在其身上挂上CameraRotate脚本。新建两个Image,改名为CameraLeft、CameraRight;放置于屏幕两侧。

unity打字机动画_3D_16


抓取的物体

HapticGrabber脚本下

touching:仅靠刚体和碰撞器抓取的物体

grabbing:标签为Touchable的物体

unity打字机动画_System_17


HapticPlugin脚本下的(HapticGrabber脚本下的标签触碰物体是从这里获取的)

touching:可触碰物体

unity打字机动画_驱动安装_18


unity打字机动画_3D_19

抓取物体时,晃动厉害,可以把物体标签改为非Touchable:

获取触控笔当前碰到的物体
触控笔圆球碰到那个物体就输出那个物体的名字,不用点击按钮,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Now_Obj : MonoBehaviour
{
    public HapticPlugin hapticPlugin;
    private GameObject gameObj;//触控笔当前碰到的物体
    void Start()
    {
        
    }
    void Update()
    {
        gameObj = hapticPlugin.touching;
        if(gameObj != null)
        {
            print ("抓取物:" + gameObj);
        }
    }
}