Unity3D

Vuforia切换摄像头后场景中模型颠倒、翻转问题的解决

2017-12-07  本文已影响0人  稚琦

2017.12.08,补充:上下翻转的情况只出现在安卓端,ios端只存在镜像问题

项目中需要使用到Vuforia进行手机摄像头前后切换的功能,在vuforia sdk中默认的是调用手机的后置摄像头,网上查询到动态摄像头切换:

   // 停止识别  
    CameraDevice.Instance.Stop();
    // 取消实例化摄像机
    CameraDevice.Instance.Deinit();
    //实例化相机
    if (_isBackCam)
    {          CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_FRONT);
    }
    else
    {          CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_BACK);
    }
    // 开始识别
    CameraDevice.Instance.Start();
但是,照做之后发现场景中的模型位置不太对了:【用一个简单的demo来说明一下情况】 Screenshot_2017-12-07-16-18-56-997_com.Test.Demo.png

在网上查也没找到什么解决方案,vuforia社区也有老外问这种情况,说要关闭vuforia的镜像,然鹅......我也没有找到

问题是要解决的,找不到就只能自己写了呗,根据看到的情况分析:UI是没有影响的,所以不用管它,所以只需要给场景中的物体进行一定的旋转对称就可以恢复至正常状态,根据看到的情况,首先需要绕着z轴正方向旋转180度,然后位置也需要进行修改:上下翻转【自身位置坐标:y=-y】,最后发现前置摄像头的时候,物体是镜像,所以只需要将自身大小坐标:x=-x即可。

场景中可能不止一个物体,所以新建一个列表,将需要重置的物体添加进去,然后翻转时候对这个列表进行遍历操作即可

List<GameObject> _needRestorationObj = new List<GameObject>();    //放入需要复位的gameobject
bool  _isBackCam  = true;//判断是否是后置摄像头,开始为true

修改后的代码:

private void OverturnCam(){

    for (int i = 0; i < _needRestorationObj.Count; i++)
    {

        //旋转【绕着z轴正方向旋转180度】
        _needRestorationObj[i].transform.RotateAround(_needRestorationObj[i].transform.position, _needRestorationObj[i].transform.forward, 180);

        //上下翻转【自身位置坐标:y=-y】
        _needRestorationObj[i].transform.localPosition = new Vector3(_needRestorationObj[i].transform.localPosition.x, -_needRestorationObj[i].transform.localPosition.y, _needRestorationObj[i].transform.localPosition.z);

        //左右对称【自身大小坐标:x=-x】
        _needRestorationObj[i].transform.localScale = new Vector3(-_needRestorationObj[i].transform.localScale.x, _needRestorationObj[i].transform.localScale.y, _needRestorationObj[i].transform.localScale.z);
    }


    // 停止识别  
    CameraDevice.Instance.Stop();
    // 取消实例化摄像机
    CameraDevice.Instance.Deinit();
    //实例化相机
    if (_isBackCam)
    {
        CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_FRONT);
    }
    else
    {
        CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_BACK);
    }

    // 开始识别
    CameraDevice.Instance.Start();
    _isBackCam = !_isBackCam; 

}

改进后的效果:

Screenshot_2017-12-07-16-40-50-661_com.Test.Demo.png

【完】

上一篇下一篇

猜你喜欢

热点阅读