曲面の3次元CG(2)数式で書けない曲面

世の中には数学で学んだ数式で表せないような形状が溢れています。どうやって作っているんでしょうか?もう少し正確に言うと球面は
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222627.jpg
と書けますが
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222633.jpg
これはどうでしょう?もちろん数学で表現できますが容易では無いですね。それに一々数式が異なるのは形状表現を複雑にします。そこで考えられたのが制御点とパッチという概念による曲面表現方式です。1パッチは次のように表現されます。
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222638.jpg
4×4の格子状に配置した16個の点で曲面形状が制御できます。係数Bの決め方で最も多く使われるのがBernstein関数です。この時この曲面をBezier曲面と呼ばれます。また各点を制御点(コントロール・ポイント)と言います。スクリプトでは次のように記述します。
SbezTest=1 1(
[0,0,0],[50,0,0],[100,0,0],[150,0,0],
[0,25,0],[50,25,0],[100,25,0],[150,25,0],
[0,50,0],[50,50,0],[100,50,0],[150,50,0],
[0,100,0],[50,100,0],[100,100,0],[150,100,0]
);
uvmesh(20,20);
etrgmesh(SbezTest);
end;
この例では格子上に単純に配置しただけなので形状は平面になります。
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222645.jpg
例えば制御点を少し変えてみると
上に浮かせたい制御点を上に移動させて下に沈めたい制御点は下に下げます。
SbezTest=1 1(
[0,0,0],[50,0,-100],[100,0,0],[150,0,0],
[0,25,0],[50,25,130],[100,25,130],[150,25,0],
[0,50,0],[50,50,-130],[100,50,-130],[150,50,0],
[0,100,0],[50,100,0],[100,100,100],[150,100,0]
);
uvmesh(20,20);
etrgmesh(SbezTest);
end;
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222648.jpg
こんな感じになります。さらに複雑な形状制御を行うには複数のパッチを繋げた曲面を定義する必要があります。
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222653.jpg
もっと高度な応用として凹凸をこのBezier曲面に転写したりする事も出来ます。
https://cdn-ak.f.st-hatena.com/images/fotolife/c/cat_falcon/20190804/20190804222656.jpg
次回は色の付け方についてを予定しています。