就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
阅读:3147回复:20

CardBoard与Vuforia6.X中Sample里面的AR-VRdemo的结合

楼主#
更多 发布于:2016-10-14 15:20
继上次的CardBoard视选之后,我准备让CardBoard跟上次的Vuforia里面的AR-VRdemo结合在一起,先上我的成果,先上在蒲公英的网站,现在只有Android版本的,https://www.pgyer.com/VYVa,附上下载的二维码,之前写了一个小时,差不多完工的时候,没保存,心好累啊。

图片:QQ截图20161102155707.jpg



先说一下demo的使用,先进入到界面后,是Cardboard的demo改造成的界面,脚底有两个按钮(需要点击,不可视选),分别是重置中心点跟切换VR模式,既将CardBoard模式变成全屏模式,在正前方,有一个Unity娘跟两个按钮,两个按钮只有一个First是有用的,将视线移到First按钮之后,按钮会变色,并且聚焦1.5s之后,Unity娘会做一个动作,然后切换场景到,Vuforia中的AR_VRdemo中去,扫面下面的识别图,会 出现一座小山,小山上面有一个VR的按钮,同上述视选,可进入VR界面,当低头(角度选好就会出现)时会出现一个AR按钮,视选之后就会回到AR界面。当抬头时也会出现一个AR按钮,因为我忘记改贴图了所以它也是叫AR,但是它的功能是,回到第一个界面也就是CardBoard界面中去,这就是整个APP的全部的功能。

