曲線(直線)を単位距離で分割する方法

   7053   7   0
User Avatar
Member
7 posts
Joined: 3月 2020
Offline
Bezier曲線(直線)をなるべく正確な単位距離で分割したいので、
方法がありましたらご教示お願いします。

まず例として自分の試した方法です
Bezier曲線(または直線)をmeasureノードで長さを計ります。アトリビュートperimeterは650です
この650を200ごとに分割これを繰り返し最後は50余らせるという想定です。

最初の曲線を切り出すのにcarveノードを使用しましたが、carveノードは単位距離は使えない(割合でカットする)ため、
firstUは0、secondUは200/650で0.3….という値を入れましたが分割された曲線には当然ながら誤差が生まれます。

数回程度であれば誤差が与える影響は少ないのですが、多くなるほど大きくなるので困ってしまいました。
User Avatar
Member
2625 posts
Joined: 6月 2008
Offline
リサンプルノードは、ラインを等量で分割します。
Using Houdini Indie 20.0
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
User Avatar
Member
7 posts
Joined: 3月 2020
Offline
お答えいただき、ありがとうございます。
リサンプルを通すと、ベジエがポリゴンラインになってしまいますね。
それと誤差が発生してしまうようです。
User Avatar
Member
2625 posts
Joined: 6月 2008
Offline
おそらく、ポリゴンを変換してベジェに戻しますか?
Using Houdini Indie 20.0
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
User Avatar
Member
11 posts
Joined: 2月 2015
Offline
primuvconvert 関数を使って単位距離を変換できるので、それを Carve SOP で使うのはどうでしょう。

run over primitive :
float curvelength;

// typeid : 1 Poly, 2 NURBCurve, 3 BezierCurve
int typeid = primintrinsic(0, "typeid", @primnum);
if(typeid == 1)
    curvelength = primintrinsic(0, "measuredperimeter", @primnum);
else if(typeid == 2 || typeid == 3)
    curvelength = primintrinsic(0, "arclength", @primnum);
    
float unitlen = clamp(chf("len") / curvelength, 0, 1);
f@domainu = primuvconvert(@OpInput1, set(unitlen, 0), @primnum, PRIMUV_UNITLEN_TO_UNIT)[0];

Image Not Found
Edited by Satoru - 2020年8月12日 00:23:21

Attachments:
carve.hiplc (150.5 KB)

User Avatar
Member
7 posts
Joined: 3月 2020
Offline
ご返答ありがとうございます。
>Enivobさん
いえ、分割まではベジェ以外に変換する想定ではないです。
>Satoruさん
結果として、ベジェの自体の仕様?精度が不安定で不明なため、
正確な位置でカットするのが難しいのかもしれません。諦めようと思っています。

頂いたhiplcを検証しましたので報告します。
頂いたvex(Aとします)こちらで以下の部分のみ改変したVEX(Bとします)
vexf@domainu = clamp(chf(“len”) / curvelength, 0, 1);

1回目と2回目にそれぞれ長さとカーブの異なるベジェを使用しました。
1回目はhiplc内のフリーハンドで描かれてるベジエを使用しました。カットするlengthは1を指定、結果Aのが精度がよく若干誤差がございました。
2回目はこちらで用意したline(Bezier長さは121)カットするlengthは20を指定、結果Bのが精度がよく誤差はありませんでした。

この結果から丸め誤差みたいな要因でベジェの長さ自体が曖昧になってしまうのかもしれません。
画像左がAのattribwrangle右がBでございます。
Edited by mikuriya1 - 2020年8月13日 04:03:54

Attachments:
キャプチャ1.JPG (23.6 KB)
キャプチャ2.JPG (25.4 KB)

User Avatar
Member
11 posts
Joined: 2月 2015
Offline
こちらでもベジェで結果が合わないのを確認しました。検証足らずで申し訳ないです。
User Avatar
Member
7 posts
Joined: 3月 2020
Offline
いえいえ、
vexの使い方は大変参考になります。ありがとうございます
  • Quick Links