BLOG
計算機オタクを名乗るのはあまりに憚られましたが今回限り許してください

皆さんこんにちは。突然ですが、きっとこのブログを読んでくださっている皆様は、一度はマインクラフトのレッドストーン回路に熱中し、加算回路やそれを用いたマイコンなどを作られたことがあるかと思います。

そのようにマインクラフトマリオメーカーなど、日常に潜むチューリング完全に思いを馳せながら日々をお過ごしになられている皆様に提案なのですが、新たな計算機の開拓地としてNeos VRはいかがでしょうか。

この記事では最近僕がNeosVRで制作した計算機の紹介をしつつ、(かなり偏った視点から)NeosVRの魅力をお伝えしたいと思います。


NeosVRはゲーム内でヴィジュアルプログラミングが可能で、その場で様々なオモチャやツールを即錬成できてしまう、魔法のようなゲームであり、SNSであり、ワールドエディタであり、開発環境であります。

NeosVR作業光景

Logixノードやシーンインスペクタを開いて作業をするあむさんとサクさん

最近めっきりブログを書いていませんでしたが(それ以前もというツッコミはここでは無効)、その原因の一つがこのNeosVRにドハマりしていたことがあります…。

そんなNeosVRで計算機を作ってみました。

とは言っても、NeosVRはゲーム内プログラミングがサポートされているので、チート級に簡単です。MinecraftでGate by Gateで作っていたのがバカみたいになります。

ですが、その分できることも非常に大きくなるので要求レベルも上がります!

なにせ、NeosVRはビジュアルプログラムしたノードたちをアイテムの中に入れ込んで不可視にすることが可能であり、また非常に高速に動作することから、今までの作って満足の粋から飛び出て、実用レベルのものが作れる可能性があるからです!これは滾ります。

というわけで最初は手頃な目標として、タートルグラフィックの実現を目指しました。


タートルグラフィックはいわゆるロゴ坊(もしかして以外とマイナー…?)のことで、ペンを持った「亀」に「前へ進め」や「60度回転しろ」などを行動型の命令をすることで、絵を描こうといったものです。

また、この実現にあたり簡単なCコンパイラを作成して、簡単にプログラムを書けるようにしました(ロゴ言語でないのは今後の汎用性を考えての決断でした)。本当はllvmのバックエンドを書くなど使えるものを使いたかったのですが、なにせNeosでは最大クロックがフレームレートの10~50倍ほどしか(他のゲームと比較すると十分すぎるくらいだが)出ないため、設計をかなりNeosの仕様に寄せたものにする必要がありました。そのため特殊命令をもりもり入れる必要があり、バックエンドのほとんどを手書きしましたが、もしかしたらもっと簡単な方法があったのかも…

コンパイラを簡単に作りたかったのでアーキテクチャはスタックマシンにすることにしました。

というわけで、最初にできたのがこちらになります。

NeosVRのノードプログラミングを文章で説明するのは非常に難しいので簡単にだけ説明しますが、青文字で光っている四角が、ちょうどこのマシンが処理できる命令の一覧になります。

ノードを同時に全部だすとゴチャゴチャしちゃうので、この青い四角に押し込んで整理しています。

全部で28命令の小さなマシンです。このときはまだコンパイラも型がunsigned intしかなくCとは遠い文法のものでした。(このツイートのリプライツリーにこのとき使ったプログラムがあります)


割とこれで満足してたのですが、魔が刺してNeos内でスクラッチ風にプログラムが記述できる仕組みを作りたくなってしまいました(作りました)。それがこちらです。

このときはすでにマシン側もアップデートを重ねていて、符号付き整数演算、浮動小数点演算にも対応しました。とはいっても、演算の中身はNeos側ですでに用意されているので、型のぶんだけノードを出して、正しいものが使えるようにコンパイラ側でよしなに処理してあげるだけですが…

VR内でCのプログラムが書けるブロックを作ったのはちょっと後悔してます…。 あんまり本筋ではないし意外とかなり労力かかったし…。まぁこのときはこれで完成にしてもう以後手はつけない予定だったんですよね。

ちなみにこれはフルセットでワールドとして公開してて、名前は「TurtleCoding! Beta」です。NeosVRでワールド名検索するとすぐ見つかると思うので、よかったらぜひ試してみてください!


