
tmagnetoAccelerometerFusion对象结合了电话传感器输出:
获取电话态度向量。这是手机指向的方向和相对于垂直方向的旋转。该对象计算电话的矩形坐标。这可用于为移动设备供应增强现实应用程序。矩形坐标的许多名称:方位角/高度/滚动或标题/高程/滚动或俯仰/银行/滚动。你选择。
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
跨平台Delphi对象Pascal用于Android和iOS。目前没有Windows支持。
该对象的作用:
iOS版本使用100ms计时器来获取传感器读数。最好使用传感器更改事件,但是我不知道该怎么做。
Android版本使用本机传感器代码(来自Delphiworlds)。还使用了delphi tlocationsensor。在启动GPS传感器之前,对Android和iOS的最新更改都需要明确的许可。
请注意,iOS GPS传感器具有真实的属性,可以直接使用,避免所有这些。但是,当高度越过45度边界时,它会有问题。当时,GPS Trueheading跳了几个度。我的猜测是,当高度超过45度时,iOS会更改矩形坐标轴,我认为这是错误的。没有把握。
在d10.3.3之前的版本中,使用hack通过android上的JNI传递了INT64(Delphi JNi存在一些Endian问题)。纠正编译器时对此进行了评论。观看是否在D10.4.1上使用以前的Delphi版本(即删除hack),看来该错误又回来了,因此该黑客被重新引入:|更新:DEZ20:截至D10.4.1悉尼,Android 32位需要进行的工作。来源更新以解决此问题。
tmagnetoaccelerometerfusion不是一个组件,因此无需将其作为软件包安装。它是在运行时的实例。
将单元添加到用途:磁铁电视计算机输入
添加表单变量: fmagaccelfusion:tmagnetoaccelerometermetermemerfusion;
在FormCreate上:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
实施传感器处理程序:
procedure TfrmMain.FusionSensorHeadingAltitudeChanged(Sender:TObject);
begin
// in this sample just show rectagular coordinates
labMagHeading.Text := Format('m: %5.1f°', [fMagAccelFusion.fTCMagHeading]);
labTrueHeading.Text := Format('t: %5.1f°', [fMagAccelFusion.fTCTrueHeading]);
labAltitude.Text := Format('%5.1f°', [fMagAccelFusion.fAltitude] );
labRoll.Text := Format('%5.1f°', [fMagAccelFusion.fRoll] );
....
...
关于式激活:启动传感器。对于Android,您必须要求使用传感器并在授予权限时开始使用。在iOS上,从形式激活的启动传感器无效。相反,我从计时器开始。请注意,示例应用程序不会以这种方式启动传感器。用户必须手动使用复选框。
添加系统。
procedure TfrmMain.timerStartSensorsiOSTimer(Sender: TObject); // iOS deferred start timer
begin
fMagAccelFusion.StartStopSensors({bStart:} true ); //start ios sensor feed
timerStartSensorsiOS.Enabled := false; //once
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
{$IFDEF Android} // request permissions to start sensor
const PermissionAccessFineLocation = 'android.permission.ACCESS_FINE_LOCATION';
PermissionsService.RequestPermissions([PermissionAccessFineLocation],
procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
begin
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
fMagAccelFusion.StartStopSensors( true ) // bStart=true
else TDialogService.ShowMessage('Location permission not granted');
end)
{$ENDIF Android}
{$IFDEF IOS}
// for IOS I found u cannot start LocationSensor from FormActivate or the sensor breaks
// used a Timer to defer sensor start a couple seconds
timerStartSensorsiOS.Enabled := true;
{$ENDIF IOS}
...
end;

iOS和Android的应用程序。搜索应用程序存储:
“ camsextant” - 使用电话传感器作为带有天体计算器的六分子。最简单的天体导航解决方案。将手机用作完整的Celnav工具(Sextant +计算器)。永久航海年鉴。使用传感器捕获天体对象高度。获取两个或多个景点,您有一个修复(天文位置)+。
“ PlanetFun” - 4D太阳系模型(3D空间+时间)。场景3D摄像头可以连接到电话传感器上,从而创造了增强的现实体验。使用严重的行星年鉴数据(理论与2013年理论来计算PlanetPósitions)。
请参阅https://github.com/omarreis/vsop2013/tree/master/planetfun
“ Navigator HD” - 完整的天体导航工具,具有永久年鉴,子午线通道,位置线,天文位置。带有天体导航基础知识的电子书。
“ OPYC” - 航行游戏。用电话倾斜来引导船。
或搜索“ Omarreis”开发人员。