2

私は Swift を初めて使用します。アプリ インターフェイス用の RealityKit と、これらのビュー コントローラーの 1 つにラップされた SwiftUI 構造体を使用して AR アプリをプログラミングしているので、カスタム AR インターフェイスを作成できます。(それが適切な方法かどうかはわかりませんが、前述したように、独学で今までなんとかできていました)。

とにかく、目的は、ユーザーが指定した緯度と経度に従って AR オブジェクトを配置することです (まだその部分は行っていませんが、手動の値でテストしています)。それを達成するための良いアプローチは、ARGeoTrackingConfiguration()(から私が読んだもの)しかし、私のデバイス(iPhone 7)にはA12 Bionicチップがないため、使用できないため、で実装しようとしていますARWorldTrackingConfiguration()が、これまでのところ、 self.raycast(...).first?.worldTransform.translation で画面上のタッチの位置を取得しようとすると、「内部」保護レベルが原因で「翻訳」にアクセスできません。

extension ARView {

    @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    
        guard let touchInView = sender?.location(in: self) else {
            print("Failed on touch")
            return
        }
    
        let results = self.raycast(from: touchInView, 
                               allowing: .estimatedPlane, 
                              alignment: .horizontal)
        print(results)
    
        if let firstResult = results.first {
            let anchor = ARGeoAnchor(name: "pinus_pinaster.usdz", 
                           coordinate: firstResult.worldTransform.translation)
            self.session.add(anchor: anchor)
        } else {
            print("Object placement failed - coudn't find surface")
        }       
    }
}

この問題を解決する方法についての説明はありますか (例がいいでしょう)?

また、ARKit 開発に関する一般的なアドバイスはありますか? ARGeoTrackingConfiguration() を使用せずに、これらの機能を備えたアプリを実装することは可能でしょうか?

4

2 に答える 2

1

Apple の ARKit ジオ トラッキングの例を使用している場合、変換は Utilities.swift の simd_float4x4 の拡張機能を介してアクセスされることに気付くかもしれません。

extension simd_float4x4 {
    var translation: SIMD3<Float> {
        get {
            return SIMD3<Float>(columns.3.x, columns.3.y, columns.3.z)
        }
        set (newValue) {
            columns.3.x = newValue.x
            columns.3.y = newValue.y
            columns.3.z = newValue.z
        }
    }
}

このコードが行うことは、データ型 simd_float4x4 を拡張し、simd_float4x4 のインスタンスからアクセスできる変換プロパティ (worldTransform.translation など) を作成することです。

于 2021-09-03T20:09:51.103 に答える