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

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

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

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

Swift

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

Q&A

解決済

1回答

1683閲覧

ARマーカーの上にBOXを浮かせたい

退会済みユーザー

退会済みユーザー

総合スコア0

ARKit

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

Swift

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

0グッド

0クリップ

投稿2020/10/18 10:34

編集2020/10/19 04:09

ARResourceにあるScreenprintingという名前の画像を読み込んだら画像上にBOXが出現するコードですが、BOXは画像に乗っている状態でした。乗っているのではなく、画像の真ん中から浮いているように指定したいです。Nodeの座標位置などをいじりましたが変わらず、大きさしか変わりませんでした。どうしたら画像から浮かせることができるのでしょうか?

参考 リンク内容

###コード

import UIKit  import ARKit  import Scenekit class boxViewController: UIViewController { @IBOutlet var sceneView: ARSCNView! let defaultConfiguration: ARWorldTrackingConfiguration = { let configuration = ARWorldTrackingConfiguration() let images = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) configuration.detectionImages = images configuration.maximumNumberOfTrackedImages = 1 return configuration }() private var boxNode: SCNNode! private let box = UIImpactFeedbackGenerator override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self boxNode = SCNScene(named: "art.scnassets/Scenekit _box.scn")!.rootNode.childNode(withName: "box", recursively: false } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) sceneView.session.run(defaultConfiguration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) sceneView.session.pause() } extension boxViewController: ARSCNViewDelegate { func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { guard let imageAnchor = anchor as? ARImageAnchor else { return nil } switch imageAnchor.referenceImage.name { case "Screenprinting" : DispatchQueue.main.async { self.feedback.impactOccurred() } boxNode.scale = SCNVector3(0.1, 0.1, 0.1) let scale1 = SCNAction.scale(to: 1.5, duration: 0.2) let scale2 = SCNAction.scale(to: 1, duration: 0.1) scale2.timingMode = .easeOut let group = SCNAction.sequence([scale1, scale2]) boxNode.runAction(group) default: return nil } } }

 
環境:xcode12 、swift5

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

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

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

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

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

tsuki01

2020/10/18 13:09 編集

以下の点をご確認頂けますと回答が付きやすくなると思うので、質問の修正・追記をご検討願います。 ・ご提示頂いたコードだとビルドエラーとなる。コード修正願います。 ・「Nodeの座標位置などをいじりましたが」とあるが、コード内だと指定している形跡がない。SCNファイル内で直接座標を調節したという意味でしょうか?質問に追記願います。 ※座標位置調整する場合、「boxNode.position = SCNVector3(x:0.0, y:0.2, z:0.0)」の様な処理があると思うのですが、その様な処理がなかったため。
退会済みユーザー

退会済みユーザー

2020/10/19 04:11

コード修正致しました。 座標調整について→はい、SCNファイル内のposition、Eulerなどを触りました。
guest

回答1

0

ベストアンサー

一度、利用するrendererメソッドを以下の様に変更して、ポジション指定してみるのはいかがでしょうか。
※SCNファイル上でポジション変更しても反映されないということなので、利用しているrendererメソッドに何か影響されているのかもしれません。根本的な原因は私も把握しておらず、申し訳ありません。

ポジション指定処理

swift

1self.boxNode.position = SCNVector3(x: 0.0, y: 0.1, z: 0.0)

以下サンプル

swift

1extension ViewController: ARSCNViewDelegate { 2 3 // 追加 START 4 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 5 DispatchQueue.main.async { 6 7 //ARAnchorの名前が"Screenprinting"の時 8 if (anchor.name! == "Screenprinting") { 9 // ポジション指定(Y軸に対して0.1指定 = 10cm上に浮かせる) 10 // ※SCNファイル内のオブジェクトの軸を、必ずご確認ください(上下がY軸になっているかどうか) 11 self.boxNode.position = SCNVector3(x: 0.0, y: 0.1, z: 0.0) 12 node.addChildNode(self.boxNode) 13 } 14 } 15 } 16 // 追加 END 17 18// func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 19// guard let imageAnchor = anchor as? ARImageAnchor else { 20// return nil 21// } 22// 23// switch imageAnchor.referenceImage.name { 24// case "Screenprinting" : 25// DispatchQueue.main.async { 26// self.feedback.impactOccurred() 27// } 28// boxNode.scale = SCNVector3(0.1, 0.1, 0.1) 29// let scale1 = SCNAction.scale(to: 1.5, duration: 0.2) 30// let scale2 = SCNAction.scale(to: 1, duration: 0.1) 31// scale2.timingMode = .easeOut 32// let group = SCNAction.sequence([scale1, scale2]) 33// boxNode.runAction(group) 34// 35// default: 36// return nil 37// } 38// } 39} 40

実行イメージ
サンプル

補足
以下リンク先に、元々使用していたrendererメソッドでスケールなどが反映されないとの報告あり。
ARKIT cannot scale or rotate in render method

投稿2020/10/19 14:38

編集2020/10/19 14:39
tsuki01

総合スコア1751

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問