拡張現実ピタゴラ装置(intangibleな部分)をiPadで表現する

この記事は FUN Advent Calendar の13日目の記事です

adventar.org

昨日は @_manohito でした。

自己紹介

  • あつや / @n_atmark
  • 知能システムコース 3年
  • Swiftが好き
  • 今年は某未来携帯プロジェクトのプロジェクトリーダーをやってます
  • システムソフトウェア研配属になりました

拡張現実ピタゴラ装置 とは

まずピタゴラ装置に関してですが、NHK教育で放送されている ピタゴラスイッチ をご存知の方は多いのではないでしょうか?

ピタゴラ装置こと、ルーブ・ゴールドバーグ・マシン(Rube Goldberg Machine)という、いくつもの仕掛けを連鎖的に作動させ、最終的に何らかの作業を実行する物を指します。
youtu.be

公立はこだて未来大学では、1年次の必修科目「情報表現基礎1」でこちらのピタゴラ装置を作成します。

しかし、ただのピタゴラ装置ではなく 拡張現実 ピタゴラ装置という名前にもあるように、 コンピュータプログラムや電子工作を用いて現実と非現実の境界があいまいになるような作品制作を行います。

講義のページはこちら: 拡張現実ピタゴラ装置 - 迎山和司研究室

www.youtube.com

大学の講義では、PC上でProcessingを用いてintangible(無形)の部分を表現しているのですが、 今回はその部分をiPadで動かそうと思います。

環境

  • Xcode (>= 8.3)
  • Swift 3.x ※ 使用ライブラリがSwift4に対応していないため
  • iPad (>= iOS 10.0)

今回使う技術

  • Swift
    • iPad上でアプリを動かしたいので,Swiftを用います
  • ProcessingKit
    • Processingライクな構文を用いて、iOS上でビジュアル表現ができるライブラリ
  • simple-tween
    • アニメーションの中間フレームを補うためのライブラリ

作ったもの

おそらく先に作ったものを見た方が早いですね。 youtu.be

github.com

現実世界のボールがiPadの裏に入るのと同時に、画面上でアニメーションが再生され、 アニメーション上のボールが画面外に出るタイミングで、実世界のボールが画面外に転がるようになっています。

手順

1. Carthage経由でライブラリをダウンロード

github "natmark/ProcessingKit" ~> 0.4.0
github "natmark/simple-tween" ~> 0.0.1

Carthageの使い方については、こちらが詳しいと思います qiita.com

2. ProcessingViewを継承したPitagoraViewを作成

gist.github.com

3. それぞれのSceneの中身を記載

gist.github.com

PitagoraViewを拡張する形で各シーンの中身を書いています。 simple-tweenによって各シーンの実行時間を管理しており、tween.positionの値が0.0から1.0まで変化したときに 次のシーンを再生するようになっています。

今回はこのtween.positionの値を使ってアニメーションを行うために、lerpという関数を用意しました。 Linear Interpolate (線形補間)の略で、minとmaxを指定すると、tween.positionの割合に応じて値を返してくれます。 gist.github.com

本当にやりたかったこと

当初tangibleとintangibleのつなぎこみの部分(センサーを使ったボールの判定・サーボモータを使ったボールの送出)をArduinoと接続してやろうと思ったのですが、時間が全然取れなくてintangible部分しかできませんでした...

手を動かす前にArduino側のUSB Type-AオスとiPad側のLightning端子を繋ぐための、USB Type-Aメス⇄Lightningケーブルを手に入れることができませんでした...

ArduinoiPad間のシリアル通信自体はできそうなので、時間があればもう少し取り組んでみたいです...

www.youtube.com

終わりに

iPadを使うことで、タッチディスプレイをはじめとしたリッチな機能が使えるようになり、 しかもPCに比べ配置場所に融通が効くのでPCより向いてるんじゃないかな?
と考えて今回の記事を書きました。

せっかく良さげなライブラリもあったので...

今回の記事では、現実と非現実の境界の部分をあまり触れられませんでしたが、 Arduinoとの連携ができるようになれば表現の幅も広がりそうですね。

明日は@Zer0ypさんです!