で、このときもだいぶ満足しててもう以後手をつけない予定でした。ただ、なんと言っても「まだポインタ演算をマシン側でもコンパイラ側でも実装してないからチューリング完全ではないんだよな…」ということが心残りになっており、もうちょっとだけ続けることにしました。

正直Neosやってない人にはノードの全体像を貼っても「なんかヤバそう」以上の感情が沸かないとは思うのですが、最終的な風貌はこんな感じになりました。

NeosVR作業光景

見た目が今までと大きく変わって「配線だらけ」になっているのは、できるだけノード数を減らして軽くするために最適化を施したからです。ブラックボックスに押し込んで整理するのも最適化の妨げになるのでナシ。スタックマシンなのでpushやpopなどの演算が様々な命令で駆使されているので、当然pushやpopをするためのノードの組み合わせが至るところにコピーされていました。今回はそれらを最低限にまとめたためこのような風貌に…。

マシンにはポインタを扱うための命令、文字列を高速に処理するための命令、そして「Neos内のオブジェクトに干渉するための命令」など、様々な命令を追加しました。(命令一覧)

そしてなんと、じゃーん。

NeosVR作業光景

NeosVR作業光景
NeosVR作業光景

スマホになっちゃいました。

NeosVRにはUIX(ユーアイエックス!)と呼ばれる平面UIを(比較的)簡単に作れる仕組みがあって、それを操作できるようになっちゃいました。しかも電卓程度であればかなりサクサク動きます。

ランチャーもバイナリで動作していて、内部の命令を使って起動するアプリを切り替えています。

3枚目の写真はサーバーにHTTP GET/POSTして、帰ってきたJSONをパースして(!)、画面に表示するチャットアプリのサンプルです。これは流石にちょっと遅いです… 最適化したいけど力尽きた…。

JsonのパーサーはC言語の軽量jsonパーサーライブラリのjsmnを使わせてもらいました。

あ!あとオマケ要素というか自分のデバッグ用でしたがブラウザで挙動をシミュレーションできるツールも作りました!

NeosVR作業光景

まだ外部通信だったり、アプリ用不揮発メモリなどサポートしていませんが、デスクトップである程度アプリ開発して、できたらNeosに持ち込み~といった開発フローが可能です。

ここまで作るのにかなりの労力と時間がかかりましたが、個人的には大変満足しました。

こういうのは作るのが一番楽しいですからね! 実用性を追求し始めると沼です(かなり)。

もうこれ以上の手を加えることはないかな~とは思いつつ、ヴィジュアルプログラムではあまり簡単にできないJsonのパースがちょろっとできちゃうことが分かったので、入力されたJsonをパースするだけなど細やかな作業を行う「組み込み向けコア」くらいなら作ってみようかなと思ったり…。


かな~~~り偏った紹介の仕方ではありましたが、NeosVRの魅力が伝わったと思います。

ここでのポイントは、「内部で仮想マシンを構成してそこでアプリを動作させる」というド冗長なことをしても十分それが実用できてしまうくらいゲームエンジンが洗練されていて、自由度が高いということです。

偏ってないNeosVRの魅力はTwitterで「#NeosVR」で検索すると一瞬でわかります。オープンなコミュニティが複数存在し、グループで協力してゲームを作る人、一人で黙々と魔術的なツールを開発している人、みんなで作ったアイテムを持ち寄ってパーティしたり、ただゆっくりした時を過ごしたり、そして、計算機を作ってる人がいたり。NeosVRは「The Metaverse」という言葉がテーマになっていますが、これがどういう意味なのか、そしてどれだけこの言葉がこのゲームにぴったりなのか、すぐに理解できると思います。

火曜日は初心者案内ツアーをやっていたり、金土はカジノイベントを開催していたりと、NeosVRのコミュニティは常にオープンです!ぜひぜひ訪れてください。そして、ぜひともお会いしましょう!


P.S.

Neos仮想マシンスマートフォン開発プロジェクトのメンバー(?)共力者(?)を募集しています!

もしちょっとでも興味があればNeosで聞いていただければ!

開発関連リンク:

アプリ開発レポジトリグループ: https://github.com/Papyrus-Crowler-Apps

コンパイラ: https://github.com/thotgamma/lvmx-compiler

エミュレータ: https://github.com/thotgamma/lvmx-emulator