本文へ移動
atatapp.com/ja/blog/how-i-built-atats-3d-orb-with-gpt-6-astra

GPT-6 Astra で AtAt の 3D Orb をつくった話

· Xinyao Chen

GPT-6 Astra に渡したのは、画像1枚だけでした。AtAt のロゴです。半透明の丸メガネをかけた黒い球で、レンズの中にはそれぞれ白い @。

お願いしたのは、ウェブサイトに載せられる 3D 版をつくること。

ひとつのセッションのあと、その画像は8つのアニメーションを持つ、編集可能な Blender のキャラクターになっていました。Mac アプリの中では Orb として Metal で描画され、ホームページでは Three.js で描画されるキャラクターとして動いています。どちらも、同じ .blend ファイルの同じアニメーションデータを再生しています。

Blender のスクリプトも、エクスポーターも、Metal のレンダラーも、Three.js のプレーヤーも、私は書いていません。私の仕事は、ひとつひとつのバージョンを見て、どこがおかしいかを言うこと。言うことは山ほどありました。

最終的にできあがったのが、このキャラクターです。表情をクリックしてみてください。ポインタに反応し、「視差効果を減らす」の設定も守ります。

丸い眼鏡と白い@の目を持つ、グラファイト色のAtAtの球体

操作できるOrbを読み込んでいます…

帽子

このインタラクティブなデモには「提案中」も入っています。Tab の形をした目と、転がる Orb のまわりをめぐる虹色のリボン。デスクトップの相棒としての Orb のひとときも見られます。入力に合わせてトントンと叩く小さな白い手、うとうとしたり眠ったり、手を振ってあいさつしたり、なでられて照れたり、揺らされたあとにぐるぐる目を回したり。上の Orb はドラッグすれば持ち上げられます。

元になったロゴの参考画像:半透明の丸メガネをかけ、白い @ の目をした、トリミングされた黒い球。

私が渡した唯一の画像。以下はすべて、これに似せてつくられています。

たったひとつのルール

AtAt は、目の前のものをいつもの AI に渡し、答えを入力していた場所に戻す Mac アプリです。Orb は画面に浮かぶ小さなキャラクターで、クリックすると入力ウインドウが開きます。幅は38ポイント。一日中、画面にいます。

新しいキャラクターのルールはシンプルでした。見た目はロゴが決める。Orb が何をしていても、あの絵の球のままでいること。

何度も間違えたところ

私のフィードバックは、ほとんどがスクリーンショット1枚と一言でした。だいたいこの順番で、その一言が続きました。

  • 目が大きすぎた。 メガネの大きさはそのままで、@ を小さくしてほしいと頼みました。目、レンズ、フレーム、蝶番は別々のメッシュだったので、これは本当にひとつの部品だけの変更で、顔のほかの部分を拡大縮小する必要はありませんでした。あとで参考画像に戻って、比率をもう一度調整しています。
  • 球が平べったく見えた。 明るい面と影の面が読み取れない黒い球は、ただの黒い円です。左上からの広いキーライト、控えめなフィル、安定したリムライトをそろえて、ようやく38ポイントで球に見えるようになりました。
  • ヘッドホンが浮いていた。 最初のヘッドホンは、頭にかかっているのではなく、頭の近くにあるだけでした。バンドを上半分の球体に沿わせ、バンドと外側のカップを赤にして、小さなサイズでも読み取れるようにしました。
  • 考えごとの吹き出しが不透明に見えた。 半透明のグラファイトにして、外殻と2つのしっぽの泡と本体のあいだに、見える隙間をあけました。半透明のパーツが重なると、描画のバグのように見えるのです。
  • 「挿入」のアニメーションが意味不明だった。 最初のバージョンは、テキストの断片が入力欄のすき間に滑り込むものでした。何を表しているのか、私にはわかりませんでした。代わりに、鉛筆が紙に書いていき、行ごとにペン先を上げる動きにしてもらいました。
  • ウインクが見えなかった。 最初の傾きは約4度。16度にして、ようやく見えるようになりました。

最初の8つの表情

