前提・実現したいこと
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)
以上の方法で試しましたが上の部分でスレッドエラーが表示されました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/16 16:13