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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

3480閲覧

<swift>ARで画像認識を行い、その上に配置した画像にリンクを貼りたい。

k373

総合スコア17

ARKit

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

Xcode

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

Swift

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

0グッド

2クリップ

投稿2019/03/19 17:02

編集2019/03/19 17:03

実現したいこと
swiftでARアプリを作成中です。
画像認識を行い、その上に2D画像を配置します。その2D画像にリンクを貼り、タップをすることでwebページに飛ばしたいです。

困っていること
2D画像の配置までできました。しかし、その画像にリンクを貼ることができません。タップをしても動きません。

問題かなと想像し、試行錯誤している箇所
if node.name == "route"のroute部分に画像のNameをあてはめているのですが、ここが問題かと推測しています。
img.scnassets/routeに書き換えたりもしたのですが、反応しません。

import UIKit import SceneKit import ARKit import SafariServices class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: Bundle.main) override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self let scene = SCNScene() sceneView.scene = scene } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let configuration = ARImageTrackingConfiguration() configuration.trackingImages = referenceImages! sceneView.session.run(configuration) } func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { let node = SCNNode() if let imageAnchor = anchor as? ARImageAnchor { let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height) plane.firstMaterial?.diffuse.contents = UIImage(named: "img.scnassets/route") let planeNode = SCNNode(geometry: plane) planeNode.eulerAngles.x = -.pi / 2 node.addChildNode(planeNode) } return node } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let location = touches.first?.location(in: sceneView), let result = sceneView.hitTest(location, options: nil).first else { return } let node = result.node if node.name == "route" { let safariVC = SFSafariViewController(url: URL(string: "https://images.google.com/?gws_rd=ssl")!) self.present(safariVC, animated: true, completion: nil) } } }

以上、ご指導をよろしくお願いいたします。

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

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

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

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

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

fuzzball

2019/03/20 01:16

実際に node.name に入っている値は?
k373

2019/03/20 05:48

認識が間違っていたらすみません。 その画像のIdentity and TypeのNameがnode.nameに当たると思っております。 そのNameにはrouteと入力しております。 よろしくお願いいたします。
fuzzball

2019/03/20 05:57

touchesBegan の中で node.name の値はどうなっているのか?と聞いています。
k373

2019/03/20 07:06

nilが入っておりました。
fuzzball

2019/03/20 07:53 編集

あんまり分かってないのに質問して申し訳ないんですが、node.nameというのは勝手に付くものなんでしょうか?生成時に自分で "route" と設定すればいいという話ではないんでしょうか?
k373

2019/03/20 08:07 編集

私もあまりわかっておらず、ネットの情報を参考に試行錯誤しておりまして、すみません。 https://qiita.com/k-boy/items/d5c7e0f4174da4b8d5f0 こちらの記事(最下部)を参考に試行錯誤しております。 生成時に"route"と設定もしてみます! ありがとうございます!
fuzzball

2019/03/20 08:17 編集

その記事の場合はScene Editor(って言うのかな)で名前を付けてますよね。 >>あとから画像を貼ったり、タップアクションを加えたりする要素に対して名前をしっかりつけることです という箇所です。 この質問の場合はコードで生成している(と思う)ので、名前もコードで付ければ良さそうです。
k373

2019/03/20 08:36

planeNode.name = "route"を追加で解決しました! fuzzballさんありがとうございました!!
guest

回答1

0

自己解決

planeNode.name = "route"を追加で解決しました!

import UIKit import SceneKit import ARKit import SafariServices class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: Bundle.main) override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self let scene = SCNScene() sceneView.scene = scene } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let configuration = ARImageTrackingConfiguration() configuration.trackingImages = referenceImages! sceneView.session.run(configuration) } // ARSCNViewDelegate func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { let node = SCNNode() if let imageAnchor = anchor as? ARImageAnchor { let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height) plane.firstMaterial?.diffuse.contents = UIImage(named: "img.scnassets/route") let planeNode = SCNNode(geometry: plane) planeNode.eulerAngles.x = -.pi / 2 node.addChildNode(planeNode) planeNode.name = "route" } return node } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let location = touches.first?.location(in: sceneView), let result = sceneView.hitTest(location, options: nil).first else { return } let node = result.node if node.name == "route" { let safariVC = SFSafariViewController(url: URL(string: "https://images.google.com/?gws_rd=ssl")!) self.present(safariVC, animated: true, completion: nil) } } }

投稿2019/03/20 08:35

k373

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問