キャラクターは8つの演技から始まりました。どれにも役目があります。

  • 待機中: 静かに休んでいて、モデルに組み込んだ自然なまばたきをします。
  • 考え中: 両目が上を向きます。半透明のグラファイトの吹き出しの中で、3つの点が大きさと明るさを変えながら順に巡ります。
  • 読書中: 小さな本をめくっています。
  • 挿入中: 鉛筆が紙の上に書いていきます。
  • 確認済み: 目が白いチェックマークになり、小さくうなずきます。言葉はいらず、試したどれよりも早く伝わりました。
  • うれしい: 両目がにっこり閉じて、小さく弾みます。
  • ウインク: 片目を閉じて、頭を16度傾けます。
  • ノリノリ: 真っ赤なヘッドホンをつけて、うなずきながらリズムを取ります。

8つの Blender の演技をループで。上のデモなら、ひとつずつ自分で動かせます。

どれもモデルの中のジオメトリとアニメーショントラックです。本も、鉛筆も、チェックマークも、ヘッドホンも、すべて同じ 3D オブジェクトの一部です。

修正を楽にしたパイプライン

もう一度やるなら、ここはそのまま真似します。

GPT-6 Astra は Blender をセットアップし、Python でモデルとアニメーションを組み立てました。できあがるのは保存された .blend ファイルで、Blender で開けて、人の手でも編集できます。

Blender でレンダリングした、現在の編集可能なキャラクター。グラファイトの体に丸メガネ。

実際のシーンアセットを Blender のスタジオでレンダリングしたもの。モックアップではありません。

ファイルの中で、キャラクターは別々のメッシュの階層になっています。体、フレーム、蝶番、目、小道具。小道具には親があるので、本は本として動き、ヘッドホンは頭と一緒に動きます。表情はそれぞれ、clip::object と名づけた Blender のアクションの組で、たとえば thinking::ThoughtDot0 のように。すべてのオブジェクトが、すべてのクリップにアクションを持っています。そのアクションがただの固定ポーズでも。だからこそ、プレーヤーはどの表情からどの表情へもなめらかにつなげられます。

エクスポーターはシーンを読み込み、アクションを毎秒約30フレームでサンプリングします。まったく変化しないトラックは、1つのサンプルにまとめます。出てくるのは2つ。

  • ウェブ用の GLB。ジオメトリと物理ベースのマテリアルを含み、Three.js が読み込みます。
  • Mac アプリ用のメッシュデータ。ネイティブの Metal レンダラーが求める形式です。

どちらも同じアニメーション JSON を、1バイトも違わずに読み込みます。GLB 自体にはアニメーションクリップを入れていません。動きは1か所にしかないので、Blender で調整すれば、次のエクスポートで両方のレンダラーに届きます。

上に並べた修正の数々を乗り切れたのは、そのためです。どの修正も、モデルを直して、エクスポートして、ビルドして、38ポイントで見る、の繰り返し。目を動かすためにアプリのコードに触った人はいません。

それでも、2つのレンダラーが描くピクセルは同じではありません。ウェブは GLB の物理ベースのマテリアルを使い、ネイティブ側はもっとシンプルなライティングと、フレームの不透明な代役を使っています。モデルと動きを共有すれば、同じキャラクターにはなります。同じ画にはなりません。

ウェブサイトに置く

最初は、ロゴの場所にライブのモデルを置くつもりでした。試してみたあと、ヒーローのテキストの横の空いたスペースに移しました。

ページの上部では、控えめにしています。180ピクセル、不透明度30パーセント。ポインタには反応しますが、まだドラッグはできません。ヒーローがスクロールで消えると右上に移動し、完全に見える100ピクセルの Orb になって、ドラッグできるようになります。上にスクロールして戻れば、家に帰ります。

ライティングは、あなたの現地時間に合わせて少しだけ変わります。向きは最大15度、高さは6度、強さは8パーセント。正午から離れるほど、少し暖かい色に。サイトは焼き込んだ反射環境をつくり直すのではなく、回転させています。静止しているときはライティングを1分に1回だけ更新し、見えていないときは描画を止めます。

数字

項目値
編集可能な .blend ソース9.7 MB
ウェブ用モデル(GLB)597 KB
共有のアニメーション JSON1.93 MB、gzip で約 84 KB
レンダーバッファの上限1辺 512 px
判断に使ったサイズアプリで 38 pt、ウェブで 40 / 48 / 150 / 180 px

まだ解決していないこと

運んでいる中身のわりに、アニメーション JSON は重めです。ネイティブのレンダラーのマテリアルは、ウェブより一歩遅れています。そして結局、「平べったい」がどういうものかを知っていて、それを言い続ける人間が必要でした。GPT-6 Astra は言葉とジオメトリをつなぎました。どのバージョンが正しいかは、知りませんでした。

試してみるなら

  • 参考画像を1枚渡す。 文章ではだめです。説明では決してつかなかった決着を、画像がつけてくれました。
  • スクリーンショットを送り、ずれを名指しする。 「目が大きすぎる、メガネはそのまま」のほうが、「もっとかわいく」よりずっと効きます。
  • 編集できるソースファイルを必ず求める。 再実行できないスクリプトが生成したメッシュは行き止まりです。開ける .blend なら、出発点になります。
  • 実際のサイズで判断する。 180ピクセルでよく見えた細部は、38ポイントではノイズでした。毎回です。

自分でもつくってみる

参考画像を添えて、次のプロンプトを順番に GPT-6 Astra に送ってください。角かっこの中は自分の好みに置き換えます。Blender の操作は Python で任せ、結果を毎回確認してから次に進みましょう。

1. モデルをつくる

添付の参考画像を、[プロジェクトフォルダ] の中で編集可能な 3D キャラクターにしてください。

私の好み:[色、素材、性格、残したい・変えたい細部]。

Blender をセットアップし、Python で組み立ててレンダリングしてください。編集可能な .blend ファイルを1つ保存してください。体、目、アクセサリーなど、個別に調整できるパーツは分けておいてください。

参考画像のプロポーションと素材感に合わせてください。正面と参考画像の角度からのレンダリングを、拡大したものと [表示する予定のサイズ] のものの両方で見せてください。保存したファイルを開き直して、問題なく使えることを確認してください。アニメーションを加える前に、モデルを確認させてください。

2. 表情を加える

承認したモデルに、次の表情のアニメーションをつけてください:[あなたのリスト]。

たとえば:待機、考え中、読書、書きもの、確認、うれしい、ウインク、ノリノリ。目や小道具、動きは、私のキャラクターの性格に合わせてください。

演技は、同じ .blend の中に編集可能な Blender のアクションとして保存してください。小道具は正しく取り付け、ループはなめらかに、「視差効果を減らす」用に読み取りやすい静止ポーズも用意してください。どのアニメーションも、保存して開き直したあとに崩れないようにしてください。

表情はアプリのコードで別に描くのではなく、モデルのジオメトリとアニメーションでつくってください。確認用に、ラベルつきのアニメーションプレビューを用意してください。

3. プロジェクトに組み込む

承認したキャラクターを [ウェブサイトまたはアプリ] に組み込み、[ほしいインタラクション] を実装してください。

まず既存のプロジェクトを調べてください。保存した .blend からエクスポートし、つくり直さないでください。ウェブには Three.js を使ってください。ネイティブアプリも対象なら、2つのプレーヤーでモデルのアニメーションデータを共有してください。

再生の仕組みは汎用的にし、透過を保ち、動く小道具のための余白を残し、描画解像度を制限し、見えていないビューは描画を止めてください。動くプレビューと、エクスポートして実行するためのコマンドを用意してください。

プロジェクトをビルドし、すべての表情と切り替えを確認してください。既存のキャラクターを置き換える場合は、呼び出し側を移行し、置き換えが動いたら古い描画コードを削除してください。

あとは、スクリーンショットと具体的な修正を送ります。「目を小さく。メガネはそのまま」。実際のサイズで正しく見えるまで、繰り返してください。

始まりは、画像1枚と小さなお願いでした。そのあとのすべての判断が、このキャラクターのモデルに、アニメーションに、ふるまいに刻まれています。

Orb は、AtAt でいちばん最初に目にするものです。クリックしたあとに何が起こるかは、「AtAt とは?」で。

すべての記事