本日はBlender枠です。
BlenderはOSSで開発されているため、全ソースコードを閲覧することができます。
今回はBlenderのスカルプトの各ブラシがどのようなアルゴリズムで処理を行っているのかが気になったため調査をします。
〇Blenderのソースコード
Blenderのソースコードは以下のリポジトリから閲覧することができます。
なおOSSであるため開発自体は公開の場で行われていますが、更新が盛んであり、記事公開本日時点でも20を超えるPRが上がっています。

この中でスカルプトのブラシは以下のコードが担当しています。
ここでは各ブラシごとのコードが.cc形式(C++)で定義されています。
〇クレイブラシのアルゴリズム
クレイブラシのブラシで定義した平面(点𝑝と法線 𝑁により定義)に対して、各頂点の平面からの距離に基づいて補正を行っています。各頂点 𝑣_𝑖について、平面からの距離d_iは以下のようになります。
つまりまず、ブラシで定義した「平面」を作っています。
次に各頂点がその平面からどれだけ離れているかを測り、その距離に応じて、頂点を平面方向に押し付ける(または引く)ことを行います。
もしくは
となります。
ここで f_iはブラシの影響度 λは補正率(定数)です。
等号の違いは押し出しか引くのかを意味します。
ブラシで触れた部分に対して、あたかも粘土を押し固めるかのように、各頂点が平面に向かって押されます。頂点が平面からどれだけ離れているかを測り、その距離に応じた変位を与えることで、局所的な盛り上がりやへこみを作り出します。減算モードにすれば、押し付けるのではなく、平面から離れる方向に頂点が動き、逆の効果(膨らみ)になります。
以上がクレイのアルゴリズムになります。