ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】滑らかな曲面、B-Spline Surfaceを作る

成果物

www.youtube.com
B-Spline曲線を拡張してB-Spline Surfaceを作ってみました。でこぼこの面を綺麗に補完することができました。

仕組み

こちらがB-Splineの式
{\displaystyle \mathbf {S} (t)=\sum _{i=0}^{m-n-2}\mathbf {P} _{i}b_{i,n}(t)\ {\text{,}}\qquad t\in [t_{n},t_{m-n-1}]}.
B-Spline Surfaceの式です
{\displaystyle \mathbf {S} (u,v)=\sum _{i_{u}=0}^{m_{u}-n_{u}-2}\sum _{i_{v}=0}^{m_{v}-n_{v}-2}\mathbf {P} _{i_{u},i_{v}}b_{i_{u},n_{u}}(u)b_{i_{v},n_{v}}(v)\ {\text{,}}\qquad u\in [u_{n_{u}},u_{m_{u}-n_{u}-1}],\ v\in [v_{n_{v}},v_{m_{v}-n_{v}-1}]}.
非常に似た式になっています。b()はB-Spline基底関数で、グラフにしてみたのでご覧ください。この基底関数を使って、どの制御点の座標をどのぐらいブレンドするのかを決定します。
www.youtube.com
B-スプライン曲線 - Wikipedia

コード

C#で書かれたこちらのコードをもとにしています。
B-Spline Surface - Unity Forum
Nth_order_B_spline_surfaceという名前で保存しています。
github.com