图片:Q674@T[$OEGJFW$TS6{P)J7.jpg





根据我这个比较乱的陈述来开始这个项目。
第一步是一个小难题,就是将两个项目合并在一起,我咨询了下技术大牛跟网上咨询了一点资料得出,有两种形式来整合两个项目,1.最粗暴的方法就是Ctrl +C + V,这种适合将小项目整合过去,比较方便;2.Unity自带的打包成package然后导入到其他项目中去,可能会覆盖些相同名字的文件。具体的导出过程如图所示,导入的话,到另一个工程里面,拖进去,或者在外面双击都可以

图片:QQ截图20161014094107.jpg





第二步,需要将这两个项目整合在一起,首先看到CardBoard中只有一个Scene,但是vuforia中有4个Scene,功能分别是1.vuforia的欢迎界面,2.Vuforia的选择VR模式的界面,一种为双眼模式一种为全屏模式,跟上述中的CardBoard的VR模式类似,这样我们后面就可以把他们两个整合起来3.加载界面,4.主要功能界面。我们这边需要的4,其他三个界面暂时性的用不上,也就第二个界面有用,但是我们在后面会用到。建立关联,肯定要确立先后关系,这个项目比较简单,由CardBoard界面进入Vufoia界面就可以了,所以先改造一个CardBoard界面,我们这边偷点懒,因为之前的小方块已经有点击事件 ,我们就吧小方块变成一个按钮,缩小Z轴的值,改变X,Y轴上面的值就可以让小方块变的像一个按钮了,我那个App中有两个按钮,但只用到一个,剩下那个我留着放其他功能,请无视。然后把按钮里面的方法改成加载Vuforia的Scene就可以了附上小量代码

using UnityEngine.SceneManagement;
SceneManager.LoadScene (SceneManager.GetActiveScene().buildIndex+1);
然后把Scene顺序排号因为我们这边只需要两个Scene所以将两个添加就可以了。

图片:QQ截图20161014095615.jpg




然后进行一些善后的工作,把Canvas中的reset按钮删除

图片:QQ截图20161014150443.jpg




第三步 根据CardBoard中的VR模式跟Vuforia中的VR模式相结合起来,当CardBoard中如果是双眼,那么切换到Vuforia中也要双眼,如果是全屏,Vuforia中也要是全屏,这样说感觉有点难,事实上观察过代码过后并不是非常难,我是一个不太会写代码的人,我只会看看代码,得出别人的逻辑,根据我的观察就是在Vuforia中更改全屏模式的代码为

public void OnStartFullScreen()
{
       ModeConfig.isFullScreenMode = true;
       LoadNextScene();
}
 
public void OnStartViewer()
{
       ModeConfig.isFullScreenMode = false;
       LoadNextScene();
}


第一个方法是全屏为true,第二次方法是双眼为false,再来看CardBoard中怎么改变

public void ToggleVRMode() {
   Cardboard.SDK.VRModeEnabled = !Cardboard.SDK.VRModeEnabled;
 }

CardBoard中直接使用true跟false来判断,多次试验后发现,当为true时,为双眼,当为false时为全屏,刚好跟上面的方法反一反,这样一来我们就可以知道当我么改变CardBoard中的VR模式的时候,我们也要改变Vuforia中的VR模式,当CardBoard为true时设置Vuforia的为false在loadscene方法之前执行,代码如下:
if(Cardboard.SDK.VRModeEnabled!=true){
                        ModeConfig.isFullScreenMode = true;
                }
                if(Cardboard.SDK.VRModeEnabled==true){
                        ModeConfig.isFullScreenMode = false;
                }
这样就能保证两者的同步了,这样一来CardBoard里面的事已经差不多干完了,接下来就是Vuforia中的事情。

第四步,建议新新建一个imagetarget试试水,没试过,其实很难。这是vuforia的基础知识我这边就不再赘述了,论坛里面应该是有的。我这边直接复制了一个案例中的imagetarget,然后改变识别图功能模型,然后你就会发现你的视选是选择不上VRButton的,那就需要找原因了,然后我们找到UserHead下面的ARCamera中有五个东西,分别看下,我英文不好,但能看一点,一个left一个right,肯定代表的是左右眼睛,RAY是射线,REticle是图标,BlackMak,我不清楚是什么,但是我初步估计是射线的接触大小,但我感觉不影响,主要我们这边是射线,所以我们先到射线那边,发现一个数组里面有两个一个是ARButton,还有一个是VRButton,这样就很明显了,这边就是加上射线的接触的方法,我们把size改成3,这样就可以加一个我们自己需要的VRButtom上去了,我们把那个控件拖上去然后再测试一下,就可以了。

图片:QQ截图20161014151045.jpg




第五步也是最后的一步,当我们进入VRWorld的时候需要退出到最初的页面该怎么办,这时候我觉得应该在VRworld里面加,我想不到比较好的方法,自带的是有写Android跟IOS里面后退键的方法,但是还是视选比较方便,然后我发现每次当我低头时自带的按钮就会出来那么我就在想是不是可以在上方做一个按钮出来,然后这个按钮很神奇,一直出现在摄像头的下方,并且自由特定的情况才能出来。查看代码后我们发现它先获取了camera的坐标根据,坐标来确定位置的,先复制一个ARbutton出来跟VRButton一样,先在射线那边加入这个组件,才能被视选。
代码如下:

Camera cam = DigitalEyewearBehaviour.Instance.PrimaryCamera;
   
        // Updte position of ARButton to always be about 2 meters below the camera
        Vector3 camPos = cam.transform.position;
        Vector3 camForwardDir = cam.transform.forward;
        Vector3 camUpDir = cam.transform.up;
        Vector3 lookUpDir = (camUpDir + camForwardDir) / 2;
        Vector3 forwardDir = new Vector3(lookUpDir.x, 0, lookUpDir.z);
        forwardDir.Normalize();
   
        this.transform.position = camPos - 1.5f * Vector3.up + forwardDir;
   
        // Apply rotation and scale
        Vector3 toCameraVec = camPos - this.transform.position;
   
   
  
////////////////////////////////////////////////////////////////////////////////
Camera cam = DigitalEyewearBehaviour.Instance.PrimaryCamera;
   
        Vector2 vp = cam.WorldToViewportPoint(this.transform.position);
        if (vp.x > 0.2f && vp.x < 0.8f && vp.y > 0.2f && vp.y < 0.8f)
        {
            if (mButtonAlpha < 1)
                mButtonAlpha += Time.deltaTime / fadeDuration;
        }
                else if (vp.x > 1.2f && vp.x < 1.8f && vp.y > 1.2f && vp.y < 1.8f)
                {
                        if (mButtonAlpha < 1)
                                mButtonAlpha += Time.deltaTime / fadeDuration;
                }
                else
        {
            if (mButtonAlpha > 0)
                mButtonAlpha -= Time.deltaTime / fadeDuration;
        }
   
   
           
   
        mButtonAlpha = Mathf.Clamp01(mButtonAlpha);
        this.GetComponent<renderer>().material.SetColor("_BaseColor", new Color(1.0f, 1.0f, 1.0f, mButtonAlpha));

后面这段是我改完后的代码,我新建了一个脚本,复制了之前的代码,并把它赋予在了新的ARbutton中去,其实这个ARbutton是退出,else if里面就是根绝摄像机的位置在摄像机的上方出现一个button,这个Button的点击事件一定是loadscene上一个场景,但是直接加是不行的,如代码所示:

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

因为它要传值过去,判断triggerType是不是去AR界面,,所以我们这边需要的是退出,所以现在枚举这边加上
public enum TriggerType
    {        VR_TRIGGER,
        AR_TRIGGER, Quit
    }quit

判断是不是quit,外面选项选择的是quit,为什么要再加不选择新建一个脚本呢,因为在射线那边只认ViewTrigger,不认第二个脚本,除非继承自那个脚本,感觉又会复杂,所以我选择了在枚举中多加一个。

图片:QQ截图20161014151154.jpg

图片:QQ截图20161014151938.jpg

抬头后其实是退出


这些差不多就是全部了,我思路也有点混,应该没有遗漏什么东西,有什么问题可以直接问我,我也是新手,好的就这样了




Demo已更新完成这个demo应该能用,适用于大多数的Android手机,在VR场景中多加了一条毛毛虫,有兴趣的小伙伴可以下载下来试一试
[就是yying于2016-11-02 15:58编辑了帖子]

最新喜欢:

xx1224444xx1224... 归海一啸归海一啸

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2016-10-14 22:24
赞,写的很棒啊
AR学院(www.arvrschool.com),从这里感触未来!
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
板凳#
发布于:2016-10-17 10:51
归海一啸:赞,写的很棒啊回到原帖
感谢归海大大支持
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
地板#
发布于:2016-10-17 14:05
真机测试还是有点问题,我今天使用了真机测试,发现当跳转的时候出现了failed to initialize vuforia,可能是Vuforia跟CardBoard冲突
z24015c
新手
新手
  • UID74
  • 粉丝0
  • 关注0
  • 发帖数14
4楼#
发布于:2016-10-25 17:36
我在真机上面测试也出现了楼上的错误???起冲突了 ?
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
5楼#
发布于:2016-10-27 16:30
z24015c:我在真机上面测试也出现了楼上的错误???起冲突了 ?回到原帖
楼上就是握,我参考了归海大大那边的教程讲道理应该没有错的,导入的方式什么的,在电脑上是可以运行的很奇怪
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
6楼#
发布于:2016-10-27 16:33
归海一啸:赞,写的很棒啊回到原帖
归海大大有一个问题就是在电脑上是可以运行的,但是到了Android真机上面,就会出现Vuforia 没有初始化的问题,这个是cardboard跟Vufoira冲突吗
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
7楼#
发布于:2016-10-27 21:21
就是yying:归海大大有一个问题就是在电脑上是可以运行的,但是到了Android真机上面,就会出现Vuforia 没有初始化的问题,这个是cardboard跟Vufoira冲突吗回到原帖
联网了吗?
AR学院(www.arvrschool.com),从这里感触未来!
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
8楼#
发布于:2016-10-28 08:40
归海一啸:联网了吗?回到原帖
是获取联网的权限还是手机联网,手机的话联网了
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
9楼#
发布于:2016-10-28 09:10
就是yying:是获取联网的权限还是手机联网,手机的话联网了回到原帖
换网络试试,一般这种情况和网络啥的有关
AR学院(www.arvrschool.com),从这里感触未来!
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
10楼#
发布于:2016-10-28 10:20
z24015c:我在真机上面测试也出现了楼上的错误???起冲突了 ?回到原帖
这样的两个配置文件的问题我刚已经解决了,你有android基础的话,把两个配置文件合起来就可以了,没有的话,我发你一个
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
11楼#
发布于:2016-10-28 15:57
归海一啸:换网络试试,一般这种情况和网络啥的有关回到原帖
已经解决,这两个Android配置文件要合并的,我后导入的Cardboard替换了之前的
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
12楼#
发布于:2016-10-28 17:20
就是yying:已经解决,这两个Android配置文件要合并的,我后导入的Cardboard替换了之前的回到原帖
恩,这确实是个问题
AR学院(www.arvrschool.com),从这里感触未来!
kw18988412746
侠客
侠客
  • UID1364
  • 粉丝0
  • 关注1
  • 发帖数13
13楼#
发布于:2016-10-31 21:32
请问如何将这两个Android配置文件合并,我的导入无法替换
就是yying
骑士
骑士
  • UID1386
  • 粉丝0
  • 关注1
  • 发帖数27
  • 社区居民
14楼#
发布于:2016-11-01 13:41
kw18988412746:请问如何将这两个Android配置文件合并,我的导入无法替换回到原帖
说简单其实简单的,你把他们两个配置文件里面的不一样的地方弄出来放一起,你之前用过android就不用这样
上一页
游客

返回顶部