前提・実現したいこと
私はswift初心者でARを勉強しています。参考書『詳細 Swift iPhoneアプリ開発入門ノート:大重美幸 著』で勉強しています。 「画像認識で特定して画像名を表示」 したいのですが,うまくいきません。成功すれば Assets.xcassetsに登録している画像(例:ポカリスエットの写真を入れ 名前をPOCARI.jpegとして保存) をカメラで本物のポカリスエット缶を認識して、画像をハイライト表示し、その上に画像名(例:POCARI) が出てくるはずです。 実行させると successの表示が出ます。その上sceneView.debugOptions = [.showFeaturePoints] の特徴点も出てきますが、肝心の画像のハイライトと画像名が出てきません。 参考書通りに 入力しているはずですが なぜでしょうか?
尚、この質問コーナーには画像を添付していないので これを解いて くださる方は 各自 画像(消しゴム、ぬいぐるみ、ペットジュース等)を挿入し、画像に名前をつけて やってみてください。
発生している問題・エラーメッセージ
一応 success の表示は出ています。気になるところとして 参考書には
「画像名のテキストノードは 次のtextNodeクラスで作成します。 SCNTextクラスで文字のジオメトリーを作り、 SCNNodeクラスでノードを作成して子ノードとして selfに追加します。子ノードとして追加する理由は 文字列の位置が決めやすいからです」
と書いてありましたので cocoatouch でサブクラスを TextNodeとして書きました。 「 SCNTextクラスで文字のジオメトリーを作り、 SCNNodeクラスでノードを作成して子ノードとして selfに追加します。」 の表現の意味がいまいち 理解していないのですが cocoaTouchで 行うとは参考書には、書いてないのですが他に方法を知らないので それでやっています。
該当のソースコード
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.scene = SCNScene() //特徴点を表示する //デバックオプションで showFeaturePointを指定すると //検知した 特徴点を表示します。特徴点は自然に消えます。 sceneView.debugOptions = [.showFeaturePoints] } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //セッション止める sceneView.session.pause() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // ●Create a session configuration //ARWorldTrackingCOnfiguration()に //値を設定することでsceneViewに //平面検出を行うことを知らせています。 // コンフィグを作る let configuration = ARWorldTrackingConfiguration() //参照画像が用意できたなら セッション開始時のトラッキング // フィグのdetectionImagesプリパティに referenceImages // として指定します。referenceImagesは ARReferenceImage. // referenceImageで作ります。 // Assets.xcassetsの "AR Resources"グループの画像を参照する //認識する画像の参照イメージを取り込む guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return } //参照画像を設定する configuration.detectionImages = referenceImages // ●Run the view's session //セッションを開始する //ARKitは特徴点を検出してARを表示、そしてカメラに //画像を表示するまでをセッションとして管理していて、 //sceneView.session.runからそれが窺えます sceneView.session.run(configuration) } // MARK: - ARSCNViewDelegate //画像認識したら下記が呼ばれる func renderer(_renderer:SCNSceneRenderer,didAdd node: SCNNode,for anchor:ARAnchor){ //次の3行で 画像認識したアンカーを取り出す guard let imageAnchor = anchor as? ARImageAnchor else { return } let referenceImage = imageAnchor.referenceImage //認識画像をハイライトする //認識した画像の縦横サイズをreferenceImage.physicalSize //から取得して SCNPlaneクラスのノードを被せてハイライト //表示します。ノードを90度回転させる方法として //ここでは eulerAngles(オイラー角)プロパティを利用しています。 let plane = SCNPlane(width: referenceImage.physicalSize.width, height: referenceImage.physicalSize.height) let planeNode = SCNNode(geometry:plane) //90度回転 planeNode.eulerAngles.x = -.pi/2 //半透明 planeNode.opacity = 0.5 //認識した画像の範囲に被せます node.addChildNode(planeNode) //認識した画像の名前を表示する //認識した画像名は referenceImage.name で取得できます。 //これを使って後述するTextNodeクラスでテキストノードを作って //画像の上に表示します。画像とテキストノードの向きが同じに //なるようにテキストノードも90度回転させています。 //ネームを表示する //参照画像の名前 let name = referenceImage.name! let nameNode = TextNode(str:name) //90度回転 nameNode.eulerAngles.x = -.pi/2 // 名前を表示します node.addChildNode(nameNode) }
}
この下の文は、cocoa Toch class で 別枠でTextNodeクラスを作っております
import SceneKit
import ARKit
//SCNNodeを継承して作ります
class TextNode: SCNNode {
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(str:String){ super.init() //以下の3行で文字の ジオメトリを作る let text = SCNText(string: str,extrusionDepth: 0.01) text.font = UIFont(name: "Futura-Bold",size: 3) text.firstMaterial?.diffuse.contents = UIColor.red//塗り //テキストノードを作る let textNode = SCNNode(geometry: text)//ノードを作る self.addChildNode(textNode)//子ノードとして追加 //ここから3行はboundingBoxから幅と高さを求めます //ノードを囲む 領域 let (max,min) = textNode.boundingBox let w = abs(CGFloat(max.x - min.x)) let h = abs(CGFloat(max.y - min.y)) // 位置決め textNode.position = SCNVector3(-w/2, -h*1.2, 0) //全体を縮小する self.scale = SCNVector3(0.04, 0.04, 0.04) }
}
試したこと
参考書の見直し、google検索、そしてclass TextNode: SCNNode {以下の文を そのまま 上からの文章にくっつけて 1つの画面内にまとめたりしましたが、画像名表示はできませんでした。
補足情報(FW/ツールのバージョンなど)
swift5 Xcode PCは MacPro Book BigSurで作っています。
あなたの回答
tips
プレビュー