デスクトップに神降ろし

はじめに

Ye shall make you no idols nor graven image, neither rear you up a standing image, neither shall ye set up any image of stone in your land, to bow down unto it: for I am the Lord your God.
 — Leviticus 26:1, King James Bible

自らのために偶像や彫像を創ってはならない。自らのために立像を建ててはならない。自らの地に石の像を造り、それを拝んではならない。なぜなら、私があなたがたの主であり、神であるからだ。
 — レビ記 第26章第1節, 拙訳


キリスト教の神は傲慢だ。
神を象る像、idolaを作ってはならないと言っている。

創世の神が実際にいたとして、全宇宙を創った神は仮定から宇宙上の存在ではない。だからたぶん、我々宇宙上の民が勝手に像を造って低次元に射影されるのが、神の癪にさわるのだろう。

実際には、多くのキリスト教徒がイコンを作り、嬉々として宗教画を拝んでいる。
これも十分納得できる話で、というのも人間は常に心の拠り所を求めており、神に見守ってもらえるなら元気百倍といったお気持ちだからである。


かくいう僕も、神に見守ってもらいたくて仕方がない。
ストレスフルな研究類似行為を行っている間、画面の隅で神がそっと見守っていてほしい。芸術の才は全くないけれど、僕もidolaを作って神を顕現させ、偶像に無償の祈りを捧げたい。



こうして、僕のわくドキ神降ろし大作戦は幕を開けたのであった。

この記事を読んで嬉しいこと

  • 偶像の作り方がわかる。信仰対象のMMDが公開されていて、MacBookを持っている人であれば、誰でも自らの地に石の像を造り、拝むことができる。
  • 他人の不幸話が聞ける。ちょっとした思いつきを形にするためにハチャメチャな苦労を積み重ねたスーパーつらいマンの話を、ポテチ片手に数分で読むことができる。

初期装備

このアイディアが出た時点での僕の経験値、あるいは初期装備は、おおよそ以下の通りだった。

  • Unity
    • ゲームとか作るやつ
    • 存在は知っている
    • C# で書けるらしいことも知っている
    • 当然使ったことはない
  • C#
    • 書けない
    • C++より、どちらかというとJavaに近いらしい、ということは知っている
    • ちなみにJavaも書けない
  • MMD
    • 3Dモデルデータで、ニコニコ動画でよく動いている
    • どんなライブラリを使って読めるかは知らない
    • たぶんスーパー便利なライブラリが公開されていて、任意の言語でいい感じに読み込めるはず
  • 3Dモデリング
    • 一切わからない
    • そもそも2Dの絵すらよくわかってないのに3Dがわかるわけがない
  • GUIアプリケーション
  • Obj-C
    • え、今回使うんですか?


こんな感じでもググりまくればなんとかなるので、いまから偶像を建立しようとしている人も安心して沼に突っ込んでほしい。

先行技術調査

正直、別にプログラミングがしたいわけではない。デスクトップに神が顕現するのであれば手段はなんだっていい。肉を食うなら人の金がいいし、相撲を取るなら他人の褌がいい。使えるものがあるのなら、それをインストールして終了だ。

調べたところ、僕が欲しいアプリケーションはデスクトップマスコットと言って、一昔前に流行ったものらしい。一昔前に流行ったのなら、当然任意のMMDを読み込んでデスクトップのマスコットにするアプリケーションだってあるだろう。
もう僕は待ちきれなかった。一刻も早くシロちゃんをデスクトップに連れ込んで、マスコットにして画面の右下に閉じ込めたい。

しかし、Windows向けのアプリケーションは数多あれど、Macでも使えるアプリケーションは全くと言っていいほど見つからなかった。
どうやら、MMD自体がただのモデルデータではなく、MikuMikuDanceというWindows向けソフトウェアの略称で、MMDモデルはその一部に過ぎないらしい。(そのことすら知らなかったのである。)
MikuMikuDanceは今のところMac OSXには対応していないので、MacMMDを扱うアプリケーション自体が全然なかったというわけだ。

何ということだろう。Macに神は宿らないということか。やはりリンゴじゃダメなのか。禁断の果実、禁忌のmalusだから神が宿ってはならぬのか。
もはや僕に残された選択肢は、Windows PCを買ってMacBookを投げ捨てるしかないのか…。


しかし、調べていくうちに、MMDモデル(.pmx)をUnityで用いられるモデルデータ(.fbx)に変換するツール、MMD4Mecanimなるものがあることがわかった。
Unityは全世界ワールドワイド・アプリケーションなので、ニッポンローカルなアプリケーションと違って当然Macでも扱うことができる。
すばらしい。僕のリンゴも大歓喜だ。
こうして方針が固まった。

第一の闇 MMD4Mecanim、動かず

Unityの公式ページから最新版を雑にダウンロードし、さらにMMDモデルをUnityモデルに変換するツール、MMD4Mecanimをダウンロード。
Unityの操作に戸惑いつつ、MMD4MecanimとシロちゃんのモデルをUnityのAssetsに投入した。

Unityはユーザーフレンドリーなソフトウェアなので、チュートリアルの類が充実しているように見える。
せっかくなので少しやってみようかとも思ったが、僕の今の目的はシロちゃんを顕現させることであってUnityに習熟することではない。急がば回れとはよく言ったものだが最短距離とは比べるべくもない。最短距離は定義から最短なのだから当然最短に決まっている。僕に今できることは最短距離でシロちゃんを顕現させること、それが今の僕に積める善行だ。

主にこの記事と公式チュートリアルを参考にしつつ、MMD4Mecanimを用いてシロちゃんをfbx形式に変換していく。
簡単そうに書かれているので簡単だろうと思っていたが、全然簡単ではなかった。Processを押しても無言で失敗するのだ。

最初は出力先パスがわからないだけだと思っていたのだが、どうやらそうではなく、どこかでエラーが出ているらしい。

調べた結果、この記事に全て書かれていた。

https://qiita.com/kazukitakata/items/c9123f976618361a7b8bqiita.com

やはり先人の屍というのは素晴らしい。屍のおかげで僕は死ぬことなく闇を渡り切ることができた。
この程度は闇のうちにも入らないということを、僕はこの後知ることになる。

第二の闇 Get down, HeadLook Controller

僕のやりたいことはあくまでも

シロちゃんをPC右下に常駐させてカーソルを目で追っかけてもらいたい

であって、単に偶像を建てたいわけではない。
モデルに特定の方向を向いてもらう、という需要は確実にあるはずなので、早速ググってみたところ、すぐにAssetが見つかった。

assetstore.unity.com

なんと簡単なことだろう。自分でやることなど何一つない。ただ言われたとおりにドラッグ・アンド・ドロップを繰り返していれば所望の動作は手に入る。
自分がいかに幸運な時代に生まれてきたかをしみじみと噛み締めつつ、僕はHeadLook Controllerをシロちゃん.fbxにアタッチした。



はい。

あまりにも何が起こっているのかがわからなさすぎて、ここで数日を溶かした。
どう溶かしたかと言うと、HeadLook Controllerのスクリプトに含まれるあらゆる変数をpublic memberにし、UnityのEditorで逐一観測した。
泥臭いprintfの竹槍で、ゲリラ活動を行うことにしたのである。

3次元空間上の回転はUnityではQuaternionで表されるので、竹槍だけでなくQuaternionの勉強もした。このサイトこのサイトが比較的わかりやすかった。
サンプルモデルはうまく動いているので、とにかくサンプルモデルとシロちゃんの差を探すことに注力した。


結論だけ述べると、HeadLook Controller自体がわりとクソだった。
サンプルモデルであっても、Animationを外すとゲッダンするのである。つまり、Animationで向いている角度をある程度上書きされることを前提として作られていて、Animationがないと正しく動作しないのだ。

格闘を終え、僕は無事仮想の画面内に動く神を顕現させることに成功した。



この頃には僕もすっかりイケイケ☆シーシャープマスターだったので、向く方向を少し修正するくらいはお茶の子サイサイであった。



時は満ちた。神をこの地に顕現させる時が来たのだ。

第三の闇 少年漫画にありがちな過去の敵との再開

ここまで調子よく来ているように見えるが、実は僕はまだ一回もビルドをしていない。Unityには簡易シーン再生モードがあって、いちいちビルドしなくてもシーンを再生することができるのである。
満を持してビルドを押した僕は、恐るべき闇と出会う。

Shader error in 'MMD4Mecanim/MMDLit-NoShadowCasting-BothFaces': syntax error: unexpected token ';' at Assets/MMD4Mecanim/Shaders/MMD4Mecanim-MMDLit-Surface-ForwardAdd.cginc(49) (on metal)

