たべもののつくりかた.

目次/第10章

10Sweep

曲がったものを作る

sweep along a spine — 軸に沿った掃引

この章の3行まとめ
  • ウィンナーも秋刀魚も、まっすぐではありません。ゆるく弓なりに曲がっています。
  • 回転体では作れないので、先に軸(背骨)を決め、断面を軸に垂直に置いていきます。
  • 軸に垂直な向きを取り違えると、断面がねじれてメビウスの輪になります。

ウィンナーを回転体で作ると、まっすぐな棒になります。実物はまっすぐではありません。 ケーシングに詰めるときの押し具合で、ゆるく弓なりに曲がり、太さも長手方向に ±4% ほどうねります。 これが無いと、オレンジ色の棒にしか見えません。

そこで作り方を変えます。まず軸(スパイン)を1本決めます。 次に、軸上の各点で「そこでの断面」を作り、軸に垂直な平面の上に置きます。 これを軸に沿って何十枚も並べ、隣どうしをつなげば立体になります。これを掃引といいます。

// 3. Mesh utils : 掃引(ウィンナー.js / 焼き魚(サンマ).js に共通)
for (let i = 0; i <= NS; i++) {
    const u = i / NS;
    const c = spine(u);           // 軸の上の点
    const T = normalize(dSpine(u)); // 進行方向(接線)
    const N = normalize(cross(T, UP));
    const B = cross(N, T);         // この2本が断面の平面をつくる
    for (let j = 0; j <= NC; j++) {
        const a = j / NC * TAU;
        const r = section(u, a);
        push(c + N * (r * Math.cos(a)) + B * (r * Math.sin(a)));
    }
}
断面は円とは限らない。秋刀魚は「横倒しにした平たい楕円」

実験 — 軸を曲げて、断面を並べる

「断面の輪を描く」を押すと、軸に垂直な平面が何枚も並んでいるのが見えます。 秋刀魚は断面のひらたさを 0.6 くらいにすると、それらしくなります。
立体はドラッグで回せます(触ると自動回転は止まります。ダブルクリックで戻ります)。 真上から見ると、軸の曲がりがそのまま輪郭に出ているのが分かります。

両端は、半球ではない

掃引で作った筒の両端を、そのまま半球で閉じたくなります。ウィンナーではこれが失敗します。 実物の端にはケーシングをねじって留めた結び目があり、そこへ向かって放射状のひだが収束しています。 ウィンナー.js のコメントに「この数mmが最も『らしさ』を出す」とあります。 全体の 3% に満たない部分に、いちばん手間がかかっています。

体型のピークをどこに置くか

秋刀魚は全長 30cm に対して体高 4cm。極端に細長い魚です。 焼き魚(サンマ).js の修正記録には、 「体高のピークが u=0.30 にあり、頭が全長の1/3に見えていた。実写は鰓蓋直後 u≒0.22」 とあります。0.30 を 0.22 にずらしただけで、別の魚が秋刀魚になる。 掃引で作る形は、軸方向のどこに何を置くかがほとんどすべてです。

つまずきポイント

断面の向きは、勝手に決まってくれません。 軸に垂直な平面は無数の回り方ができます。上のコードのように 「毎回 UP との外積で決める」やり方は簡単ですが、 軸が真上を向いた瞬間に外積が 0 になって破綻します。 軸が大きく曲がる形では、前の断面の向きを引き継ぐ方法(平行移動枠)を使います。

やってみよう
  1. 曲がりを 0 にして、ウィンナーが何に見えるか判定する。
  2. 太さのうねりを 0.25 にすると何に見えるか(ひょうたん)を確かめる。
  3. 「秋刀魚」で断面のひらたさを 1.00 のままにすると、どんな魚に見えるか。
  4. ウィンナー.js で「結び目」を検索し、端の処理に何行使っているか数える。