我有一个申请。它有两个活动,一个是用于拍照的自定义相机,另一个是用于显示该图片。
我的要求是每当我拍照时,应根据拍摄照片时设备的方向以及设备的当前方向显示此照片。您可能在全景应用程序中看到了类似的功能。
例如,假设我拍摄了一张视图并移动手机,那么我需要以一定角度显示相同的图片。我怎么能这样做?
答案 0 :(得分:13)
您应首先估算设备方向。最好使用传感器融合实现,请参阅以下教程:http://www.thousand-thoughts.com/2012/03/android-sensor-fusion-tutorial/。方向应表示为矩阵或四元数。如果你有选择,首选四元数,因为算法运行得更快。
对于您的应用程序的其余部分,我们使用3D引擎显示您已拍摄的照片。您可以选择3D引擎,选择您最熟悉的引擎。我们将在3D引擎中显示已经作为纹理矩形拍摄的照片。
首先,我们必须确定这些纹理矩形的大小。我们必须选择显示矩形的距离:这是任意的,我们需要1米。然后我们需要知道摄像机的水平和垂直视角,这取决于设备。为了解释这个问题,让我们假设我们使用60度水平和垂直视场(方形)相机。这些照片相当于距离观察者1米的1米x 1米的正方形。这是简单的三角函数,我希望你能想象它。如果您需要更多解释,请告诉我。
当方向角为空时,我们可以数学计算矩形的坐标。在前面的例子中,正方形将具有坐标(+0.5,+ 0.5),(+ 0.5,-0.5),( - 0.5,-0.5),( - 0.5,+ 0.5)。每次我们拍摄照片时,我们都会计算其坐标,通过方向四元数/矩阵旋转零角度坐标。然后,我们可以在这些坐标处添加纹理矩形并将照片作为纹理添加到3D引擎。
我们现在需要做的就是在设备方向改变时更新相机的方向。这是通过3D引擎完成的,可能旋转所有注册对象与方向旋转四元数/矩阵相反,但这实际上取决于您的API。如果需要,您还可以覆盖当前的摄像机图像。
在上面的解释中,我拍摄了一个60度水平和垂直视野的方形相机,以帮助您想象会发生什么。零角度矩形坐标的数学公式是(X,Y),(X,-Y),( - X,-Y),( - X,Y)其中X = sin(X_angle)和Y = sin( Y_angle)。
我没有包含任何代码,因为我不想偏向您的技术选择。但是通过上面的解释,您应该能够在您选择的语言和库中实现您想要的内容。请告诉我们它是怎么回事。