目录:

       HTC Vive之Unity3d开发日记

You can fool all the people some of the time,and some of the people all the time,but you can`t fool all the people all the time.  __Abraham Lincoln , American president

你可以在某些时间里欺骗所有的人,也可以在所有的时间里欺骗某些人,但你决不能在所有的时间里欺骗所有的人.

先引用俺的偶像之一林肯的一句名言,我们也许暂时不知道事情的真相,但是我们总有一天会知道的!

B格有了!继上一篇,如果你已经把设备和插件准备就绪,这一篇将先对目前的开发资源进一步整理,然后再对SteamVR Plugin进行解析.

>0       HTC Vive 开箱 + 简易评测(从购买到游戏调试安装)上

>1        HTC Vive 开箱 + 简易评测(从购买到游戏调试安装)下

这两篇算是一个前期准备工作指南!

>2        【浸入VIVE开发】三分钟用Unity3D开发第一个VR程序

这一篇算是一个基础教学!

>3        基于Unity+HTC VIVE的VR游戏开发

这一篇算是一个中级教学,我从中学到了不少知识,但是缺乏对代码的深度解析,而这个将是我接下来要做的.当然,我希望阁下可以抽时间对这些资源进行深入的理解,这将有利于我们之后可以一起来探讨!

 

如图,我们要实现的是:通过代码来实现对手柄的全面掌控,重点在于交互,至于如何开发一款VR游戏是在实现交互以后需要探讨的事情,我们一步一个脚印来探索!

 

第一步,如图,我们已经导入了SteamVR Plugin,下面的SteamVR绿色图标表明Htc Vive的硬件也已经准备就绪,这是SteamVR_TestThrow场景,也是我们展开分析的入手点.这个测试很简单,就是你按下Trigger的时候,手柄上会实例化一个圆球+cube的结合体,当然松开Trigger的时候这个结合体就会脱离手柄,当然,你还可以施加一个扔的动作,这样的话结合体会有一个对应的加速度.

 

手柄是HTC Vive的重要交互手段,我们通过第一个图片应该对其有一个直观的了解了,总共是九个按钮:

第一个是菜单按钮;

2,3,4,5分别对应的是Trackpad/Touchpad的上下左右,有时候对应的是XBox手柄的▲OX囗四个按钮或者摇杆;

6对应的是系统按钮/Steam;

7是Trigger/扳机,对应大多数FPS游戏里面的枪械的Shoot/Fire;

8对应的Grip/紧握在手柄的左右两侧各有一个,有时候我们用它来翻页;

9其实是Trackpad/Touchpad在Z轴的一个延伸,相当于是点击事件Click.

接下来就可以直接上代码了!

纯文本查看  复制代码

?

Ok,在下已经注释得非常清楚了,重点在于Trigger/扳机的交互:device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger)按下扳机时返回真和device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)松开扳机时返回真.

更进一步,我们通过解析SteamVR_TrackedController来看看其他按钮事件:

纯文本查看  复制代码

?

SteamVR_TrackedController是基于OpenVR来实现手柄交互的,虽然是开源的,可惜我的水平有限,希望有大神可以讲讲OpenVR,当然,我们理解OpenVR的话当然是最好,如果不知道也是可以实现交互的,我们只需要去调用就可以了.

我这里也没有解析清楚,大家作为涉猎即可,大概知道有这么回事儿,下一篇我们可以继续研究SteamVR_GazeTracker,SteamVR_LaserPointer,SteamVR_Teleporter,敬请期待!

BTW,如果你有HTC Vive的开源程序希望可以分享一个给我,用于研究学习,在此谢谢了先!

其实我最希望Valve能开源The Lab,或者哪位大神有源码!

unity3d fps 游戏源码;unity3d的fps游戏源码

using               UnityEngine;             

              using               System.Collections;             

                            

              [RequireComponent(              typeof              (SteamVR_TrackedObject))]             

              public               class               SteamVR_TestThrow : MonoBehaviour             

              {             

                                    //预设,用于投掷的物体             

                                    public               GameObject prefab;             

                                    //位于手柄上的刚体,也就是预设物体出现的地方             

                                    public               Rigidbody attachPoint;             

                            

                                    //追踪的设备,这里是我们的手柄             

                                    SteamVR_TrackedObject trackedObj;             

                                    //固定关节             

                                    FixedJoint joint;             

                            

                                    void               Awake()             

                                    {             

                                            //获取追踪的设备,即手柄             

                                            trackedObj = GetComponent<SteamVR_TrackedObject>();             

                                    }             

                            

                                    void               FixedUpdate()             

                                    {             

                                            //获取手柄的输入,也就是用户的输入             

                                            var device = SteamVR_Controller.Input((              int              )trackedObj.index);             

                                            //如果关节为空 且 用户按下扳机             

                                            if               (joint ==               null               && device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))             

                                            {             

                                                    //把预设实例化并设置其位置在手柄上的指定位置,这个指定位置就是手柄上的那个圈圈             

                                                    var go = GameObject.Instantiate(prefab);             

                                                    go.transform.position = attachPoint.transform.position;             

                            

                                                    //把关节组件添加到实例化的对象上,链接的位置就是这个刚体,添加这个组件的目的就是为了当你松开Trigger的时候分开手柄和预设物体             

                                                    //这个FixedJoint组件实际上就是一个关节,作用是链接两个物体             

                                                    joint = go.AddComponent<FixedJoint>();             

                                                    joint.connectedBody = attachPoint;             

                                            }             

                                            //又如果关节不为空 且 手柄上的扳机Trigger松开的时候             

                                            else               if               (joint !=               null               && device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))             

                                            {             

                                                    //获取关节上的游戏对象,获取其刚体             

                                                    var go = joint.gameObject;             

                                                    var rigidbody = go.GetComponent<Rigidbody>();             

                                                    //立即摧毁关节,并置为空             

                                                    Object.DestroyImmediate(joint);             

                                                    joint =               null              ;             

                                                    //15秒后摧毁该对象             

                                                    Object.Destroy(go, 15.0f);             

                            

                                                    // We should probably apply the offset between trackedObj.transform.position             

                                                    // and device.transform.pos to insert into the physics sim at the correct             

                                                    // location, however, we would then want to predict ahead the visual representation             

                                                    // by the same amount we are predicting our render poses.             

                                                    //大概意思是:我们也许应该在正确的位置应用trackedObj.transform.position和device.transform.pos之间的偏移量到物理模拟中去             

                                                    //然而,如果那样的话我们就想要预测和渲染动作同样数量的视觉位置             

                            

                                                    //原始位置有的话就是原始位置,没有的话取其父类             

                                                    var origin = trackedObj.origin ? trackedObj.origin : trackedObj.transform.parent;             

                                                    if               (origin !=               null              )             

                                                    {             

                                                            //取其速度和角度             

                                                            rigidbody.velocity = origin.TransformVector(device.velocity);             

                                                            rigidbody.angularVelocity = origin.TransformVector(device.angularVelocity);             

                                                    }             

                                                    else             

                                                    {             

                                                            rigidbody.velocity = device.velocity;             

                                                            rigidbody.angularVelocity = device.angularVelocity;             

                                                    }             

                                                    //最大角速度             

                                                    rigidbody.maxAngularVelocity = rigidbody.angularVelocity.magnitude;             

                                            }             

                                    }             

              }

开发,  日记 ,  话题

本主题由 朱迪 于 2016-5-9 0