Vuforia Virtual Button(虚拟按钮)案例二——按钮事件处理

一、利用Unity3d进行开发


查看这个脚本,是对虚拟按钮的事件进行监听控制。相应地修改按钮的触发事件可以通过这个类进行。

// Add the material corresponding to this virtual button
        // to the active material list:        
		switch (vb.VirtualButtonName)
        {
            case "red":
                mActiveMaterials.Add(m_TeapotMaterials[0]);
                break;

            case "blue":
                mActiveMaterials.Add(m_TeapotMaterials[1]);
                break;

            case "yellow":
                mActiveMaterials.Add(m_TeapotMaterials[2]);
                break;

            case "green":
                mActiveMaterials.Add(m_TeapotMaterials[3]);
                break;
        }

        // Apply the new material:
        if (mActiveMaterials.Count > 0)
            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);

  }

检测是否按下按钮的方法是本地库中定义的。


^_^本团队专业从事移动增强现实应用开发以及解决方案,有合作请私信联系!^_^


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我了解你的问题。首先,您需要在Unity中安装和设置Vuforia AR引擎。然后,您可以按照以下步骤创建一个Virtual Button,并在按下按钮时显示视频: 1. 在Unity中创建一个空白场景,并导入您要显示的视频。 2. 从Vuforia菜单中选择“AR Session”并添加到场景中。 3. 从Vuforia菜单中选择“Image Target”并添加到场景中。 4. 选择“Image Target”,在“Inspector”窗格中选择您要用于识别的图像。 5. 选择“Image Target”,在“Inspector”窗格中选择“Add Component”,然后选择“Virtual Button”。 6. 在“Virtual Button Behaviour”组件中,单击“Create”以创建虚拟按钮。 7. 将视频添加到场景中,并将其放置在场景外。 8. 在“Virtual Button Behaviour”组件中,单击“Add Virtual Button”并将其拖动到场景中的视频上。 9. 在“Virtual Button Behaviour”组件中,设置“Pressed Material”为视频材质,并设置“Enable Play Mode”为“True”。 10. 在“Virtual Button Behaviour”组件中,单击“Add Event”并添加一个新的脚本组件。 11. 在脚本组件中,编写代码以在按下按钮时播放视频。例如: ``` using UnityEngine; using System.Collections; using UnityEngine.Video; public class PlayVideo : MonoBehaviour { public VideoPlayer videoPlayer; void Start () { videoPlayer = GetComponent<VideoPlayer>(); } public void OnButtonPressed() { videoPlayer.Play(); } } ``` 12. 将脚本组件添加到“Virtual Button Behaviour”组件的事件列表中,并将“OnButtonPressed”事件拖动到新的脚本组件中。 现在,当您单击虚拟按钮时,视频应该会播放。希望这能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值