delphi firemonkey - 通过传感器旋转摄像头

时间:2015-01-13 18:03:45

标签: delphi mobile camera rotation firemonkey

我希望能够在传感器(陀螺仪)移动后旋转3DForm的相机。

每100毫秒一个计时器启动这个方法:

procedure TForm7.Timer1Timer(Sender: TObject);
begin
  if Length(FSensors) > 0 then
    if Assigned(FSensors[0]) then
    begin
      Camera1.RotationAngle.X := OrientationSensor1.Sensor.HeadingX;
      Camera1.RotationAngle.Y := OrientationSensor1.Sensor.HeadingY;
      Camera1.RotationAngle.Z := OrientationSensor1.Sensor.HeadingZ;
    end;
end;

结果不正确,因为智能手机的旋转没有被应用程序中的相机正常跟随(云台锁?)

FireMonkey框架中是否有任何我不知道的方法?

做一些调试,我注意到参数Sensor.HeadingX,HeadingY和HeadingZ的范围从大约-30到+30 ......我的预期值介于0到360之间,或介于0到2之间......

我尝试过(以Embarcadero 为例)使用Sensor.TiltX,TiltY和TiltZ参数,但这些参数总是在Galaxy Note 3和Nexus 4上返回0。

我在Windows 8.1上使用RAD Studio XE7 Professional。

1 个答案:

答案 0 :(得分:0)

我在Embarcadero示例中找到了这段代码:

      {$IFDEF ANDROID} //In Android, Tilt property is returned as vector
        Camera1.RotationAngle.X := FSensor.TiltX * 360;
        Camera1.RotationAngle.Y := FSensor.TiltY * 360;
        Camera1.RotationAngle.Z := FSensor.TiltZ * 360;
      {$ELSE} //In other platforms, Tilt property is returned as degree
        Camera1.RotationAngle.X := FSensor.TiltX;
        Camera1.RotationAngle.Y := FSensor.TiltY;
        Camera1.RotationAngle.Z := FSensor.TiltZ;
      {$ENDIF}