Unity3D for VR 学习(5): VR Gaze Input

 在VR中,最“贴切”的输入方式是眼神,即 VR Gaze Input,如盯着某UGUI UI、某GameObject,2s后触发事件–  显示ToolTip或者切换场景等。 因为这不需要蓝牙手柄输入,显得更自然且方便,风靡VR Gear的Lamper VR游戏,就是Gaze Input(陀螺仪)的典范—可顺利完成游戏的全部过程,的确很酷。

image

 
UGUI UI Gaze 选择

GazeInputModule(继承自PointerInputModule),挂到EventSystem实现。

2 通过输入按钮触发选择事件;或者Gaze 2s,触发选择事件。

   这里使用了raycasting,故要求Canvas是Word坐标系,且要求有raphic Raycaster组件,并挂上Center Eye Camera(其他L、R VR Eye未测试)。

3 EventSystem上,disable StandaloneInputModule & TouchInputModule。

4 会触发IPointEnter事件,通过查看Button的源码知道会触发Button.Hightlight高亮

 

GameObject Gaze 选择

5 在上面UGUI的基础上,给Camera添加PhysicsRaycaster组件

6 给GameObject,如Cube添加相应EventTriger:通过添加EventTrigger组件或者一个继承IPointDown**的脚本,来响应对应的Event即可。

 

备注:在UGUI开源工程中,有很多源码值得解读

如:ExecuteEvents.cs,核心代码片段(IEventSystemHandler):

public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler 
        { 
            var internalHandlers = s_HandlerListPool.Get(); 
            GetEventList<T>(target, internalHandlers); 
            //    if (s_InternalHandlers.Count > 0) 
            //        Debug.Log("Executinng " + typeof (T) + " on " + target);

            for (var i = 0; i < internalHandlers.Count; i++) 
            { 
                T arg; 
                try 
                { 
                    arg = (T)internalHandlers[i]; 
                } 
                catch (Exception e) 
                { 
                    var temp = internalHandlers[i]; 
                    Debug.LogException(new Exception(string.Format("Type {0} expected {1} received.", typeof(T).Name, temp.GetType().Name), e)); 
                    continue; 
                }

                try 
                { 
                    functor(arg, eventData); 
                } 
                catch (Exception e) 
                { 
                    Debug.LogException(e); 
                } 
            }

            var handlerCount = internalHandlers.Count; 
            s_HandlerListPool.Release(internalHandlers); 
            return handlerCount > 0; 
        }

 

如:PhysicsRaycaster.cs ,核心代码片段(Physics.RaycastAll):

public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList) 
        { 
            if (eventCamera == null) 
                return;

            var ray = eventCamera.ScreenPointToRay(eventData.position); 
            float dist = eventCamera.farClipPlane – eventCamera.nearClipPlane;

            var hits = Physics.RaycastAll(ray, dist, finalEventMask);

            if (hits.Length > 1) 
                System.Array.Sort(hits, (r1, r2) => r1.distance.CompareTo(r2.distance));

            if (hits.Length != 0) 
            { 
                for (int b = 0, bmax = hits.Length; b < bmax; ++b) 
                { 
                    var result = new RaycastResult 
                    { 
                        gameObject = hits[b].collider.gameObject, 
                        module = this, 
                        distance = hits[b].distance, 
                        worldPosition = hits[b].point, 
                        worldNormal = hits[b].normal, 
                        screenPosition = eventData.position, 
                        index = resultAppendList.Count, 
                        sortingLayer = 0, 
                        sortingOrder = 0 
                    }; 
                    resultAppendList.Add(result); 
                } 
            } 
        }

 

源码下载地址:http://pan.baidu.com/s/1hqYX2Ry 

【按住Alt + 鼠标。 到Cube上后,2s触发“Selected”事件】

 

参考英文:Gaze Fuse Buttons in Unity


转载请注明转自《 Unity3D for VR 学习(5): VR Gaze Input
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值