原文: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);
}
檢測是否按下按鈕的方法是本地庫中定義的。