質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

887閲覧

ARKitでオブジェクトの位置を保存、復元したい

maki_spinner

総合スコア0

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/25 04:54

編集2020/11/25 04:57

前提・実現したいこと

ARKitでARのオブジェクトを生成して、保存 => アプリ再起動後に生成していたARのオブジェクトを表示させたいのですが表示されません。
以下コードはタッチした場所に球体を表示し、savebuttonを押した後再起動し、loadbuttonを押すと元々表示していた位置に球体が表示されるコードです。問題点として、平面にオブジェクトを置いた時しか対応していません。hittestのtypeをexistingPlaneUsingExtentからfeaturePointにしても上手く動作しません。hittestで取得できる値がCGPointのためx,yの2値しか扱えないからでしょうか。

ARオブジェクトを表示、アプリの再起動後、ARオブジェクトを元の位置に復元したいです。平面の時だけではなく。
ご教授よろしくお願いします。

該当のソースコード

import UIKit import SceneKit import ARKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! var worldMapURL: URL = { do { return try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("worldMapURL") } catch { fatalError("No such file") } }() @IBAction func saveButtonPressed(_ sender: Any) { sceneView.session.getCurrentWorldMap { worldMap, error in guard let map = worldMap else { return } guard let data = try? NSKeyedArchiver.archivedData(withRootObject: map, requiringSecureCoding: true) else { return } guard ((try? data.write(to: self.worldMapURL)) != nil) else { return } } } @IBAction func loadButtonPressed(_ sender: Any) { var data: Data? = nil do { try data = Data(contentsOf: self.worldMapURL) } catch { return } guard let worldMap = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data!) else { return } let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal configuration.initialWorldMap = worldMap sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors]) } override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self //ARSCNViewデリゲートの指定 sceneView.scene = SCNScene() //シーンの作成 sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints] //特徴点の表示 sceneView.autoenablesDefaultLighting = true //光源の有効化 //https://note.com/npaka/n/n77e2d49bfea5 let configuration = ARWorldTrackingConfiguration() //コンフィギュレーションの生成 configuration.planeDetection = .horizontal sceneView.session.run(configuration) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else {return} // スクリーン座標に変換する let touchPos = touch.location(in: sceneView) // タップされた位置のARアンカーを探す let hitTest = sceneView.hitTest(touchPos, types:.existingPlaneUsingExtent) if !hitTest.isEmpty { // タップした箇所が取得できていればanchorを追加 let anchor = ARAnchor(transform: hitTest.first!.worldTransform) sceneView.session.add(anchor: anchor) } } func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode,for anchor: ARAnchor) { guard !(anchor is ARPlaneAnchor) else { return } let sphereNode = SCNNode() sphereNode.geometry = SCNSphere(radius: 0.05) sphereNode.position.y += Float(0.05) //let scene = SCNScene(named: "art.scnassets/ship.scn") // シーンからノードを検索 //let rabbitNode = (scene?.rootNode.childNode(withName: "ship",recursively: false))! // 検出面の子要素にする node.addChildNode(sphereNode) } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問