2017-07-25 4 views
3

ARKitはかなり新しいものであると私は迅速に非常に新しいです...だから私は...スウィフト:ARKit保存ARPlaneAnchor次のセッションのための

をいくつかのトラブルを抱えている私は、A中に検出ARPlaneAnchorを保存したいのですが私のアプリを再起動するときにセッションを再ロードしてください。私の電話は常に同じ場所にあり、私は部屋を一度スキャンしたいと思います。そして、私がアプリを起動するたびに、私が部屋に見つけたアンカーを思い出してください。

は、私はいくつかのソリューションを試してみました:

解決法1: 保存ARPlaneAnchor使用:キャッチされない例外により 'NSInvalidArgumentException' に

アプリを終了:私はこのエラーを得た

NSKeyedArchiver.archiveRootObject(plane, toFile: filePath) 、理由: ' - [ARPlaneAnchor encodeWithCoder:]:インスタンスに送信された認識できないセレクタ

0私はアプリを起動したときに ARPlaneAnchorの件のデータが、それらをintantiateストア:

は、私は多分、私はローカルにデータのこの種

対処方法2を保存することはできませんと思います。データは主にフロートしています。私はARAnchorを簡単に作成することができました。ARPlaneAnchorとしてキャストできましたが、ARPlaneAnchorの "center"と "extend"パラメータは変更できませんでした。だから私は良いアンカーを作成することはできません。

私はanysolutionにオープンしています。私はARAnchorオブジェクトを格納する必要があると思いますが、今はクラッシュなしにそれを行う方法を見つけることができませんでした! 誰かが私を助けることができたら、私はとても感謝しています。

+0

理由ますエラーは 'ARPlaneAnchor'が' NSCoding'に従っていないということです。 – Paolo

+0

ありがとうございます。 NSCodingに準拠させる方法はありますか?またはこの種のデータを保存するために別の方法を使用する必要がありますか? – mcarlier

答えて

5

最初にデバイスが永続的にインストールされ、ユーザーが決して移動または回転できない状況に制限されている場合、ARKitを使用してカメラのフィードにオーバーレイコンテンツを表示すると、「蚊を殺す大砲 "のような状況です。あなたの3Dエンジンが必要とするカメラ投影の種類を開発時に試してみることもできます。3Dエンジンを搭載した「ダム」カメラフィードを使用し、iOS 11やARKit対応デバイスは必要ありません。

特定のソリューションと回避策を実行する前に、ユースケースまたはテクノロジスタックについてもう少し考えてみてください。あなたのより具体的な問題については


そのユースケースは完全に読み取り専用であるため、...

ARPlaneAnchorは、完全に読み取り専用のクラスです。 ARKitに検出された航空機に関する情報を与える方法を与える唯一の目的のために存在します。しかし、いったんその情報があれば、それをあなたが望むものと一緒にすることができます。そこからは、式の中にARPlaneAnchorを残す必要はありません。

はおそらく、あなたはので、平面検出(とSceneKitベースのディスプレイ)のための典型的な使用例混乱している:ARPlaneAnchorオブジェクト

  • Inを受信するrenderer(_:didAdd:for:)に平面検出
  • 応答し上

    1. 電源を入れますそのメソッドは、プレーンアンカーに関連付けられるように仮想コンテンツを返します
    2. ARSCNViewは、プレーンの位置に従うようにコンテンツを自動的に配置します。

    あなたの飛行機の位置がカメラに対して静的である場合、そのすべてが必要なわけではありません。

    あなたが唯一の平面検出がライブである場合であること(ARKitは、平面の位置と範囲の見積りを洗練してアンカーを更新してその配置は、継続的な管理を必要とする場合ARKitは、シーン内のコンテンツの配置を処理する必要がありますそれに応じて)。事前にすべての飛行機を見つけた場合は、アップデートを取得しないため、ARKitを使用してアップデートを管理する必要はありません。

    代わりに、あなたのステップは、より次のようになります。飛行機は(ワールド空間内の位置)がある場合

    1. が知っています。
    2. 仮想コンテンツの位置を平面の位置に設定します。
    3. コンテンツをシーンに直接追加します。

    つまり、「解決策2」は正しい方向のステップですが、それほど遠くはありません。 ARPlaneAnchorインスタンス自体ではなく、それに含まれている情報をアーカイブし、アーカイブ解除するときにARPlaneAnchorインスタンスを再作成する必要がない場合は、その情報を使用するだけです。

    だから、これはあなたが「ライブ」平面検出してコンテンツを配置するために何をすべきかである場合:

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 
        guard let planeAnchor = anchor as? ARPlaneAnchor else { return } 
        let extent = planeAnchor.extent 
        let center = planeAnchor.center 
        // planeAnchor.transform not used, because ARSCNView automatically applies it 
        // to the container node, and we make a child of the container node 
    
        let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z)) 
        let planeNode = SCNNode(geometry: plane) 
        planeNode.eulerAngles.x = .pi/2 
        planeNode.simdPosition = center 
        node.addChildNode(planeNode) 
    } 
    

    次に、あなたは、静的なコンテンツ配置のために、このような何かを行うことができます。

    struct PlaneInfo { // something to save and restore ARPlaneAnchor data 
        let transform: float4x4 
        let center: float3 
        let extent: float3 
    } 
    func makePlane(from planeInfo: PlaneInfo) { // call this when you place content 
        let extent = planeInfo.extent 
        let center = float4(planeInfo.center, 1) * planeInfo.transform 
        // we're positioning content in world space, so center is now 
        // an offset relative to transform 
    
        let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z)) 
        let planeNode = SCNNode(geometry: plane) 
        planeNode.eulerAngles.x = .pi/2 
        planeNode.simdPosition = center.xyz 
        view.scene.rootNode.addChildNode(planeNode) 
    } 
    
    // convenience vector-width conversions used above 
    extension float4 { 
        init(_ xyz: float3, _ w: Float) { 
         self.init(xyz.x, xyz.y, xyz.z, 1) 
        } 
        var xyz: float3 { 
         return float3(self.x, self.y, self.z) 
        } 
    } 
    
  • +0

    感謝します! Tanhkあなたは私に答える時間を取ってくれて、あなたは私をたくさん助けました!私はARKitのことをあまり考えていたので、私はすでに仕事をするためのすべての情報を持っているとは思っていませんでした。 「大砲で蚊を殺す」ことは理解していますが、自分のプロジェクトをどんな空間にも適応させたいと思います。スペースをARKitで一回スキャンするように、静的な位置にIpadを置いて、スペースにアイテムを表示することができます。そして、誰かが宇宙を歩いて、私の3D物体の前または後ろを歩くことができます。同じアプリであれば、同じ場所でも同じことができます。 もう一度ありがとうございます! – mcarlier

    関連する問題