こんにちは。エクセルソフトの田淵です。
弊社取り扱いの Kudan AR SDK のエントリーです。
SDK のダウンロードは こちら からお申込みください。SDK を使った開発と、個人開発者のリリースは無料でご利用いただけます。企業の方は有料になりますので、@ytabuchi までご連絡ください。
前回までで、iOS/Android のマーカー、マーカーレスでオブジェクトを表示するところまでをやりました。Kudan AR SDK チュートリアル記事まとめ で、まとめていますのでご覧ください。
だいぶ時間が空いてしまいましたが、今回はマーカー上に表示したオブジェクトをピンチで拡大縮小してみます。
現時点でのサンプルコードは ytabuchi の Github にアップしてあります。この後もコミット追加していくのでスナップショットです。
作業の流れ
Kudan の世界を表現する ARCameraViewController に含まれる cameraView に UIPinchGestureRecognizer を関連付けて、その値を各種ノードの scale に渡しています。
ViewController の編集
MarkerViewController.swift を編集していきます。
PinchGestureRecognizer を追加するには、以下のコードを用います。
まずは setupContent 内でジェスチャーを生成し、cameraView に関連付けます。
override func setupContent() {
// ...略...
// ジェスチャーの生成と cameraView へのアタッチ
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinchNode(sender:)))
self.cameraView.addGestureRecognizer(pinchGestureRecognizer)
}
色々なサイトでやり方を探しましたが、action に #selector でメソッドを渡すのが今の書き方のようでした。
これで、pinchNode のメソッドに UIPinchGestureRecognizer のイベントが飛んできますので、sender の scale を各ノードの scale メソッドに渡せば、各ノードがスケールします。
表示されている Node で処理を分ける
まずは表示されている Node を判別したいので enum で管理します。
// 表示されている Node
enum node {
case Image, Model, Video, AlphaVideo
}
var shownNode: node?
各ノードを表示するボタンに shownNode = node.XXX を入れます。以下は ImageNode の例です。
@IBAction func imageButton_TouchUpInside(_ sender: Any) {
clearAllNodes()
shownNode = node.Image
imageTrackable?.world.children[0].visible = true
secondImageTrackable?.world.children[0].visible = true
}
クリアボタンにも shownNode = nil を追加しておきます。
pinchNode メソッドの編集
次に UIPinchGestureRecognizer を拾って各ノードをスケールさせましょう。以下のようになりました。
// ピンチにより表示ノードのスケールを変更
@objc func pinchNode(sender: UIPinchGestureRecognizer) {
var scaleFactor = sender.scale
if (sender.state == UIGestureRecognizer.State.began) {
lastScale = 1
}
if let scale = lastScale {
scaleFactor = 1 - (scale - scaleFactor)
lastScale = sender.scale
print("Last Scale: \(sender.scale), ScaleFactor: \(scaleFactor)")
// 各 Node により処理
switch shownNode {
case .Image:
self.imageNode?.scale(byUniform: Float(scaleFactor))
case .Model:
self.modelNode?.scale(byUniform: Float(scaleFactor))
case .Video:
self.videoNode?.scale(byUniform: Float(scaleFactor))
case .AlphaVideo:
self.alphaVideoNode?.scale(byUniform: Float(scaleFactor))
default:
NSLog("Pinched: \(sender.scale)")
}
}
}
最終的には こんな感じ(Github) になっています。
この後やる Rotate も実装してありますが、動作イメージは以下です。
できたー @nakasho_dev さん、ありがとでした! pic.twitter.com/mGavBtH3bH
— 田淵 義人@エクセルソフト (@ytabuchi) December 20, 2019
この後は
Pinch ができたので Rotate をやります。
Kudan AR SDK エントリー一覧
Kudan AR SDK チュートリアル記事まとめ | エクセルソフト ブログ
をご覧ください。
以上です。
参考サイト
- 【Swift】UIPinchGestureRecognizer 2本の指で拡大縮小する。 | はじはじアプリ体験記
- [Swift] ピンチイン/ピンチアウトのジェスチャーでカメラをズームする | Super Hahnah
大変参考になりました。ありがとうございました!


