今回の記事は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関連の記事を記載しているのできになる方はご参照していただけると非常に喜びます。
コメント