原文:http://blog.csdn.net/ggtaas/article/details/38712891
一、利用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);
}
检测是否按下按钮的方法是本地库中定义的。