シリーズ: AI とともにコードを学ぶ

Meshyパイプラインと、ポーズ推定を壊したローブ

Meshy.aiとエンジンの間にある7段階のアセットパイプライン。

テキストプロンプトからコンテンツパックへ 7段階、出荷済み8ジャンル、404とローブを生き延びる テキストから3Dへ PBRマップ LOD0 リメッシュ LOD1 整理 パック化 優雅な劣化:404時はLOD0のみで継続
1つのアセット、7つの段階、ベンダーのAPIが何をしようともSDKが読み込めるパック。

生成3Dの良し悪しは、プロンプトをランタイム対応アセットに変えるパイプライン次第だ。RakuAIは、姿を消すベンダーのエンドポイント、Unicodeによるクラッシュ、そしてデモが決して見せてくれない摩擦を生き延びるパイプラインを構築した。

アセットパイプラインは、エンジンの中でも地味だが荷重を支えている部分の一つだ。それは、デザイナーのアイデア(「タワーディフェンスパック用に敵を20体欲しい」)を、ランタイムが読み込めるテクスチャ付き・リグ済み・LOD付きの3Dアセットのフォルダへと変えるものだ。この6週間、その仕事をこなしてきたパイプラインはMeshy.aiであり、ランタイムのリポジトリにあるscripts/meshy_asset_pipeline.pyの7段階スクリプトを通じて配線されている。

この土曜日の朝、MeshyパイプラインとSDKパック形式の間のv1ブリッジは、私たちが学んだことを書き留められる程度には落ち着いた。3つのことだ。どれもAPIドキュメントには載っていない。

7つの段階が実際にやっていること

順番に、すべてのアセットに対して。

  1. プレビューモードでのテキストから3Dへの生成。
  2. PBRテクスチャマップの生成: アルベド、メタリック、ラフネス、法線。
  3. LOD0のポーリングとダウンロード。
  4. v1 APIに対するリメッシュタスクの作成。
  5. LOD1リメッシュのポーリングとダウンロード。
  6. ディスク上でのアセットファイルの整理。
  7. コンテンツパックの組み立て。

パイプラインは1つのアセットを最後まで駆動してから、次に移る。バッチ処理はしない。バッチ処理をしない理由は、以下の3つ目の教訓から痛みとともに導き出された。

教訓その1: ローブがポーズ推定を壊す

Meshyのテキストから3Dへの出力は、幅広い人型デザインには問題ない。スケルトン、兵士、騎士、腕が露出した魔導士。パイプラインはこれらをリグ付けし、リグは機能し、アセットは出荷される。

しかし、厚く着込んだローブ姿の人型には問題がある。RPGコンテンツパックがスプリント2でこれにぶつかった。本来ならきれいにリグ付けされるはずの4つのアセットが、ポーズ推定中のシルエット抽出に失敗した。2つは想定内だった(スライムとウルフエネミーは人型ではなく、ポーズ推定器がそれらに腕を見つけようとするはずがない)。2つは驚きだった。mage_heroblacksmith。どちらも人型だ。どちらも失敗した。

失敗のモードはシルエットにある。Meshyのポーズ推定器は、モデルのレンダリングされた輪郭を見て手足を見つけようとする。長いローブを着た魔導士は、シルエット上に脚が見えないため、骨格を固定するための脚のキーポイントが存在しない。エプロンを着けた鍛冶屋は、胸と腰の間に見える胴体の継ぎ目がないため、脊椎ジョイントの推測が誤る。モデル自体は問題ない。リグが間違っているのだ。

パイプライン側の修正は、失敗を記録し、リグなしのジオメトリを保存し、アセットマニフェストに「これは手動リグ作業が必要」というフラグを表面化させることだ。プロンプト側の修正は、オートリギングが必要な人型については、テキストプロンプトに「タイトな服装、露出した手足」と指定することだ。より長期的な修正はMeshy側の話であり、私たちがやることではない。

13ジャンルにわたって、失敗率は一様ではない。タワーディフェンスは5体中1体のリグ付け失敗。プラットフォーマーは6体中1体。RPGは11体中4体で、そのうち4体中3体は衣装のジオメトリが原因だ。この教訓は一般化できる。生成モデルが失敗するとき、その失敗は普通ランダムではなく、失敗のモードはそのモデルが構築された訓練データについて何かを教えてくれる。

教訓その2: Unicodeは標準出力をファイルにパイプするあらゆるものをクラッシュさせる

RPGパックの鬼派閥は日本語のキャラクター名を使っている。風、雷、金剛。これらはMeshyのジョブ送信におけるアセット名だ。パイプラインはバックグラウンドで実行され、標準出力をログファイルにリダイレクトし、後でどのアセットが成功したかをそのログから解析する。