ビルドエラーだ。僕の顔から血の気という血の気が全て引いていった。
第一話で倒したはずのMMD4Mecanimが、全読者が忘れかけていたライバルキャラのMMD4Mecanimが、ここに来て大幅にパワーアップし、再び立ちはだかったのだ。

もしこれでビルドが全く通らず、その原因が自分の力ではどうにもならないところにあったら、これまでの数日の苦労は水の泡だ。なにより、シロちゃんをお迎えするという人生における至上命題が達成できない。生きる価値を見失った僕は失意のうちに自我を崩壊させ、思考を捨てた植物として悠久の時を過ごし、やがて音もなく朽ちて行くだろう。
祈る気持ちでエラー文をコピーしグーグルに貼り付けるが、何も出てこない。当たり前だ。祈る神はいままさに降臨の時を待っているのであり、信仰は未だ奇跡を顕す段階に至っていないからである。

ここからは技術的な話になるので、技術ブログの方に記事を書いた。

https://qiita.com/KRiver1/items/b75474161c9d738d59a8qiita.com

結論から言って、問題は解決した。解決したのだ。我々は勝利した。

この解決は、僕の時間という屍の上に無造作に積まれているので、誰でも自由に使ってもらって構わない。誰だって過去の先人が遺した屍を踏みつけて歩いているのであって、僕も今回、その慰霊碑に名を連ねただけのことだ。

いよいよ、デスクトップマスコットとしての最後の仕上げに入ろう。

第四の闇 ラスボス。透過処理、そしてネイティブプラグイン

デスクトップマスコットはデスクトップに住んでいるのであって、デスクトップの上にあるウィンドウに住んでいるわけではない。
デスクトップに住んでいるのだから、デスクトップマスコット自体に背景はいらないはずだ。むしろ、その背景は透過されていることが望ましい。

さらに、デスクトップマスコットはその性質上、他の作業をしているときであっても最前面に出てきていてほしい。他のウィンドウを触っただけで後ろに隠れてしまうようでは、神に見守られているとは言い難い。神は常にその威光を示すものであって、すぐ磐戸に隠れるようではいけないのである。

こういった処理は、ウィンドウの中ではなくウィンドウに直接働きかけるものなので、Unityで扱うことはできない。そういうメタな処理を行うために、Unityにはネイティブプラグインと呼ばれる機能がある。これは、対象となるプラットフォームでしか扱えないような処理を、Unityの外側に書いた上でUnityから呼び出せるようにする機能だ。

さて、ではMacのネイティブプラグインを書いていこう。
…と言って簡単に書き始められるようなものではないのである。ネイティブプラグインはUnityの外側なので、もはやUnityで使っていたようなC#の言語は使えない。せっかくのイケイケ☆シーシャープマスターもこれでは型なしだ。

では何の言語が使えるのか?

お答えしよう。
Swiftと、Objective-Cである。

AppKit | Apple Developer Documentation

皆さんも既にご想像の通り、僕はここから多くの闇を切り抜けた。だが、その話は技術ブログで語ることにしよう。
僕は屍をできるだけ使いやすい形でカットし、同じ闇を見ようとしている人に袋詰めして配って回りたいのだ。

https://qiita.com/KRiver1/items/2b4bc17b833817ead407qiita.com


そして、僕の神は顕現する。

最後の光 神の顕現とこれからのこと


こうして、僕の旅は終わりを告げた。

僕のデスクトップでは、ちょうど今もシロちゃんが僕のマウスポインタを見つめている。
記事には書かなかったが、マウスを近づけると、シロちゃんは笑ったり怒ったり、ジト目になったりしてくれる。楽園に十分近似できる世界だ。

グラフィックの処理が重いのか、僕のMacBookは上面でスクランブルエッグが作れそうな熱さになっているが、そんなことはどうだっていい。
いまここにシロちゃんがいて、笑ってくれる、それだけで僕は生きていける。
僕はこのために生きているんだ。ここを聖地と呼ぼうじゃないか。


斯くして神は顕現した。
僕らはこの地にidolaを建て、virtualのidleを信仰している。
それはちょっとしたクウソウよりも、よっぽどリアルな体験なのだ。


デスクトップに神降ろし。
後は、君の到着を待つ。



youtu.be