Vuforia Virtual Button(虛擬按鈕)案例二——按鈕事件處理

原文:http://blog.csdn.net/ggtaas/article/details/38712891

一、利用Unity3d進行開發


查看這個腳本,是對虛擬按鈕的事件進行監聽控制。相應地修改按鈕的觸發事件可以通過這個類進行。

[csharp] view plaincopy
  1. // Add the material corresponding to this virtual button  
  2.         // to the active material list:          
  3.         switch (vb.VirtualButtonName)  
  4.         {  
  5.             case "red":  
  6.                 mActiveMaterials.Add(m_TeapotMaterials[0]);  
  7.                 break;  
  8.   
  9.             case "blue":  
  10.                 mActiveMaterials.Add(m_TeapotMaterials[1]);  
  11.                 break;  
  12.   
  13.             case "yellow":  
  14.                 mActiveMaterials.Add(m_TeapotMaterials[2]);  
  15.                 break;  
  16.   
  17.             case "green":  
  18.                 mActiveMaterials.Add(m_TeapotMaterials[3]);  
  19.                 break;  
  20.         }  
  21.   
  22.         // Apply the new material:  
  23.         if (mActiveMaterials.Count > 0)  
  24.             mTeapot.renderer.material = mActiveMaterials[mActiveMaterials.Count - 1];  

二、在Eclipse中

使用的版本是SDK3.0.9,samples是3.0.5。


虛擬按鈕sample包下只有這兩個文件,一個主類,一個渲染類。

主類中主要對虛擬按鈕進行設置並創建。

渲染類主要對按鈕事件進行監聽和渲染三維模型。

Vuforia 虛擬按鈕案例執行流程:

先調用這個接口方法:

   public voidonInitARDone(SampleApplicationException exception)

再在該方法中調用private voidsetSampleAppMenuSettings(),在該方法中設置虛擬按鈕的選項:

group =mSampleAppMenu.addGroup("", true);

        group.addSelectionItem(getString(R.string.menu_button_red),

            CMD_BUTTON_RED, true);

       group.addSelectionItem(getString(R.string.menu_button_blue),

            CMD_BUTTON_BLUE, true);

       group.addSelectionItem(getString(R.string.menu_button_yellow),

            CMD_BUTTON_YELLOW, true);

       group.addSelectionItem(getString(R.string.menu_button_green),

            CMD_BUTTON_GREEN, true);

包含按鈕名稱、觸發指令以及是否開啓。

觸發之後執行該接口方法:publicboolean menuProcess(int command)

caseCMD_BUTTON_RED:

                addButtonToToggle(0);

                break;

           

            case CMD_BUTTON_BLUE:

                addButtonToToggle(1);

                break;

           

            case CMD_BUTTON_YELLOW:

                addButtonToToggle(2);

                break;

            

            case CMD_BUTTON_GREEN:

                addButtonToToggle(3);

                break;

再執行這個方法:

private voidaddButtonToToggle(int virtualButtonIdx)

    {

        Log.d(LOGTAG,"addButtonToToggle");

       

        assert (virtualButtonIdx >= 0&& virtualButtonIdx < NUM_BUTTONS);

       

        switch (virtualButtonIdx)

        {

            case 0:

                buttonMask |= BUTTON_1;

                break;

           

            case 1:

                buttonMask |= BUTTON_2;

                break;

           

            case 2:

                buttonMask |= BUTTON_3;

                break;

           

            case 3:

                buttonMask |= BUTTON_4;

                break;

        }

        updateBtns = true;

    }

 

然後這個方法每幀都會執行,publicvoid onQCARUpdate(State state),因此又執行到

 

   if ((buttonMask & BUTTON_1) != 0)

            {

                Log.d(LOGTAG, "ToggleButton 1");

               

               toggleVirtualButton(imageTarget, virtualButtonColors[0],

                    -108.68f, -53.52f, -75.75f,-65.87f);

               

            }

            if ((buttonMask & BUTTON_2) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 2");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[1],

                    -45.28f, -53.52f, -12.35f,-65.87f);

            }

            if ((buttonMask & BUTTON_3) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 3");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[2],

                    14.82f, -53.52f, 47.75f,-65.87f);

            }

            if ((buttonMask & BUTTON_4) !=0)

            {

                Log.d(LOGTAG, "ToggleButton 4");

               

                toggleVirtualButton(imageTarget,virtualButtonColors[3],

                    76.57f, -53.52f, 109.50f,-65.87f);

            }

           

            // Reactivate the data set:

            it.activateDataSet(dataSet);

           

            buttonMask = 0;

            updateBtns = false;

 

最後執行到這個方法就成功創建了四個虛擬按鈕:

booleantoggleVirtualButton(ImageTarget imageTarget, String name,

        float left, float top, float right,float bottom)

注意:在主類中並沒有相應的觸發事件,只是創建了四個按鈕,那麼觸發事件是在哪裏監聽的呢?答案就是渲染類。

在渲染類主要工作有兩個:一是監聽虛擬按鈕觸發事件,二是渲染三維虛擬模型

在renderFrame()方法中,同樣該方法也是會每幀渲染的,所以會一直在監聽和渲染。       

 for (int j = 0; j <VirtualButtons.NUM_BUTTONS; ++j)

                {

                    if(button.getName().compareTo(

                        mActivity.virtualButtonColors[j])== 0)

                    {

                        buttonIndex = j;

                        break;

                    }

                }               

                // If the button is pressed,than use this texture:

                if (buttonResult.isPressed())

                {

                    textureIndex = buttonIndex+ 1;

                }

根據這裏可以修改模型,不同的textureIndex對應不同的模型。

研究這個方法的實現可以看出,

public StringgetName() {

    returnVuforiaJNI.VirtualButton_getName(this.swigCPtr, this);

  }

 

public booleanisPressed() {

    returnVuforiaJNI.VirtualButtonResult_isPressed(this.swigCPtr, this);

  }

檢測是否按下按鈕的方法是本地庫中定義的。


^_^本團隊專業從事移動增強現實應用開發以及解決方案,有合作請私信聯繫!^_^


發佈了11 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章