全くの独学で、仕事用のアプリを制作しています。
「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 } }
}
あなたの回答
tips
プレビュー