
tmagnetoaccelerotoremerfusionオブジェクトは、次の電話センサー出力を組み合わせます。
電話態度ベクトルを取得します。これは、携帯電話が指している方向と、垂直に関連する回転です。オブジェクトは、電話の長方形の座標を計算します。これを使用して、モバイルデバイス用の拡張現実アプリに電源を入れることができます。長方形の座標の多くの名前:方位角/高度/ロールまたは見出し/標高/ロールまたはピッチ/バンク/ロール。あなたが選ぶ。
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
AndroidおよびiOS用のクロスプラットフォームDelphiオブジェクトパスカル。現時点ではWindowsのサポートはありません。
オブジェクトがすること:
iOSバージョンは、100msタイマーを使用してセンサーの測定値を取得します。センサーの変更イベントを使用する方が良いでしょうが、それを行う方法はわかりません。
Androidバージョンは、ネイティブセンサーコード(Delphiworldsから)を使用します。 Delphi TlocationSensorも使用されます。 AndroidとiOSの両方の最近の変更には、GPSセンサーを起動する前に明示的な許可が必要です。
iOS GPSセンサーにはTrueheadingプロパティがあることに注意してください。これは直接使用でき、これらすべてを避けてください。しかし、高度が45度の境界を越えたときに問題があります。 GPS Trueheadingは、その時点で数度ジャンプします。私の推測では、iOSは高度が45度を超えるときに長方形の座標軸を変更しますが、これは間違っていると思います。わからない。
D10.3.3の前のバージョンでは、AndroidでJNI経由でINT64をパスするためにハックを使用しました(Delphi JNIにはエンディアンの問題がありました)。これは、コンパイラが修正されたときにコメントされました。 D10.4.1で以前のDelphiバージョン(つまり、ハックを削除する)を使用している場合は、バグが戻ってきたので、ハックは再導入されました。更新:DEZ20:D10.4.1シドニーの時点で、Android 32ビットには回避策が必要です。これを修正するためにソースが更新されました。
TmagnetoAccelerotoremerFusionはコンポーネントではないため、パッケージとしてインストールする必要はありません。実行時にインスタンスされています。
使用するユニットを追加: MagnetomerAccelerotoremerFusion
フォーム変数を追加: fmagacceflusion:tmagnetoaccelerotermerfusion;
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] );
....
...
Formactivate:センサーを開始します。 Androidの場合、センサーを使用する許可を求め、許可が付与されたときに開始する必要があります。 IOSでは、Formactivateからセンサーを起動しませんでした。代わりに、私はタイマーから始めました。サンプルアプリケーションはこの方法でセンサーを起動しないことに注意してください。ユーザーは、チェックボックスの使用を手動で開始する必要があります。
System.Permissionsを使用する
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」 - 電話センサーをCelestial Calculatorを備えたセクステントとして使用します。最も単純な天然ナビゲーションソリューション。携帯電話を完全なCelNavツール(Sextant + Calculator)として使用します。永続的な航海暦。センサーを使用して、天体オブジェクトの高度をキャプチャします。 2つ以上の光景を取得すると、修正(天文学的な位置)+があります。
「PlanetFun」-4Dソーラーシステムモデル(3Dスペース+時間)。シーン3Dカメラは電話センサーに取り付けられ、拡張現実体験を作成できます。深刻な惑星の背景データを使用しています(Theory VSOP 2013)。
https://github.com/omarreis/vsop2013/tree/master/planetfunを参照してください
「Navigator HD」 - 永続的な年鑑、子午線の通過、位置の線、天文学的な位置を備えた完全な天のナビゲーションツール。 Celestial Navigation Basicsを備えた電子書籍。
「Opyc」 - セーリングゲーム。電話の傾向でボートを操縦します。
または、「オマレイス」開発者を検索します。