目次/第17章
「似ているのに別物」を作り分ける
variants — 差分でつくるという設計
- トーストとエッグトーストは、同じプログラムです。差分は数か所しかありません。
- サンマと鮭も、団子3種も、チョコ8種も同じ骨格から作られています。
- ただし色を変えただけでは別物になりません。何を変えると別物になるかが本題です。
14本のうち、いくつかは兄弟です。
| 組 | 共有しているもの | 差分 |
|---|---|---|
| トースト / エッグトースト | スライスの SDF・す(気泡)・耳・焦げ・皿 | 上面のくぼみ、卵、焼き分け |
| ご飯 / お寿司 | 米粒の形・マテリアル・粒間の暗がり | 盛りの形(山 → 俵)、締め具合、ネタ |
| 焼き魚(サンマ)/(鮭) | 掃引・体表テクスチャ・皿・付け合わせ | 一尾か切り身か、銀か橙か、筋節の場 |
| 花見団子 / 月見団子 | 生地の透過・法線の規約・影・被写界深度 | 串か積むか、たれの有無、接触の向き |
| クッキー(7種)/ チョコ(8種) | 断面・焼き色・皿・物理 | 外形、厚み、トッピング、艶 |
共有しているほうが多い。これは偶然ではなく、 01章で見た層構造がそうなっているからです。 下の層(乱数・ノイズ・メッシュの道具)は料理を知らないので、そのまま使い回せます。
実験 — トーストをエッグトーストにする
「卵を落とす」だけを入れると、トーストの上に黄色い円が乗ります。 4つ全部を入れて初めてエッグトーストになります。
色だけを変えても、別物にはならない
いちばんよくある勘違いがこれです。 サンマを橙色にしても鮭にはなりません。サンマは一尾まるごとの側扁した筒、 鮭は包丁で切った切り身です。見えている面の成り立ちからして違います。
逆に、形を変えなくても別物になる組み合わせもあります。 ご飯とお寿司のシャリがそれで、盛りの形と締め具合という2つの数値だけで、 「ふんわり盛った白飯」と「握って締めた酢飯」に分かれます。
差分にすると、直しが全部に効く
設計としての利点はここです。 法線マップの V の符号を間違えていたことに気づいたとします。 14本に同じ間違いが独立して書かれていたら、14か所直すことになります。 実際には、団子シリーズ4本のコメントに 「法線マップの V の符号は (yd − yu)。Babylon の接空間は V が下向き」 と同じ注意が書き写されています。1本で分かったことが、次の1本に持ち越されている。
ファイルの先頭を読み比べると、これがよく分かります。 「団子版(dango-C)から引き継いだもの」「サクランボ版から引き継いだもの」 「ごはん.js の続き」——14本は独立した作品ではなく、1本の連続した記録です。
プリセットという形の差分
同じファイルの中の差分がプリセットです。 クッキー.js は7種類(サブレ / 市松 / うずまき / チョコチップ / 型押しビスケット / クラッカー / 絞り出し)を、断面と外形の数値だけで作り分けています。
// 0. CONFIG : 種類プリセット(クッキー.js) sable: { label: "サブレ", shape: "disc", radius: 2.55, thickness: 0.98, dome: 0.20, rimBulge: 0.88, crackAmt: 0.30, blister: 0.0, dockPitch: 0, emboss: "none", sugarAmt: 1.00 },
乱数の幅は、料理ごとに変えなければいけません。 クッキー.js のコメント:「工業製品なので個体差が小さい。 形の乱数を野菜と同じ幅で振ると『手びねりの粘土』になる。 乱数は外形 ±6%、厚み ±10% までに抑え、代わりに焼きムラと反りで単調さを消す」。 骨格を共有するということは、数値の意味まで共有することではありません。
ここまで来たら
14本のうち好きな1本を選んで、15本目を作ってみてください。 いちばん近いものをコピーして、CONFIG のプリセットを1つ足すところから始めます。 おにぎり(ご飯 + 海苔)、ホットケーキ(クッキーの断面 + 焼き色)、 餃子(掃引 + ひだ)あたりが、既存の骨格に一番近い題材です。
- 上の実験を4つとも切った状態から、1つずつ入れて変化を記録する。
- 「卵を落とす」だけを入れた状態が、なぜエッグトーストに見えないか説明する。
- トースト.js とエッグトースト.js を並べて開き、違う行を探す。
- 15本目に作りたい料理を1つ決めて、14本のどれをコピー元にするか選ぶ。