目次/第10章
曲がったものを作る
sweep along a spine — 軸に沿った掃引
- 回転体(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));
実験 — 軸を曲げる
稜を0にすると断面が円になり、とたんに「曲がったソーセージ」になります。バナナは5稜。
実物は「一様に曲がって」いない
バナナ.js に、こう書いてあります。「曲率は一様ではなく、中央より両端が強い」。 同じ半径の円弧にすると、きれいすぎて作り物に見えます。 実際のコードでは、軸の曲がり具合を場所ごとに変えています。 さらに果柄(へたの部分)では曲がる向きが逆になります。ここを直線にすると、 いかにも「くっつけました」という形になります。
断面を「水平のまま」置くと失敗します。軸が斜めになっているところでは、 断面が斜めに切られた形になり、曲がりの内側だけがつぶれます。 必ず接線に垂直な平面のうえに置くこと。 もうひとつ、垂直な向き N の取り方を場所ごとに勝手に決めると、 となりの断面との間で勝手にねじれます(テクスチャがよじれて分かります)。 ひとつ前の断面の向きを引き継いでいくのが定石です。
- 曲がりを0にして、まっすぐな棒に戻す。04章の回転体と同じものになることを確かめる。
- ねじれを0.8まで上げて、模様のよじれ方を見る。
- キュウリのプリセットで稜を10本にする。実物のきゅうりの縦すじは何本か、本物を見て数えてみる。