スポンサーリンク

【Swift】ARkitでAR空間に線を引く方法ご紹介。

Swift
スポンサーリンク

今回の記事はSwiftのARkitを用いてAR空間内に線を引く手法をご紹介します。私のステータスとしてAR関連は初心者なので初心者目線で手順をご紹介します。

スポンサーリンク

AR空間に線を引く原理

まず線を書くとはどのような原理かというと、球体のオブジェクトを連続して線を作るというものです。線をかくなどの特別な処理は特に必要ではありません。

では実際にXcodeの操作とコードを見ていきましょう。

AR空間に線を引くXcode設定

Reality APPでXcodeのプロジェクトを作成していきます。

言語、クラスは下記のように進めていきましょう。

プロジェクト名は適当でOKです。

AR空間に線を引くSwiftコード

次に実際にAR空間内に線を引いていくSwiftコードを紹介していきます。

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

     @IBOutlet var sceneView: ARSCNView!

     var touchedLocation: CGPoint = .zero
     var isTouching = false
     var existentNode: SCNNode?

     override func viewDidLoad() {
         super.viewDidLoad()
         sceneView.delegate = self
         sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
         sceneView.scene = SCNScene()
     }

     override func viewWillAppear(_ animated: Bool) {
             super.viewWillAppear(animated)
             let configuration = ARWorldTrackingConfiguration()
             configuration.isLightEstimationEnabled = true
             sceneView.session.run(configuration)
         }

         override func viewWillDisappear(_ animated: Bool) {
             super.viewWillDisappear(animated)
             sceneView.session.pause()
         }

         override func touchesBegan(_ touches: Set<UITouch>, with event: 
UIEvent?) {
             isTouching = true

             guard let location = touches.first?.location(in: nil) else {
                 return
             }
             touchedLocation = location
         }

         override func touchesMoved(_ touches: Set<UITouch>, with event: 
UIEvent?) {
             guard let location = touches.first?.location(in: nil) else {
                 return
             }
             touchedLocation = location
         }

         override func touchesEnded(_ touches: Set<UITouch>, with event: 
UIEvent?) {
             isTouching = false
         }

         func createBallNode()-> SCNNode {
             let ball = SCNSphere(radius: 0.003)
             ball.firstMaterial?.diffuse.contents = UIColor.blue
             return SCNNode(geometry: ball)
         }
     }

extension ViewController {

     func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: 
TimeInterval) {

         guard isTouching else { return }

         let ballNode: SCNNode

             //既にノードが作成したら、clone()でコピーして再利用する
         if let node = existentNode {
         ballNode = node.clone()
             } else {
                 ballNode = createBallNode()
                 existentNode = ballNode
             }

             //スクリーン座標から、ワールド座標に変換する
             let wordPostion = 
sceneView.unprojectPoint(SCNVector3(touchedLocation.x, 
touchedLocation.y, 0.995))

             ballNode.position = wordPostion
             sceneView.scene.rootNode.addChildNode(ballNode)
     }
}

解説を少し行います。
通常のscenekitで大方テンプレートを流用します。

AR空間内にものを配置したり、描写を行う際はrender関数を使うのでrender関数を追加で記述します。

指でクリックした箇所を検知させてそこに球のオブジェクトを配置している流れです。そのため、配置している場所を検知する必要があります。そのあたりの関数はtauch〜関数に記述しています。

createBallNode関数がSCNNodeを生成している関数になります。

この大まかに話かけると三つのジャンルの関数を使い分けて、連続して球を生成しつづけて線を記述指定ます。

今回の記事は以上です。他にもAR関連の記事を記載しているのできになる方はご参照していただけると非常に喜びます。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

Swift
スポンサーリンク
スポンサーリンク

コメント

タイトルとURLをコピーしました