13日目の担当として参加しました。今回は、UnityとOculusRiftSを使って、VR空間でペンタブレットを使ってみようというお話です。6.3.37-3経緯ペイントソフトでのイラスト製作や3DCGソフトでのモデリングなどによく使われるペンタブレットですが、大きく2種類に分かれています。・板タブレット(板タブ)板状無地のタブレット上にペンを走らせることでカーソルを動かせる。ディスプレイを見ながら操作する。・液晶タブレット(液タブ)タブレット自体が液晶画面になっていて、手元を見ながらペンで直接書くように操作できる。板タブの方を持っていて使っているのですが、画面を見ながら手元のペンで字や絵を描くのって結構難しいんですよ。液タブ使いて~、でも高いよね~、なんて友人と話した後、ふと思いつきました。VR機器を使えば板タブでも手元に絵を表示しながら描けるのでは??実装というわけで、板タブでも手元を見ながら絵を描ける機能を目指して、Unityを起動しました。実現にあたり、なくてはならない3つの機能「ペンタブとUnityの連携」「テクスチャペイント」「VR対応」それぞれに対し、超絶便利なアセットが存在しました。見ながらunitypackageをインストールします。Windowsのタブレットドライバのapiから情報を引っ張ってきてくれるアセットです。インストールしてサンプルシーン開いただけで簡単にUnityペンタブ連携ができちゃいました。}}このようにPaintメソッドを呼び出すことでテクスチャにペイントすることができます。nomalmapやheightmapをペイントできたり、インクが垂れる表現ができたりと、ただの平面お絵かきに使うのはもったいなく感じてしまう高機能アセットでした。OculusIntegration最後はVR用のアセット。Integrationをインストールします。Oculus/VR/Prefabs内にあるOVRCameraRig.prefabをシーンに置くだけで使えます。機器に依存する処理はしていないので、QuestやRiftを使ったり、SteamVRでVIVEを使ったりしても大丈夫です。ペンタブで入力した位置にペイントするInkPainterのPaintメソッドは、ペイントしたい位置へのRaycastHitまたはその位置のWorld座標を引数に必要とします。uWintabで取得できるのはタブレット内のペン位置(xとy,ともに0-1)です。このままではペンの入力位置にペイントすることが出来ないので、取得したペン位置をWorld座標に変換することにします。uWintabのTabletクラスを継承し、ワールド座標を取得できるようにした新しいクラスを生成してそれに置き換えます。}}とりあえずuWintabのサンプルシーンからペンやタブレットのオブジェクトをコピーしてきて、TabletにアタッチされているTablet.csを上記に置き換えます。子のBoardオブジェクトにInkPainterのInkCanvas.csをアタッチしました。これでWorld座標の取得が可能になったので、実際にペイントするためのスクリプトを用意します。}}これを適当なゲームオブジェクトにアタッチし、参照先をインスペクタから設定すれば、、、ペンタブの入力位置にペイントできるようになりました!!(VRじゃなくてもこれだけで楽しい)VRでやってみる先ほどのシーンにOVRCameraRigを配置し、位置や大きさを調整してヘッドセットで覗いてみます。!!思った通りの線が描ける!!!手元を見ながら描ける!!!細かい文字も綺麗に書ける!!!さらに色々せっかくVRなんだ、タブレットよりもデカいキャンバスに描きたい!というわけで、Inkcanvas.csを別のプレーンにアタッチして、取得できるWorld座標と合わせることでタブレットより大きいキャンバスに書き込めるようしたり。ペンの筆圧取得できるんだ、筆圧に応じて太さ変えたい!というわけで、Tabletからpressure取得してその値をbrushのScaleに反映させたり。ブラシの設定できるんだ、ブラシの色とか大きさとかテクスチャ変えたい!というわけで、TabletのexpKeyでブラシの色や大きさを変えられるようにしたり。ペンを速く動かした時に点線になってしまうのは嫌だ!というわけで、Paintメソッドの呼び出し回数を増やしてみたり。途中困った点とか謎のバグとかあったのでいくつか触れておきます。・GetExpKeyDownが上手く動かないuWintabのTablet.csのGetExpKeyDownメソッドが、ExpKeyを押し始めたタイミングのみTrueになってほしいのに、押している間常にTrueとなってしまいました。WintabAPIとの連携のところでの処理回数の違いとかが原因なのかなと素人ながらに想像していますが詳細不明...。・タブレットの指操作を取得したいペンタブレットはペン入力だけでなく、設定によってはトラックパッドと同様に指での操作も可能です。Pro」タッチパネルで出来る事とオンオフの方法というサイトが。設定を開いても「タッチ入力を有効化する」というトグルが見当たりませんでした。その後いろいろ調べると、このタブレットは本体のハード側にタッチ入力の切り替えボタンが付いていて解決。タッチ入力をunityで取得しようとすると、どうやら通常のトラックパッドと同様の処理になっているらしく、Input.mousePosition()を使うしかなさそう。マウスとは別に処理したいのですが、その方法は未発見です。実際にやってみると、ディスプレイを見ながらペンタブを使うのに比べ、相当正確に書けるというのが分かった。液タブみたいな使用感という当初の目標はバッチリ達成。今回じつは、VR空間と現実のペンタブの位置はトラッキングしているわけではなく、シーン上で位置を合わせているだけでした。それでも、手元、特にペン先が見えてると現実で描くのとほぼ同じ感覚で細かい字まで思い通りに書けました。視覚をダマすのはやっぱり効きますね。いろんなブラシとか搭載したり、ペイントソフトと連携したりして本格的に描けるようにしたら絶対楽しい。イラスト方面なら、参考資料の絵とか3Dオブジェクトとか前方に浮かべて見ながら描いたり、VR書斎つくってHMD被るだけで散らかった部屋でも一瞬で創作環境に入れたり...他にも、文字とかも普通に書けるので色々整えればVRでの会議とかにバリ使えそう。文字認識とかと組み合わせてもよさげ。妄想が膨らんで楽しかったです。冒頭で、液晶タブレット高いという話を出しましたが、VR機材もそれなりに高い。思い値段比較してみました。¥147,880やっぱりピンキリで求める性能によって全然違ってきそうですが、VR機材の方が高そうなイメージだったのにそうでもなかった...。upLoginユーザーは見つかりませんでした。