我正在 Android 中编写一个应用程序,它需要知道后置摄像头相对于地平线的角度,而不是相对于它的最后一个位置。我为指南针和加速度计阅读的所有定义都没有说我可以做到这一点。有可能做到这一点吗?
3 回答
您应该使用加速度计。
这个想法如下,在静态相机中,作用在相机上的唯一力(由加速度计看到)是重力。这应该可以告诉你哪个方向是“向下”。然后你需要做的是计算相机所面对的方向(这是一个常数,取决于你的加速度计的方向)和重力方向之间的角度。
两个向量的点积(http://en.wikipedia.org/wiki/Dot_product)应该给你向量的余弦(如果两个向量是单位向量),那么使用 arccos 你应该能够得到以弧度为单位的角度。
由于根据定义,(真实)水平线是向下 90º(pi/2 弧度),您应该从点积的结果中减去 pi/2,结果应该在 -pi/2 和 +pi/2 之间。
-x 的结果意味着相机“朝下”并与地平线成 x 角。+x 的结果意味着相机“向上”并与地平线成 x 角。
您要计算的是屏幕表面与地球表面(局部平坦)之间的角度。这可以使用 TYPE_GRAVITY 或 TYPE_ACCELEROMETER(不太准确)来计算。角度只是地球表面法线与屏幕法线之间的角度(z 值)
angle = (float) Math.acos(normalize z value);
在哪里
normalize z value = event.values[2] / Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2])
如果已知相机是静态的,则可以使用重力,这必须通过应用程序实现,因为有水平仪应用程序可以做到这一点。
Cedric Garcias 的回答和Hoan Nguyens 的回答更详细地解释了这一点。
另一方面,如果相机可能正在移动,那么我认为您必须跟踪所有运动(使用陀螺仪)并将它们从相机固定的时间点整合到当前时间。这可能很有挑战性。