我正在制作一架AR钢琴,但我一直试图解决这个问题。该项目包括一个纸质钢琴,用户可以在其中播放纸质钢琴,通过AR,应用程序将识别正在播放的键。
我的图像目标与此非常相似:
我在项目中使用Vuforia和Unity 3D,直到现在我所做的是为每个键添加一个虚拟按钮。这对于图像目标正上方的相机非常有效,但我遇到的问题是,当用户弹奏和弦时,还有其他隐藏的键,使应用程序播放不应该播放的音符。当用户播放黑键时会发生同样的情况。
我在youtube上看到了其他类似的项目,发现这个项目在识别黑色音符和和弦方面做得非常好:
https://www.youtube.com/watch?v=FHJ_I6DmFNw
视频和我的项目之间的最大区别在于他们没有将手机放在图像目标的正上方。将电话放在钢琴前面就像在视频中一样有帮助,因为相机现在可以看到正在按下哪些特定按键而其余的手没有隐藏其他按键。我注意到的另一件事是钢琴没有键上的字母,而在我的项目中,如果我删除了音符的名称,我无法使虚拟按钮工作,因为虚拟按钮必须放在丰富的图像上与图像目标的其余部分不同。
问题在于,当我将图像目标和相机放在这个位置时,我无法让应用程序识别图像目标和按钮。
我是否必须更改我的图像目标以使其透视?或者我是否为此目的使用了错误的AR SDK?另外,我如何能够删除音符名称并识别用户手指的位置?
我现在已经尝试了很多东西,如何解决这个问题并获得类似于上述视频的内容对我来说真的很有用。
谢谢
答案 0 :(得分:1)
我刚刚看过视频。看起来像个恶作剧。但是既然你要把它变成现实,我注意到的一件事就是他们不玩黑键。
因此,如果您试图播放黑键,则可能会出现block()
函数,该函数会检测黑键以及下方/旁边的两个白键是否被覆盖。因此,如果发生这种情况,只播放黑键的音调。
例如:如果播放F#,那么
if(pressed(Fsharp) && pressed(F) && pressed(G)){
playsound(Fsharp);
}
为了使其有效运行,请确保在检查单个键是否被单击之前先检查这些条件。这样,你可以从CheckNumberofKeysDown();
开始,然后启动一个线程,通过使用枚举或数组keys[]
中的键来检查键是否在一起,并使用像
//Second touched key compared with the first key's neighbor
if(key[touched[1]]!=key[touched+1]){
playsound(touched[0]);
playsound(touched[1]);
}
所以这些只是我试图弄清楚时想到的一些想法。他们使用它的角度几乎是不真实的。但让相机从另一侧面对你是理想的,因为你可以更好地查看所有按键。
是的,显然你需要很多R& D来完美地工作。希望这能帮助你。还有祝你好运!