就是yying
侠客
侠客
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数26
  • 社区居民
阅读:751回复:3

关于CardBorad中DemoScene视选的简单实现

楼主#
更多 发布于:2016-10-10 16:26
本人小白,刚入门学习VR,接触了归海大大教程中的CardBoard教程,因为这两天手机坏了,所以只能用电脑直接跑,发现电脑中按钮需要鼠标单击,那放在Cardboard中那就需要旁边的磁铁,感觉不方便,因为之前用过Vuforia中的混合视觉,又听了归海大大说的视选,所以,突然出现一个想法就是把CardBoard中的DemoScene变成视选的。第一次写教程,在加上也刚玩VR,请各位多多给出建议,我会把我的思路提供出来。
首先我参考的是Vuforia6中的ARVR-6-0-112那个例子,在例子中中心点有一个黄点,扫描识别图出模型后,出现一座山以及一个AR的按钮,当焦点移到AR按钮的时候焦点会变绿,停留1.5s后会进入到VR世界中,同理VR世界中也有一个类似的按钮。这个CardBoard中小方块类似,小方块是当焦点在小方块上时变绿,不在小方块上时变红,当单击小方块或者滑动磁铁时,小方块会随机移动到其他地方。下面为ARVR中ViewTrigger的部分代码,我加上了一点点注释,方便查看。


    public TriggerType triggerType = TriggerType.VR_TRIGGER;//初始化
    public float activationTime = 1.5f;//焦距规定时间
    public Material focusedMaterial;//点到的时候材质
    public Material nonFocusedMaterial;//未点到时候的材质
    public bool Focused { get; set; }//判断是否
    #endregion // PUBLIC_MEMBER_VARIABLES


    #region PRIVATE_MEMBER_VARIABLES
    private float mFocusedTime = 0;//焦距时间
    private bool mTriggered = false;
    private TransitionManager mTransitionManager;
    #endregion // PRIVATE_MEMBER_VARIABLES


    #region MONOBEHAVIOUR_METHODS
    void Start()
    {
        mTransitionManager = FindObjectOfType<transitionmanager>();
        mTriggered = false;//不进入下一步
        mFocusedTime = 0;//初始焦距时间
        Focused = false;//初始为否点中
        GetComponent<renderer>().material = nonFocusedMaterial;//初始材质为没有点钟的材质
    }

    void Update()
    {
                if (mTriggered)
                        return;

        UpdateMaterials(Focused);//点中或者没点中更改材质

                bool startAction = false; //是否单击
                if (Input.GetMouseButtonUp (0)) //判断是否左击
                {
                        startAction = true;
                }

        if (Focused)//如果点中
        {
            // Update the "focused state" time
            mFocusedTime += Time.deltaTime;
                        if ((mFocusedTime > activationTime) || startAction)//单击或者停留1.5s
            {
                mTriggered = true;//可以进入下一个场景
                mFocusedTime = 0;//初始化聚焦值
                
                // Activate transition from AR to VR or vice versa
                bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER);
                mTransitionManager.Play(goingBackToAR);//根据场景改变到另一个场景
                StartCoroutine(ResetAfter(0.3f*mTransitionManager.transitionDuration));
            }
        }
        else
        {
            // Reset the "focused state" time
            mFocusedTime = 0;
        }
    }


根据这些代码,我有点思路就是先确定一个时间这个时间就是停留几秒后进入的时间,再有一个时间是记录的时间,记录已经过了几秒了,但是cardboard中demo与Vuforia中的不一致,因为Vuforia中已经使用了视选,并且高通中判断使用的是鼠标单击也是可以的,而在cardboard中使用的EventSystem中 Event Trigger来判断Point既GazePointer的选中,退出以及点击

public void SetGazedAt(bool gazedAt) {
 GetComponent<Renderer>().material.color = gazedAt ? Color.green : Color.red;
}
这是判断选中跟没选中时小方块颜色的变化,选中为true 时小方块变绿色,为false时小方块变红,先根据思路来,先设定一个停留几秒后进入的时间,为time1,初始值为1.5s,再设定一个记录的时间,为time2,初始值为0,因为要实时的判断有没有停留1.5s以上所以我创建了一个FIxedUpdate来实时的刷新。


 void FixedUpdate(){
 FouseTime += Time.deltaTime;//FouseTime为time2
 if (FouseTime > ActiveTime) {//ActiveTime为time1
 TeleportRandomly ();//单击的方法
 }
 }
这样看着不错,但这样获取不到有没有被选中,所以先创建一个bool 型的变量来接收是否黄点在小方块上,然后再去FixedUpdate方法里面判断是否在小方块上,是的话才触发。


 void FixedUpdate(){
 if (isTrue) {
 FouseTime += Time.deltaTime;
 if (FouseTime > ActiveTime) {
 TeleportRandomly ();
                                 FouseTime = 0;
 }
 }
 }
 public void SetGazedAt(bool gazedAt) {
 GetComponent<Renderer>().material.color = gazedAt ? Color.green : Color.red;
 if (gazedAt == true) {
 isTrue = true;
 } else {
 FouseTime = 0;
 isTrue = false;
 }
 }

在else中跟单击方法之后为什么要把FouseTime归0,else中因为时间会累加是在选中的时候,不选中的时候不累加,并且在不选中的时候应该把原来的累加的FouseTime清空,如果FouseTime 累加到了1,.4s后移开了,不清空,下一次选中后只需要0.1就会执行单击事件;单击方法之后是因为单击后已经超过了1.5s,比如过了2s,不清空每次进来都是比2s高的数据,不需要停留就能执行点击方法,所以也需要清空。
第一次写,写的不好,望大家指点

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2016-10-11 09:22
多谢分享哈~
AR学院(www.arvrschool.com),从这里感触未来!
lwl123
骑士
骑士
  • UID365
  • 粉丝2
  • 关注10
  • 发帖数98
  • 社区居民
  • 忠实会员
板凳#
发布于:2017-03-10 10:36
学习学习,但是好像看的不太透
lwl123
骑士
骑士
  • UID365
  • 粉丝2
  • 关注10
  • 发帖数98
  • 社区居民
  • 忠实会员
地板#
发布于:2017-03-10 10:37
代码是写在ViewTrigger里的么?以前的需要修改么?
游客

返回顶部