我有一个申请.它有两个活动,一个是用于拍照的自定义相机,另一个是用于显示该图片.
我的要求是每当我拍照时,应该根据拍摄照片时设备的方向以及设备的当前方向显示该照片.您可能在全景应用程序中看到了类似的功能.
例如,假设我拍摄了一张视图并移动了手机,那么我需要以一定角度显示相同的图片.我怎样才能做到这一点?
您应该首先估计设备方向.这最好使用传感器融合实现,请参阅以下教程: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).
我没有包含任何代码,因为我不想偏向您的技术选择.但是通过上面的解释,您应该能够在您选择的语言和库中实现您想要的内容.请告诉我们它是怎么回事.