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

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

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

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

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

Q&A

解決済

1回答

374閲覧

最初に画面タップしたときの物体が残ってしまう

mary0303

総合スコア13

Swift

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

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

0グッド

0クリップ

投稿2018/08/22 10:52

前提・実現したいこと

お世話になっております。
今回、SwiftのARKitを利用して物体を固定位置に配置ではなく、
アプリ起動時(原点)から移動しても、画面タップ時に物体をカメラ画面の中央に配置させたいと思っています。【画面タップするとカメラの中央に物体が1個表示される】
カメラ画面の中央に、物体を配置させるところは思い通りに動きました。【アプリ起動してから2回めの画面タップ時】
しかし、アプリ起動してから最初に画面タップした時の物体が何故か固定位置に残ったままになってしまいます。【1回めに画面タップしたときに出た物体が、2回め以降画面タップした時も表示されたまま。要するに画面上に物体が2個表示される】

以下は、参考にしたサイトです。
[iOS11][ARKit] オブジェクトの位置と回転「常にこっちを向いている怪獣」
サクッとARkitでミニチュアキズナアイを現実世界に召喚させる

稚拙な文章で申し訳ないのですが、よろしくお願いします。

該当のソースコード

Swift

1 2import UIKit 3import SceneKit 4import ARKit 5 6class MelonIntroduction: UIViewController, ARSCNViewDelegate { 7 8 @IBOutlet var sceneView: ARSCNView! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 sceneView.delegate = self 14 sceneView.showsStatistics = true 15 let scene = SCNScene() 16 sceneView.scene = scene 17 18 } 19 20 //タップ時,アプリが立ち上がったときに表示された場所にobjectがでる. 21 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 22 let scene = SCNScene(named: "art.scnassets/apple.dae")! 23 scene.rootNode.name = "apple" 24 25 scene.rootNode.scale = SCNVector3(0.1, 0.1, 0.1) 26 27 if let camera = sceneView.pointOfView { 28 scene.rootNode.position = SCNVector3(0, 0, -0.5) 29// let applePosition = SCNVector3(0, 0, -0.5) 30 self.sceneView.scene.rootNode.childNode(withName: "apple", recursively: false)?.position = camera.convertPosition(scene.rootNode.position, to: nil) 31// self.sceneView.scene.rootNode.childNode(withName: "apple", recursively: false)?.position = camera.convertPosition(melonPosition, to: nil) 32 } 33 34 sceneView.scene.rootNode.addChildNode(scene.rootNode) 35 } 36 37 38 override func viewWillAppear(_ animated: Bool) { 39 super.viewWillAppear(animated) 40 41 // Create a session configuration 42 let configuration = ARWorldTrackingConfiguration() 43 44 // Run the view's session 45 sceneView.session.run(configuration) 46 } 47 48 override func viewWillDisappear(_ animated: Bool) { 49 super.viewWillDisappear(animated) 50 51 // Pause the view's session 52 sceneView.session.pause() 53 } 54 55 override func didReceiveMemoryWarning() { 56 super.didReceiveMemoryWarning() 57 // Release any cached data, images, etc that aren't in use. 58 } 59 60 // MARK: - ARSCNViewDelegate 61 62/* 63 // Override to create and configure nodes for anchors added to the view's session. 64 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 65 let node = SCNNode() 66 67 return node 68 } 69*/ 70 71 func session(_ session: ARSession, didFailWithError error: Error) { 72 // Present an error message to the user 73 74 } 75 76 func sessionWasInterrupted(_ session: ARSession) { 77 // Inform the user that the session has been interrupted, for example, by presenting an overlay 78 79 } 80 81 func sessionInterruptionEnded(_ session: ARSession) { 82 // Reset tracking and/or remove existing anchors if consistent tracking is required 83 84 } 85} 86

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

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

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

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

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

guest

回答1

0

ベストアンサー

画面が押されるたびにaddChildNodeしてしまっているので前のものが残っているのかな?と思います。
子シーン自体は使い回しで位置だけを変えるような感じで書けば良いかなと思い
以下のようにしてみましたがどうでしょうか。

private var childScene:SCNScene! override func viewDidLoad() { super.viewDidLoad() // Set the view's delegate sceneView.delegate = self // Show statistics such as fps and timing information sceneView.showsStatistics = true let scene = SCNScene() sceneView.scene = scene childScene = SCNScene(named: "art.scnassets/apple.dae")! childScene.rootNode.name = "apple" childScene.rootNode.scale = SCNVector3(0.1, 0.1, 0.1) sceneView.scene.rootNode.addChildNode(childScene.rootNode) childScene.rootNode.isHidden = true } //タップ時,アプリが立ち上がったときに表示された場所にobjectがでる. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { childScene.rootNode.isHidden = false if let camera = sceneView.pointOfView { childScene.rootNode.position = SCNVector3(0, 0, -0.5) self.sceneView.scene.rootNode.childNode(withName: "apple", recursively: false)?.position = camera.convertPosition(childScene.rootNode.position, to: nil) } }

コメントに対する回答追記:
物体自体は増やしたいと言うことで良いですかね?
どうやらrootNode.positionをしてしまうとものができてしまうようなので
scene.rootNode.position = SCNVector3(0, 0, -0.5)としてしまうとその位置に置かれてしまうようです。
あくまでSCNVector3(0, 0, -0.5)のベクトルが欲しいだけなので以下のようにしました。

@IBOutlet var sceneView: ARSCNView! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.showsStatistics = true let scene = SCNScene() sceneView.scene = scene } //タップ時,アプリが立ち上がったときに表示された場所にobjectがでる. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let scene = SCNScene(named: "art.scnassets/apple.dae")! scene.rootNode.scale = SCNVector3(0.1, 0.1, 0.1) if let camera = sceneView.pointOfView { let position = SCNVector3(0, 0, -0.5) scene.rootNode.position = camera.convertPosition(position, to: nil) } sceneView.scene.rootNode.addChildNode(scene.rootNode) }

ちなみにですが今のような実装だけならばサンプルと同じくSCNNodeを使っても良いのかなと思いました。

投稿2018/08/23 02:42

編集2018/08/23 05:16
razuma

総合スコア1313

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

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

mary0303

2018/08/23 04:47

回答ありがとうございます! 早速試したところ、思い通りに動きました。 もう一つ質問なのですが、上の質問で貼ったリンク『[iOS11][ARKit] オブジェクトの位置と回転「常にこっちを向いている怪獣」』についてです。 このサイトでは、カメラの中央にオブジェクトを生成していますが、タップされるたびにオブジェクトが増えています。【3 カメラの中央に配置での動画にて】 これを上の質問と同じようにしようとしたとき、どのようにコードを記述すれば宜しいでしょうか? 回答者様のコードを参考にしてコードを書いてみたのですが、うまくいきません。 度々質問して申し訳ないのですが、ご回答よろしくお願いします。
mary0303

2018/08/23 06:19

回答追加について: 回答ありがとうございます! 無事解決しました。 ベストアンサーにさせていただきます!
razuma

2018/08/23 09:03

はーい。ARKit面白そうですね、がんばってくださーい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問