问题的来源是一个任务:调研AR,识别一张名片,弹出3D模型,最好有互动。由于我是AR新手,最好的途径就是修改官方的例子。名片算是平面图像,对应Vuforia就是ImageTarget,而最容易想到的互动就是加入虚拟按键。
查找官方Sample,发现Virtual Button的例子符合我需要的效果,即识别一张Image,然后在Image的上方中间渲染出一个3D模型(此为一把3D茶壶),并且在Image底部均匀的排列着4个button,手指移到这些button,改变茶壶的颜色(纹理)。我只需要将这个Image换成我的名片就好了。
待我将名片上传到TargetImage,并将生成Database下载解压之后放到程序中读取,在解压之后的xml中加入四个VirtualButton标签,指定虚拟按键的位置。所有的修改做完之后开始运行程序,发现能渲染出茶壶和按钮,但是当手指挡住按钮的大部分区域时,茶壶的颜色乱跳,难道程序没有检测到被按下的按钮吗?
带着这个疑问,我找到了检测按钮是否被按下的代码块:
public void renderFrame(State state, float[] projectionMatrix)
{
...
if (buttonResult.isPressed())
{
Log.i(LOGTAG, i + " is pressed, name is: " + button.getName()); // 在此加上log
textureIndex = buttonIndex + 1;
}
...
}
手指覆盖第一个button时,打印输出的log:
从log中不难发现,程序认为我依次按了3个按钮,实际上我只按了第一个按钮,那么,为什么会这样呢?隐约觉得是我替换的image的问题,难道是虚拟按钮放置的位置不对?经过查阅官方文档,看到了这篇文章