
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”開發人員。