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

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

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

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

Swift

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

Q&A

1回答

1765閲覧

iOSでAR空間にオブジェクトを表示したいができません

hrk_sgymm1193

総合スコア1

ARKit

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

Swift

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

0グッド

0クリップ

投稿2021/12/16 11:43

前提・実現したいこと

ARKiitとSceneKitを用いたオブジェクトの表示
ここに質問の内容を詳しく書いてください。
画面をタップした際にカメラ越しのAR空間に3Dモデルを表示したいと思っています。
ARViewを用いた方法と、ARSCNCViewにSCNSceneで宣言した3Dモデルを表示しようと試みました。
該当コードは以下にあります。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Swift

1import UIKit 2import ARKit 3import RealityKit 4 5class ARViewController: UIViewController, ARSessionDelegate { 6 7 let userView_Button = UIButton() 8 var arView: ARView! 9 10 let rootAnchor = AnchorEntity() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 arView = ARView(frame: view.bounds) 15 view.addSubview(arView) 16 UISetup() 17// arView.session.delegate = self 18 let gesture = UITapGestureRecognizer(target: self, action: #selector(onTap)) 19 self.arView.addGestureRecognizer(gesture) 20 view.backgroundColor = .darkGray 21 navigationItem.title = "AR" 22 } 23 24 override func viewWillAppear(_ animated: Bool) { 25 super.viewWillAppear(animated) 26 27 let configuration = ARWorldTrackingConfiguration() 28 arView.session.run(configuration) 29 arView.scene.addAnchor(rootAnchor) 30 } 31 32 @objc func onTap(sender: UITapGestureRecognizer){ 33 print ("on tap") 34 let pos = sender.location(in: arView) 35 let results = arView.hitTest(pos, types: .featurePoint) 36 if !results.isEmpty{ 37 let anchor = ARAnchor(name: "pin", transform: results.first!.worldTransform) 38 arView.session.add(anchor: anchor) 39 } 40 } 41func session(_ session: ARSession, 42 didAdd frame:[ARAnchor] ){ 43 for anchor in frame { 44 if anchor.name == "pin" { 45// guard let shipModel = try? Entity.load(named: "Users/izulab/work/knowledgeCo-creationCampus/Front/Front/Assets.xcassets/MapPin.imageset/MapPin.png") else {return} 46 guard let shipModel = try? Entity.load(named: "art.acnassets/pin/pin.snc") 47 else {return} 48 shipModel.position = simd_make_float3( 49 anchor.transform.columns.3.x, 50 anchor.transform.columns.3.y, 51 anchor.transform.columns.3.z 52 ) 53 rootAnchor.addChild(shipModel) 54 } 55 } 56 }

上記のコードで実行した際にエラーは出なかったのですが、

func session(_ session: ARSession,

didAdd frame:[ARAnchor] )

この関数がうまく動いておらずオブジェクトが表示されませんでした。

試したこと

上記のコードで試してみて実現できなかったため以下の方法も試しました。

Swift

1import UIKit 2import SceneKit 3import ARKit 4import RealityKit 5 6class ViewController: UIViewController, ARSCNViewDelegate { 7 8 var sceneView: ARSCNView! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 sceneView?.delegate = self 13 view.addSubview(sceneView) 14 15 let configuration = ARWorldTrackingConfiguration() 16 sceneView.session.run(configuration) 17 18 let gesture = UITapGestureRecognizer(target: self, action:#selector(onTap)) 19 self.sceneView.addGestureRecognizer(gesture) 20 21 } 22 23 override func viewWillAppear(_ animated: Bool) { 24 super.viewWillAppear(animated) 25 26 27 let configuration = ARWorldTrackingConfiguration() 28 sceneView.session.run(configuration) 29 30 let gesture = UITapGestureRecognizer(target: self, action:#selector(onTap)) 31 self.sceneView.addGestureRecognizer(gesture) 32 } 33 34 @objc func onTap(sender: UITapGestureRecognizer) { 35 print("tapppp") 36 let pos = sender.location(in: sceneView) 37 let results = sceneView.hitTest(pos, types: .featurePoint) 38 if !results.isEmpty { 39 let anchor = ARAnchor(name: "pinAnchor", 40 transform: results.first!.worldTransform) 41 sceneView.session.add(anchor: anchor) 42 } 43 } 44 45 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, 46 for anchor: ARAnchor) { 47 if anchor.name == "pinAnchor" { 48 guard let scene = SCNScene(named: "pin.scn", inDirectory: "art.scnassets") else { fatalError("error") } 49 let pinNode = (scene.rootNode.childNode(withName: "pin", recursively: false))! 50 node.addChildNode(pinNode) 51 } 52 } 53 54} 55 56 57

sceneView.session.run(configuration)

以上の方法で試しましたが上の部分でスレッドエラーが表示されました。

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

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

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

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

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

guest

回答1

0

後者に関しては、エラーの内容をコピペしてください。現時点で分かることとしてはviewDidLoadとviewWillAppearの両方でconfigurationを呼び出しているから失敗すると思うのですが、とりあえずviewDidLoadの方は消した方がいいと思います。

両方に共通することとしては、基本的に取得したanchorがnilだった時のエラー例外処理ができていないのが気になります。

前者

func session(_ session: ARSession, didAdd frame:[ARAnchor] ){  guard let (任意の名前) = frame as? [ARAnchor] else {return} //省略

後者

  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {  guard let (任意の名前) = anchor as? ARAnchor else {return} //省略

自分もARKitを勉強し始めて日が浅いので上のが有効な解決策かどうかは分かりませんが、基本的にARKitはAppleのサンプルのソースコードで挙動を確認・勉強するといいと思います。

投稿2021/12/16 14:18

ASOBU_dev

総合スコア103

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

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

hrk_sgymm1193

2021/12/16 16:13

ご丁寧な回答、ありがとうございます。後者の方に関しましてviewdidLoad内のconfigrationの箇所を消去し実行してみるとview.addSubview(sceneView)の箇所で <Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value>とエラーが出ました。引き続きご教授いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問