Skip to main content
 首页 » 资源教程 » Vuforia教程

Vuforia应用之相机自动对焦功能

2016年09月06日 21:45:3115610

在一些卡牌(卡片)游戏应用上,如果不能很好的对焦就会导致用户体验不佳,假若让系统相机去自动对焦这样出来的效果就会好很多,好的下面来说说——

说之前,先科普一下,不喜略过直接往下看哈~

        对焦也叫对光、聚焦。通过照相机对焦机构变动物距和相距的位置,使被拍物成像清晰的过程就是对焦。而对焦的方式有以下几种:自动对焦、手动对焦、多重对焦以及全息自动对焦、我们这里讲的就是自动对焦,传统相机上的傻瓜式对焦方法。以下是相关的代码实现:

        基于触摸屏,一种是直接将脚本文件挂载到ARCamera,一种是用NGUI、将其放到新建的GameManger底下,不过两种思路都是相同的,自动对焦的代码要写在start()方法里面,如图:(切记:using Vuforia;这个需要在一开始新建的脚本中引入)

Vuforia应用之相机自动对焦功能 Vuforia教程 第1张

              

Vuforia应用之相机自动对焦功能 Vuforia教程 第2张

接下来分析代码:


[csharp] view plain copy
  1. //自动对焦变量  

  2.     private string label;  

  3.     private float touchduration;  

  4.     private Touch touch;  

Start()方法,初始化并进行自动对焦调用



[csharp] view plain copy
  1. void Start () {  

  2.           

  3.         if (Input.touchCount > 0)  

  4.         {  

  5.             touchduration += Time.deltaTime;  

  6.             touch = Input.GetTouch(0);  

  7.             if (touch.phase == TouchPhase.Ended && touchduration < 0.2f)  

  8.             {  

  9.                 StartCoroutine("SingleOrDouble");  

  10.             }  

  11.         }  

  12.         else  

  13.         {  

  14.             touchduration = 0;  

  15.         }  

  16.     }  

[csharp] view plain copy
  1. IEnumerator SingleOrDouble()  

  2.     {  

  3.         yield return new WaitForSeconds(0.3f);  

  4.         if (touch.tapCount == 1)  

  5.         {  

  6.             Debug.Log("Single");  

  7.             OnSingleTapped();  

  8.         }  

  9.         else if (touch.tapCount == 2)  

  10.         {  

  11.             StopCoroutine("SingleOrDouble");//否则会触发两次Double Touch  

  12.             Debug.Log("Double");  

  13.             OnDoubleTapped();  

  14.         }  

  15.     }  

  16.   

  17.     private void OnSingleTapped()  

  18.     {  

  19.         TriggerAutoFocus();  

  20.         label = "Tap the Screen!";  

  21.     }  

  22.   

  23.     private void OnDoubleTapped()  

  24.     {  

  25.         label = "Double Tap the Screen!";  

  26.     }  

触发自动对焦方法:



[csharp] view plain copy
  1. public void TriggerAutoFocus()  

  2.     {  

  3.         StartCoroutine(TriggerAutoFocusAndEnableContinuousFocusIfSet());  

  4.     }  

  5.   

  6.     private IEnumerator TriggerAutoFocusAndEnableContinuousFocusIfSet()  

  7.     {  

  8.         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);  

  9.         yield return new WaitForSeconds(1.0f);  

  10.         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  

  11.     }  

  12.   

  13.     void OnGUI()  

  14.     {  

  15.         GUI.Label(new Rect(10, 0, 100, 100), "-&-C*-Z*-D*-&->" + label);  

  16.     }  

最后在update()方法写上:



[csharp] view plain copy
  1. void Update () {  

  2.   

  3.         if (Input.GetKey(KeyCode.Escape))  

  4.         {  

  5.             Application.Quit();  

  6.         }  

  7. }  

有的童鞋,也将自动对焦的代码写在update()方法里面,即是start()方法空着,由于我这边的功能实现上还有别的,所以我做了这样的处理,希望大家多多交流哈,不吝赐教。


[csharp] view plain copy
  1. using UnityEngine;  

  2. using System.Collections;  

  3. using Vuforia;  

  4.   

  5. public class AutoFocusControl : MonoBehaviour {  

  6.   

  7.     private string label;  

  8.     private float touchduration;  

  9.     private Touch touch;  

  10.   

  11.     // Use this for initialization  

  12.     void Start () {  

  13.       

  14.     }  

  15.       

  16.     // Update is called once per frame  

  17.     void Update () {  

  18.         if (Input.GetKey(KeyCode.Escape))  

  19.         {  

  20.             Application.Quit();  

  21.         }  

  22.         if (Input.touchCount > 0)  

  23.         {  

  24.             touchduration += Time.deltaTime;  

  25.             touch = Input.GetTouch(0);  

  26.             if(touch.phase == TouchPhase.Ended && touchduration < 0.2f)  

  27.             {  

  28.                 StartCoroutine("SingleOrDouble");  

  29.             }  

  30.         }  

  31.         else  

  32.         {  

  33.             touchduration = 0;  

  34.         }  

  35.     }  

  36.   

  37.     IEnumerator SingleOrDouble()  

  38.     {  

  39.         yield return new WaitForSeconds(0.3f);  

  40.         if (touch.tapCount == 1)  

  41.         {  

  42.             Debug.Log("Single");  

  43.             OnSingleTapped();  

  44.         }  

  45.         else if (touch.tapCount == 2)  

  46.         {  

  47.             StopCoroutine("SingleOrDouble");  

  48.             Debug.Log("Double");  

  49.             OnDoubleTapped();  

  50.         }  

  51.     }  

  52.   

  53.     private void OnSingleTapped()  

  54.     {  

  55.         TriggerAutoFocus();  

  56.         label = "Tap the Screen!";  

  57.     }  

  58.   

  59.     private void OnDoubleTapped()  

  60.     {  

  61.         label = "Double Tap the Screen!";  

  62.     }  

  63.   

  64.     public void TriggerAutoFocus()  

  65.     {  

  66.         StartCoroutine(TriggerAutoFocusAndEnableContinuousFocusIfSet());  

  67.     }  

  68.   

  69.     private IEnumerator TriggerAutoFocusAndEnableContinuousFocusIfSet()  

  70.     {  

  71.         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);  

  72.         yield return new WaitForSeconds(1.0f);  

  73.         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  

  74.     }  

  75.   

  76.     void OnGUI()  

  77.     {  

  78.         GUI.Label(new Rect(10, 0, 100, 100), "---->" + label);  

  79.     }  

  80. }  

最后的最后,说说一些综合的东西。


1.测试在手机上面实测,效果比较明显

2.关于vuforia sdk 3.x和4.x的代码异同,当然现在已经去到5.x版本了,不过拾人牙慧,以下上代码:

3.x版本的:


[csharp] view plain copy
  1. void Start () {  

  2.         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  

  3.     }  

4.x版本的:



[csharp] view plain copy
  1. void Start () {  

  2.        Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  

  3.   

  4. }  




附录:相关文章  AR自动对焦


评论列表暂无评论
发表评论