2015年1月8日木曜日

blender - Bezier曲線を生成する(2)

進捗




2015年になりました

前回、一続きの頂点群を与えて、それにフィットするようなBezier曲線を1つ(=アンカー2点+ハンドル2点)作成できるようになりました。
しかし、複数の曲線を生成してないので、かなり結果がしょぼいです。
複数の曲線を生成するのは簡単で、単に頂点群を適当に分割して、それにフィットさせれば良いだけです。

[オリジナルのfitcurve.cの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 誤差が許容範囲であれば終わります。
2.2 誤差が許容範囲よりちょい大きいくらいであれば、
  任意の頂点 P に対応する t 軸上の点(前回の記事)をニュートン法で変更しつつ許容範囲に収まらないか調べます。
  2.2.1 許容範囲に収まったら終わります。
2.3 誤差が許容範囲外であれば、一番誤差が大きい点で分割し、深さ優先で再帰させます。

この方法で同じように実装して検証してみたところ、確かに 2.2 によって早く収束します。
2.2 によって収束した場合は、その部分の曲線が許容誤差ぎりぎりになってしまいます。
2.2 を行わないほうが、どんどん曲線を増やしながら分割していくので、線の数は増えますが、かなりぴったりの曲線になりました。

また、2.3で、一番誤差が大きい点をアンカーにして分割していくのは、確かに効果的な気がします。
が、実際にやってみたところ、点群のインデックスを半分に分割していったほうが、曲線が少ない場合に良い結果が得られました。
Bezier曲線は、自由度が高いので、細かい範囲で使うよりも、ある程度大きな範囲で使ったほうが、効果的なのかもしれません

さらに、今回自分が考えている用途では、指定した曲線数で近似する、という機能も欲しいため、
2.3 で、深さ優先ではなく、幅優先で再帰させ、分割数をカウントしていくようにしました
まとめると、

[uimacの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 分割数が指定数に達していれば終わります。
2.2 誤差が許容範囲であれば終わります。
2.3 分割数をインクリメントします
2.4 誤差が許容範囲外であれば、頂点群のインデックスの半分で分割し、幅優先で再帰させます。


結果的に、オリジナルで実装されていたニュートン法は要りませんでした。
文字ばっかりですみませんが、そろそろプラグイン化して配布を予定しています。

0 件のコメント: