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

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

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

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

Q&A

0回答

393閲覧

AR画像マーカーで呼び出したmodelnodeがブレる

totyaku

総合スコア0

ARKit

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

0グッド

0クリップ

投稿2021/07/16 01:46

全くの独学で、仕事用のアプリを制作しています。
「AR」と付けた画像をカメラで読み込んだ際に、「43d」と付けたモデルノードが呼び出されます。
呼び出したモデルノードは回転、拡大させるようにしています。

そこで、実機でテストした際に、呼び出したモデルノードがずっとブレるので、これをなんとかしたいと思いますが、どうすれば良いでしょうか?

ご教示いただけると幸いです。
よろしくお願いいたします。

以下ソースコード

import UIKit
import SceneKit
import ARKit

//画像マーカーの検出
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!

private var newAngleY :Float = 0.0 private var newAngleX :Float = 0.0 private var currentAngleX :Float = 0.0 private var currentAngleY :Float = 0.0 private var localTranslatePosition :CGPoint!

//ロード時に呼ばれる
override func viewDidLoad() {
super.viewDidLoad()

// fps情報などを表示 sceneView.showsStatistics = true //シーンの作成 sceneView.scene = SCNScene() //光源の有効化 sceneView.autoenablesDefaultLighting = true; //ARSCNViewデリゲートの指定 sceneView.delegate = self //ジェスチャーの追加 //let gesture = UITapGestureRecognizer(target: self, action:#selector(onTap)) //self.sceneView.addGestureRecognizer(gesture) // ロングプレスイベントハンドラの登録 //let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPressView)) //self.sceneView.addGestureRecognizer(longPressGesture) //オブジェクト回転の登録 let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panned)) self.sceneView.addGestureRecognizer(panGestureRecognizer) //オブジェクト拡大縮小の登録 let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinched)) self.sceneView.addGestureRecognizer(pinchGestureRecognizer)

}

//ビュー表示時に呼ばれる
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

//ARImageTrackingConfigurationの生成 let configuration = ARImageTrackingConfiguration() //画像マーカーのリソースの指定 configuration.trackingImages = ARReferenceImage.referenceImages( inGroupNamed: "AR Resources", bundle: nil)! //セッションの開始 sceneView.session.run(configuration)

}

//ビュー非表示時に呼ばれる
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//セッションの一時停止
sceneView.session.pause()
}

//ARアンカー追加時に呼ばれる
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.main.async {
//ARAnchorの名前がbookの時
if (anchor.name == "AR") {
//モデルノードの追加
let scene = SCNScene(named: "art.scnassets/43d.scn")
let modelNode = (scene?.rootNode.childNode(withName: "43d", recursively: true))!
modelNode.scale = SCNVector3(x: 40, y: 40, z: 40)
modelNode.position.z = Float(0)
node.addChildNode(modelNode)
}
}
}

//拡大縮小 @objc func pinched(recognizer: UIPinchGestureRecognizer) { if recognizer.state == .changed { self.sceneView.scene.rootNode.enumerateChildNodes { (node, _) in if node.name == "43d" { let pinchScaleX = Float(recognizer.scale) * node.scale.x let pinchScaleY = Float(recognizer.scale) * node.scale.y let pinchScaleZ = Float(recognizer.scale) * node.scale.z node.scale = SCNVector3(pinchScaleX,pinchScaleY,pinchScaleZ) recognizer.scale = 1 } } } } //オブジェクト回転 @objc func panned(recognizer: UIPanGestureRecognizer) { switch recognizer.state { case .changed: guard let pannedView = recognizer.view as? ARSCNView else { return } let translation = recognizer.translation(in: pannedView) self.sceneView.scene.rootNode.enumerateChildNodes { (node, _) in if node.name == "43d" { //self.newAngleX = Float(translation.y) * (Float)(Double.pi)/180 //self.newAngleX += self.currentAngleX self.newAngleY = Float(translation.x) * (Float)(Double.pi)/180 self.newAngleY += self.currentAngleY //node.eulerAngles.x = self.newAngleX node.eulerAngles.y = self.newAngleY } } case .ended: self.currentAngleX = self.newAngleX self.currentAngleY = self.newAngleY default: break } }

}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問