我正在Android中编写一个应用程序,需要知道后置摄像头相对于地平线指向的角度,而不是相对于它的最后位置。我已经为罗盘和加速度计读取的所有定义都没有说我能做到这一点。是否可以这样做?
答案 0 :(得分:3)
您应该使用Accelerometer。
这个想法如下,在静态相机中,作用在相机上的唯一力(加速度计可见)是重力。这应该可以给你哪个方向“向下”。你需要做的是计算摄像机所朝向的方向(这是一个常数,取决于你的加速度计的方向)和重力方向之间的角度。
两个向量的点积(http://en.wikipedia.org/wiki/Dot_product)应该给出向量的余弦(如果两个向量是单位向量),那么使用arccos你应该能够以弧度为单位获得角度。 / p>
根据定义,(true)视界从下降到90º(pi / 2弧度),你应该从点积的结果中减去pi / 2,结果应该在-pi / 2和+ pi /之间2。
-x的结果表示相机正面向“向下”并与地平线成x角。 + x表示摄像机朝向“向上”并与地平线成x角。
答案 1 :(得分:2)
您想要计算的是屏幕表面与地球表面之间的角度(局部平坦)。这可以使用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])
答案 2 :(得分:0)
如果已知摄像机是静态的,则可以使用重力,这必须可以通过应用程序实现,因为有精神级应用程序执行此操作。
上面Cedric Garcias answer和Hoan Nguyens answer更详细地解释了这一点。
如果另一方面相机可能正在移动,那么我认为你必须跟踪所有的动作(使用陀螺仪)并将它们从相机固定的时间点整合到当前时间。这可能非常具有挑战性。