鬼のアセットを最初に実行したとき、そのすべてが失敗した。エラーはPythonの標準出力からのUnicodeEncodeErrorだった。ビルドマシンでのデフォルトのエンコーディングは、標準出力がTTYでない場合、ASCIIになる。日本語の文字はASCIIではない。printステートメントは、アセットがMeshyに送信される前にクラッシュしてしまう。

修正はランチャースクリプト内のたった1行、PYTHONIOENCODING=utf-8だ。この環境変数を設定すれば、printステートメントは機能し、アセットは生成される。

この教訓は私自身より古い。標準出力にリダイレクトされたパイプラインを通じてUnicodeをパイプする何かは、エンコーディングを明示的に設定する必要がある。20年前から文書化されている問題に2日を失った。行動ジャーナルに記録済み。ランチャーで修正済み。Meshyでは修正されていない。それはMeshyが直すべき問題ではないからだ。

教訓その3: ベンダーのAPIは消える

スプリント2の半ば、Meshy v2の/remeshエンドポイントが404を返し始めた。特定のアセットに対してではない。すべての呼び出しに対してだ。

リメッシュ段階は、LOD0(ハイポリ、レンダリングにコストがかかる)をLOD1(ローポリ、レンダリングが安価)に変える工程だ。リメッシュがなければ、アセットはLOD0のみで出荷される。開発者のマシンでは問題なくレンダリングされるが、ARグラスのターゲットではフレームレートを殺してしまう。

このエンドポイントが非推奨になったのか、より上位のプランの背後にゲートされたのか、リダイレクトなしで移動したのか、それとも一時的にダウンしているだけなのか、私には分からない。Meshyのドキュメントは今もそれを参照している。呼び出しは404を返す。パイプラインは、ベンダーがそれを解明するのを待つわけにはいかない。

修正はmeshy_asset_pipeline.pyのリメッシュ段階にある。リメッシュ呼び出しの周りにtry/exceptを置く。失敗時には、そのアセットをLOD0のみとして記録し、その事実をアセットマニフェストに書き込み、パイプラインの残りの部分を続行する。すべてのアセットはLOD0を持つ。一部はLOD1も持つ。どちらにせよパックは出荷される。

この教訓は、ベンダーのAPIに依存するあらゆるプロジェクトがいずれ学ぶものだ。依存しているAPIは自分のものではなく、あなたの足元で変わり得るものであり、唯一の防御は優雅な劣化だ。今、私たちはそれを手に入れた。

パイプラインの現在地

13ジャンル中8つが完了。スペースシューター、パズル、カードバトル、ランナー、プラットフォーマー、レーシング、タワーディフェンス、RPG。残り5つ(スポーツ、シミュレーション、サンドボックス、格闘、MMOライト)がキューに入っている。

クレジット予算は嬉しい驚きだった。スプリント2の見積もりは、そのジャンルの両派閥合わせて約510クレジットだった。実際の支出は、一貫して見積もりを25〜35パーセント下回った。これにより、予算についての会話をすることなく、残り5ジャンルを進められるだけの余裕がプログラムに生まれた。

今月頭に着地したv1ブリッジ、24個の適合性テストを備えたscripts/generate_rakupack.pyは、これらすべてをSDK側から扱えるようにするものだ。SDKを使う開発者は、あるアセットがMeshyから出てきたものなのか、手作業でモデリングされたパイプラインから出てきたものなのかを知る必要がない。パック形式が契約であり、Meshyパイプラインはパックを生成し、SDKはパックを読み込む。

なぜこれを書き留めているのか

理由は2つある。

1つ目は、上記の3つの教訓が、ベンダーのデモには現れず、マーケティングページにも現れない類の摩擦だからだ。ローブとポーズ推定。Unicodeと標準出力。リメッシュと404。もしあなたが生成3Dベンダーを評価していて、これを読んで「それはコミットする前に知っておきたかった類のことだ」と思うなら、この記事はその役目を果たしたことになる。

2つ目は、パイプラインが今や十分に安定しており、次の会話は「Meshyは私たちにとってうまくいくのか」ではなく「アセットライブラリをどんなものにしたいか」になっているからだ。それはエンジニアリングの会話ではなく、デザイナーの会話だ。エンジニアリング側は、邪魔をしないようにすることで、その仕事を果たした。

8ジャンル完了。残り5つ。パイプラインは404を生き延びる。パイプラインは日本語の文字を生き延びる。パイプラインはまだ、ローブを生き延びられない。土曜日を有意義に使った。

あなたのAIが実際に動かせる世界を生成する

RakuAIは生成アセットをランタイム対応のコンテンツパックへと変える——1つの契約、どんなソースでも、ベンダーのデモが隠す摩擦に対して強化されている。あなたの創作物を、出荷のために作られた空間ランタイムに持ち込んでほしい。

← すべての記事