-3

我有一个应用程序。它有两种活动,一种是用于拍照的定制相机,另一种是展示该照片。

我的要求是,每当我拍照时,这张照片都应该根据拍摄照片时设备的方向和设备的当前方向显示。您可能已经在全景应用程序中看到过类似的功能。

例如,假设我拍摄了一张视图的照片并移动了我的手机,那么我需要以一个角度显示同一张照片。我怎样才能做到这一点?

4

1 回答 1

13

您应该首先估计设备方向。这最好使用传感器融合来实现,请参阅以下教程:http ://www.thousand-thoughts.com/2012/03/android-sensor-fusion-tutorial/ 。方向应表示为矩阵或四元数。如果您可以选择,请首选四元数,因为算法将运行得更快。

对于应用程序的其余部分,让我们使用 3D 引擎来显示您已经拍摄的照片。您可以选择 3D 引擎,选择您最熟悉的引擎。我们将在 3D 引擎中将已拍摄的照片显示为带纹理的矩形。

首先,我们必须确定这些纹理矩形的大小。我们必须选择显示矩形的距离:这是任意的,我们取 1 米。然后我们需要知道相机的水平和垂直视场角,这取决于设备。为了便于解释,让我们假设我们使用 60 度水平和垂直视场(方形)相机。这些照片相当于距离观察者 1m 的 1m x 1m 方格。这是简单的三角函数,希望你能形象化。如果您需要更多解释,请告诉我。

当方向角为空时,我们可以数学计算矩形的坐标。在我们之前的示例中,正方形的坐标为 (+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_角度)。

我没有包含任何代码,因为我不想影响您的技术选择。但是通过上面的解释,你应该能够用你选择的语言和库来实现你想要的。请告诉我们进展如何。

于 2014-01-16T18:48:07.183 回答