【求助】HTC Vive怎么用xbox one手柄一直旋转去旋转物体

请完成以下验证码
您当前的位置: &
HTC Vive如何利用扳机键拾取和放下物体
查看: 909|
|原作者: 徐海涛
准备一个场景,场景中有一个红色小球抓取物体思路:&1 首先是手柄碰撞体和目标物体处于碰撞中&2 其次按下扳机键&3 最后为目标添加铰链关节,接着将关节连接到手柄碰撞体上下面具体说说zhuaQu.cs这个脚本:注意,能够被抓取的物体可以添加一个标签,非标签的碰撞体是不能够被抓取的&
微信扫一扫
专注于VR的学习、开发和人才交流
&津ICP备号【HTC VIVE】Unity中Vive Controller手柄模型渲染流程和模型替换 - 简书
【HTC VIVE】Unity中Vive Controller手柄模型渲染流程和模型替换
steam VR插件在unity中怎么渲染手柄的模型?下面就从这五点给大家介绍下Unity中Vive Controller手柄模型渲染流程和模型替换,一起来看看吧。版权声明:本文为cartzhang原创文章,未经允许不得转载。作者博客http://blog.csdn.net/cartzhang目录:一手柄渲染总体流程二steam VR渲染三代码分析1.SteamVR_ContollterManagercs文件分析2.SteamVR_RenderModelcs文件分析四修改模型示例1.修改纹理2.修改加载模型3.根据硬件编码直接修改vive手柄的原始模式匹配五参考一、手柄渲染总体流程这篇来讨论和分析一下,steamVR插件在unity中怎么渲染手柄的模型。很多人可能觉得vive手柄很神秘,在steam vr导入到unity中后,没有看到任何手柄或头盔的模型,手柄确确实实被渲染到场景中了,这是怎么回事?这篇文章就来抽丝剥茧的来说明,揭开其面纱。渲染一般的流程,就是模型读取然后加载,显示,这么多。根据代码流程绘制了简单的导图。
图 手柄渲染导图说明下:当前使用的是steam 1.1.1版本插件,而当前最新的插件版本为1.2.1版本,里面代码openvr API做了不少细节的修改,这个修改有一些变化,最明显的的就是steam中event事件调用不在使用字符串来处理,这个很多代码就可能需要修改。首先来看看,在unity中检视板内的排列
图0左右手柄节点,然后是相机节点。左右手柄下有一个模型节点。在不运行的情况下,是这样的。
只有这一个rendermodel这个脚本。先给出个总的手柄渲染代码流程图。
这个图我自己分析画的,不是很专业,但是足以说明问题。下面就会逐个分析来破解这个渲染流程,然后我们再通过代码来自己来修改,把手柄其他模型来看看。首先代码分析,我们可以看到有两个关键代码文件,一个是SteamVR_ContollterManager.cs,一个是SteamVR_RenderModel.cs。他们分别在[CamearRig]和LeftiControl和RightController的Model上。如下图。
图Render我从SteamVR_ContollterManager来看看。第一,在OnEnable来注册硬件连接,也就是手柄连接上的事件。代码中写了注释可以看看,大概也说明了怎么回事。voidOnEnable(){for(inti =0; i{varobj = objects[i];if(obj !=null)obj.SetActive(false);}OnTrackedDeviceRoleChanged();for(inti =0; iif(SteamVR.connected[i])OnDeviceConnected(i,true);SteamVR_Utils.Event.Listen("input_focus", OnInputFocus);//这个用来注册硬件连接事件。事件为steam自己写的事件。SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected);//这个用来注册设备发生了互换事件。SteamVR_Utils.Event.Listen("TrackedDeviceRoleChanged", OnTrackedDeviceRoleChanged);}第二,在注册事件内,产生模型或更新模型。在privatevoidOnDeviceConnected(paramsobject[] args)这里只需要看Refresh()就可以了。第三,Refresh里面的调用了SetTrackedDeviceIndex,而当时被Index与之前不同的时候,会广播”SetDeviceIndex”,SteamVR_RenderModel中最后一个函数就是publicvoidSetDeviceIndex(intindex){this.index=(SteamVR_TrackedObject.EIndex)modelOverride ="";if(enabled){UpdateModel();}}这样代码中就controllerManager文件到了RenderModel文件。进入这个文件里,代码执行的一件事情就是创建模型或更新模式。第一,UpdateModel(),打开这个文件你会发现好几个地方都会调用这个函数。分别为OnModelSkinSettingsHaveChanged(),OnDeviceConnected(),OnEnable(),再有就是刚才的SetDeviceIndex(int index),一般在开始的话,就是从这里开始调用创建的。第二,获取模型名称。怎么获取模型名称呢,这个名称在那里呢?就是在steam安装目录里。
==图片steam模型地址。==代码为://由当前硬件设备的index,来获取设备属性,在设备属性里面有对象的模型名称。varerror =ETrackedPropertyError.TrackedProp_Svarcapacity =system.GetStringTrackedDeviceProperty((uint)index, ETrackedDeviceProperty.Prop_RenderModelName_String,null,0,referror);if(capacity &=1){Debug.LogError("Failed to get render model name for tracked object "+ index);}varbuffer =newSystem.Text.StringBuilder((int)capacity);system.GetStringTrackedDeviceProperty((uint)index,ETrackedDeviceProperty.Prop_RenderModelName_String, buffer, capacity,referror);再说一遍,就是由当前硬件设备的index,来获取设备属性,在设备属性里面有对象的模型名称,也可以说是由硬件里面有标识码,然后根据标识码找到对应的模型名称。这是也做硬件的朋友学过vive开源lighthouse后给我讲述的,就这几行代码中得到验证。第三,有模型名称了,就加载模型。获取模型名称后,获取模型有多少个组件,然后获取组件模型名称。一个手柄模型有多个模型来组成的。可以看看这里,常规的就是用这个来组合的,每个fbx文件就是其中的一个组件。
==图 模型组件==第四,异步加载完模型,加载材质纹理。第五,SetModel(),给检视板中模型添加组件MeshFilter和MeshRender。gameObject.AddComponent().mesh= model.gameObject.AddComponent().sharedMaterial= model.当然,没有组件添加组件,然后把mesh和材质赋值上去。到这里vive手柄模型渲染的过程算是全部分析完毕。最重要的还是文章开始的两张图,一张是思维导图,一张是渲染流程图。修改手柄渲染模型,方法有多中,把新的模型放到场景节点下,直接隐藏显示也是一种方法。这里说几种常用方法。代码直接修改材质,这个需要重新材质texture。这个方法有什么问题呢,就是新版1.2.1的steamvr的插件中,不再是这个样子,而改用了宏,没有使用字符串来做事件监听的方法论。void OnEnable (){//Subscribe to theevent thatiscalledbySteamVR_RenderModel,whenthe controller mesh + texture, has been loaded completely.SteamVR_Utils.Event.Listen("render_model_loaded", OnControllerLoaded);}所以,旧版本steam vr 1.1.1版本的朋友还可以继续使用。参考的代码:这个不太推荐,当然若对你有用,你也记得点赞。在rendermodel代码中修改,模型名称,
这就搞定了。看结果,我的手柄成灭火器了:
图灭火器当然还弄了类似把关二爷的青龙偃月刀,您瞧一眼,手柄变成了大刀。
图 大刀只有做好了模型,这样是不是省心省力啊。神奇吧。这个是最根本上来做的,不需要unity或其他引擎软件,直接修改了手柄硬件 匹配码,这个得从lighthouse付费开源说起了,现在VR行业中百花齐放的手柄硬件应该说绝大多数都是这类产品了。不过,我只知道,没有付费学习过,还请高手赐教。【1】【2】
VR项目研发主管
企业特聘VR专家
VR行业讲师
“福建省青年岗位能手”称号
指导作品获得多项荣誉:
全国3D大赛一等奖1项
全国3D大赛三等奖4项
中国大学生服务外包创新大赛三等奖1项
海峡两岸信息服务创新大赛暨福建省计算机软件设计大赛一等奖3项,二等奖4项,三等奖5项
中国大学生挑战杯课外科技竞赛福建赛区二等奖1项 三等奖1项
福建省挑战杯大学生创业计划竞赛三等奖
福建省大学生智能设计大赛二等奖
福建省互联网+创新创业大赛铜奖
全国3D大赛福建赛区特等奖4项,一等奖8项,二等奖11项,三等奖5项void FixedUpdate()
var device = SteamVR_Controller.Input((int)GetComponent&SteamVR_TrackedObject&().index);
//ATouchpad键 圆盘交互
//触摸触发
if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
Debug.Log(&按下了 “Touchpad” “ ”&);
//方法返回一个坐标 接触圆盘位置
Vector2 cc = device.GetAxis();
//Debug.Log(cc);
// 例子:圆盘分成上下左右
float jiaodu = VectorAngle(new Vector2(1, 0), cc);
Debug.Log(jiaodu);
if (jiaodu & 45 && jiaodu & 135)
Debug.Log(&下&);
if (jiaodu & -45 && jiaodu & -135)
Debug.Log(&上&);
if ((jiaodu & 180 && jiaodu & 135) || (jiaodu & -135 && jiaodu & -180))
Debug.Log(&左&);
if ((jiaodu & 0 && jiaodu & 45) || (jiaodu & -45 && jiaodu & 0))
Debug.Log(&右&);
//按动触发
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
Debug.Log(&用press按下了 “Touchpad” “ ”&);
//方向圆盘最好配合这个使用 圆盘的.GetAxis()会检测返回一个二位向量,可用角度划分圆盘按键数量
//这个函数输入两个二维向量会返回一个夹角 180 到 -180
float VectorAngle(Vector2 from, Vector2 to)
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z & 0 ? -angle :
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9804次
排名:千里之外
转载:11篇
(1)(1)(1)(3)(3)(2)(2)(7)

我要回帖

更多关于 xbox one手柄一直旋转 的文章

 

随机推荐