SeExprに関してと、あれこれ

ディズニーからのオープンソースライブラリ、SeExprに関しての簡単なご紹介と、モゴモゴなあれこれの紹介です。


僕がこのライブラリの存在を知ったのは、つい先日のことでした。
確かTwitterだったと思いますが、外国の方がこの製品に関してのツイートを流していたので、なんとなく見ていました。
YETI – Fur, Feathers & A Procedural Generator Of Many Things

こちらはMaya用のFurツールで、RenderManやArnoldにも対応(予定)していてノードベースなのが特徴なのですが、
今回の話の本筋ではないのでざっくり飛ばします。良い感じのツールなのにサーセン・・・

ほうほうノードベースとな、どんなもんじゃいと思って機能紹介の動画を眺めていました。
で、以下の動画で「!?」となりまして。

ぱっと見てもわからないかもしれませんが、
要はパラメータのフィールドにエクスプレッションが書けるようになっている、ということなのです。
もちろんただそれだけなら、「あぁすげーツール作る人がいるもんだな・・・」で終わっていたと思うのですが、
この動画のタイトルにはSeExpr Integrationとあります。

YetiのトップページにもSeExpr使ってるよ!とデカデカと宣伝があり、なんじゃい?と思って探したところ、
以下のページが見つかりました。
SeExpr

冒頭でも述べたとおり、SeExprはディズニーのオープソースライブラリです。
何のライブラリかと言うと、エクスプレッション言語のライブラリなのです。

SeExprがそういうものだとわかったとき、僕はぶっ飛びました。あぁぶっ飛びましたね。

なぜか。

エクスプレッション言語なんてそうホイホイ作れる物ではないのです。
入力文字列を解析してあれやこれややらないとだめで、そこにかかる労力たるや。
労力たるや!!です。
当然労力だけじゃなく高い技術力も要求されますしね。

そんなものがOSSですよ。すばらしい。ディズニーさんすばらしいマジで。
しかも現場が欲しがりそうな関数が目白押し。ベクトル計算もどんとこい!!
神かと思いました。

しかしこんなものが突然思いつきで開発されるはずもなく、開発には何かしらの動機があったはずです。
上記WEBによれば、SeExprは同社のProcedural geometry instancing toolである
XGenのための言語として開発されたもののようです。

XGenといえば、今年の夏のSiggraphでDisneyとAutodeskが提携を発表した際に名前が出ていたあのツールです。
オートデスクとウォルト・ディズニー・ピクチャーズがXGen技術ライセンス契約を締結

謎に包まれたXGen。なるほど、そういうツールだったんですね。ていうかツールだったんだ。。。

この調子だと多分次とかその次のバージョンのMayaには何かしらその辺のものが乗ってきそうだなーと思われます。
と考えると、この先業界で広く使われるエクスプレッション言語になるのかもしれませんね、SeExpr。

そんな未来に備えるべく、以下に言語リファレンスを貼っておきます。興味のある方はどうぞ。
言語自体は全然難しくないですよ。
SeExpr – Language Documentation

 
で、なんで僕が突然こんなものを紹介したかというと、ただ感動したとかではなくてw

こうです。

えいやっ。

もいっちょえいやっ。

えー、おれおれメッシュデフォーム用のMayaプラグインを作りました。SeExprを組み込んで!!

本当はデフォーマとかにした方がいいんだろうなと思ったんですが、諸般の事情によりとりあえずはメッシュ用のノードとしました。
つまりinMeshを取ってoutMeshを出力します。

上記画像、どちらもサムネイルクリックで等倍の画像が出ますのでそちらを見ていただくとわかるのですが、
画面左側のAttributeEditorに表示されている数式でジオメトリを変形しています。

