やさいのつくりかた.

目次/第10章

10Spine

曲がったものを作る

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

この章の3行まとめ
  • 回転体(04章)はまっすぐな軸しか作れません。バナナもきゅうりも、実物は曲がっています。
  • そこで先に軸(スパイン)そのものを曲げた線として決め、その各点に断面を置いていきます。
  • 断面は必ず軸に垂直に置くこと。水平に置くと、曲がった内側でつぶれます。

04章の回転体は、まっすぐな棒のまわりに横顔を回して作りました。 でもバナナは曲がっています。きゅうりも少し曲がっています。ゴーヤも。 まっすぐ作ってから全体を曲げる、という手もありますが、それだと断面がゆがみます。

正しいやり方は逆で、先に軸を決める。 バナナ.js のコメントに「Spine … 軸。果柄と果実で曲率の向きが逆になる」とあります。 軸は3D空間のなかの1本の曲線で、それを何十個かの点に分けます。 そして各点で、その点での進行方向に垂直な平面のうえに断面(円や多角形)を置く。 あとは、となりの断面どうしを四角形でつなげば立体になります。

// 軸のうえの点 S(t) と、そこでの向き(接線)を求める
const S = spine(t);            // 軸の位置
const T = tangent(t);          // 進む向き(接線)
const N = perpendicular(T);    // T に垂直な向き(2本)
const B = cross(T, N);

// 断面の点を、その平面のうえに置く
p = S + N * (r * Math.cos(a)) + B * (r * Math.sin(a));
掃引の中心にある3行。N と B が「断面を置く平面」を決めている

実験 — 軸を曲げる

稜を0にすると断面が円になり、とたんに「曲がったソーセージ」になります。バナナは5稜。

実物は「一様に曲がって」いない

バナナ.js に、こう書いてあります。「曲率は一様ではなく、中央より両端が強い」。 同じ半径の円弧にすると、きれいすぎて作り物に見えます。 実際のコードでは、軸の曲がり具合を場所ごとに変えています。 さらに果柄(へたの部分)では曲がる向きが逆になります。ここを直線にすると、 いかにも「くっつけました」という形になります。

つまずきポイント

断面を「水平のまま」置くと失敗します。軸が斜めになっているところでは、 断面が斜めに切られた形になり、曲がりの内側だけがつぶれます。 必ず接線に垂直な平面のうえに置くこと。 もうひとつ、垂直な向き N の取り方を場所ごとに勝手に決めると、 となりの断面との間で勝手にねじれます(テクスチャがよじれて分かります)。 ひとつ前の断面の向きを引き継いでいくのが定石です。

やってみよう
  1. 曲がりを0にして、まっすぐな棒に戻す。04章の回転体と同じものになることを確かめる。
  2. ねじれを0.8まで上げて、模様のよじれ方を見る。
  3. キュウリのプリセットで稜を10本にする。実物のきゅうりの縦すじは何本か、本物を見て数えてみる。