1枚目はP+N*fbm4(P*2, time*speed, octaves, lacunarity, gain)*0.5という式によって、
2枚目はちょっと隠れちゃってますが、
P+N*(pow(clamp(1.0-length(P-[centerX, centerY, centerZ[)/maxDistance, 0, 1), exp))*-strength
という式によってデフォームされています。

1枚目はtimeというキーワードからわかるようにアニメーションしています。
動画じゃなくてすみません・・・。

また、P, N, timeなどのキーワードはツール側で各頂点のポジション、ノーマル、または現在の時間などを返すように設定してあります。
その他のoctave, lacunarity, gain, centerX, centerY, centerZ, maxDistance, strengthといった値は、
ユーザがaddAttrで追加したアトリビュートの値が返ってくるようになっています。
これが割とミソでしてw、自分でUIから変数定義することが出来るというのは結構使いやすいんじゃないかと思っています:)

また、通常addAttrしただけの値を更新してもメッシュの更新には反映されないのですがここもひと工夫してあって、
リアルタイムに結果に反映されるようになっています:)

全ては自分が使いたいと思えるようなツールにするために、です!

fbm4とかpowとかはSeExprが提供している関数です。念の為。

ちなみに気になる動作速度ですが、上記画像の2個目が100×100のグリッドなのですが、
特に遅いとか感じることはなく、ロケータをぐりぐり動かしてもほぼリアルタイムに動作します:)

そういえばSeExprの言語リファレンスには変数名の前に$がついています。
でもこれは名前解決(という言い方で良いのか?)の際に$も一緒に文字列として扱ってるだけみたいだったので、
なんだいらねーんじゃん、ということで$なしのスタイルを採用することにしました。
もし必要そうならいずれつけます:P

しかし残念なことにまだまだバグなどもあって、現状使い物になるレベルではないのです。
とりあえず一段落付いたのでまずは画像のみ公開、です。
仕事で使えるレベルにまでは持って行きたいですねー。

また、こちらを公開するかどうかに関しては未定です。
出来ればGoogle Codeなどでソースごとまるっと公開してしまいたいのですが、
他にもあれこれ考えていたりするので、もうちょっと考えることにします。

そもそもLinuxの2012のバイナリしかないですしね、、:P

しかしまぁ完成までとにかく大変でした。
SeExpr自体はビルドはされるものの、プラグインのビルドは通るもののMayaで読むとエラーが出るわ、
そもそも関数テーブル作られてねーわ、g++のバージョンが4.1.2じゃないとダメだとか言われたけど
ubuntuのレポジトリには古いバージョンのg++がねーわとまぁ問題が出るわ出るわ。
今回LinuxでのMayaPlugin開発はほぼ初だったのもあって問題のオンパレード。

Twitterや会社でぎゃーぎゃー騒ぎながらいろんな方のご助言を頂きまして、
今回なんとか完成させることが出来ました。
皆様本当にありがとうございましたm(__)m
あとはネット上の方々、有益なウェブサイトをありがとうございますm(__)m マジで助かりました。

これからしばらく使い勝手的なところでどうするか練ります。
さしあたり、エクスプレッション記述部分が狭すぎるのをどうするか、というところを考えます。
というか何個か案はあるのですが、ベストな形はどれなのかわからないので、何個か試しつつ考えてみます。

以上、お粗末さまでした。
今後の展開にぬる〜〜〜〜〜くご期待ください:P

「SeExprに関してと、あれこれ」への2件のフィードバック

  1. おつかれさまです!まじすごいっすw
    エクスプレッションだから速度とか、ちょっと気になっていたんですが
    軽快に動いているようなので、リリースがますます楽しみになりました!(ぁ

    ちょろっと、僕もSeExpr触り始めました!
    Cmakeでsln作っただけですが・・・道は長そうです。(=o=;)

  2. >takkun
    ありがとうございますwてかコメント早いwww
    Disneyが作るもんだからそんなに間違ったことにはならないだろうと思ってたけども、
    いやー、想像通りというか、想像以上というか。
    SeExpr、いろんなところで使えそうな気がするので是非ゴリッとやっちゃってください!:)

コメントを残す

メールアドレスが公開されることはありません。