Get Location at Distance Along Splineが不正確

お世話になっております。

Historiaさんのこちらの記事などを参考にしながらスプライン上にメッシュを均等に配置することを考えています。

記事と同じようにBPを組んだのですが、どうもUE4側の
Get Location / Rotation at Distance Along Splineノードにかなり誤差があるのか、
例えば1mキューブを1m間隔で配置すると、スプラインがほぼ直線のところでもランダムにかなり大きな隙間が出来てしまいます。
連ねたメッシュをスプラインに沿ってBendさせるやり方なら隙間は消えるのでしょうが、今回は事情によりメッシュ側に変形なしでもうすこし正確に等間隔に配置できる方法を探しております

色々調べたのですが今の所このノードを使う以外スプライン上の位置を求める方法は見つかりませんでした。
何か別の方法があるのでしょうか?それともEpicさん側でノードの挙動を改善していただくのを待つ以外無いのでしょうか?

よろしくお願いいたします

質問拝見いたしました。
画像を元にこちらでもBPを作成してみましたが動作自体に問題はありませんでした。

画像では後半の部分が見切れていますので、仮定の話になりますが、「スプラインの中で曲線が発生している」場合はタンジェントの関係上、完全な直線とは言い切れず、計算としては等間隔に配置されているメッシュも、曲がったりして、等間隔に見えない場合があります。

一般的な解決方法としましては、線の形状事にしっかりと設定を行うことです。
直線にしたい部分に関しては、そこで点をうって「リニア」に変更することで、タンジェントは発生しませんので、間隔通りにメッシュが生成されると思います。

295627-ss04.png

You may also want to try using time rather than distance, you can use a constant velocity and perform some checks against the total spline distance to get the value you want.

ご回答と検証ありがとうございます。
結果といたしまして色々試していたところ問題を回避する方法を発見したしました。
ただ、やはり何らかのバグかと思いますので、もしEpicの方がご覧になられた際はレポートまたは情報をいただければ幸いです。

まず、私の現象ですが、スプラインのポイント間の距離をかなり長く伸ばしていったときに、ランダムにキューブの間隔が不正確になる(100cm間隔で置いてもキューブがどこも接していない状態になる。あるいは完全にめり込んでいるものもあると思います)というものです。

はじめの投稿のスプラインはリニアでなくカーブです。できれば直線だけでなくカーブの上にもなるべく正確な等距離にメッシュを配置する方法を探しております。
画像のように完全にどの辺も接していないかなりの隙間がある状態になるため、カーブで外側が膨らんだことによる隙間ということではなく、やはり距離計算に何らかの不具合があるように感じられます
この画像の程度のスプラインポイントの距離を取っても同様の現象はどなたも再現されませんでしょうか?

ただ、不思議なことに、両方のポイントを一旦リニアに変え

再度カーブに戻すことで、何らかの再計算が行われたのか、キューブが連続に置かれ、隙間が消えるようです。

この状態ですと、カーブの外側の僅かな隙間が見えるのみで、かなり正確に距離計算がなされているように思います。

以上、頂いたご回答などを踏まえ試行錯誤した結果のご報告です。
同様の現象がある、リニア→カーブの再変換をしなくてもこの現象を回避する方法があるなど、何か情報がございましたらシェアいただければ幸いです。
よろしくお願いいたします

Thank you for your reply. Could you elaborate?
Even if we use velocity, don’t we still have to convert it to distance on spline and get the location by the same node Get Location at Distance Along Spline? If I understood you correctly, I tried it before but I had quite similar issue as I posted.
Also please have a look at my last reply and let me know your thought.

事象を拝見していますが、この事象についてはバグではないと思われます

GetLocationAtDistanceAlongSpline はベジェ曲線上の距離から位置を求める関係上、必ずいくらかの誤差が発生します
これについてはベジェ曲線の性質や計算方法について調べるとよいでしょう

経験上、今回のように曲線がS字を描くような場合は誤差が大きくなることが多いです
ですので、誤差を減らすためにはなるべく単純な円弧になるよう、SplinePointを配置するのがよいと思います
また、Spline区間長に対して配置間隔が小さすぎる場合に関しても誤差が大きくなるように思います
ソースコードは確認していませんが、計算に浮動小数を用いることと、ベジェ曲線の長さを求める一般的な式から予測しています

添付画像の2つのActorは全長が同じSplineを用いたものですが、手前のものは曲線の切り替わり付近にSplinePointを追加してあります
そのため曲線の流れが少し変形していますが、誤差そのものは小さくなっています

一度ご検討ください

検証いただきありがとうございました。
はい、多少かじった程度ですがベジェ曲線の距離は近似でしか求められないことは理解しているつもりでしたが、
私の現象の場合、最後の2枚の添付画像にありますように、長いS字であってもポイントをリニアに変換→カーブに再変換という通常行わない手順を取れば不思議と、より正確に見える配置(目視ではわからない程度の近似誤差)に修正してくれます。
であればこそ、UE4の内部的にはじめからそうなるよう上手く処理を改善してくれないものかなあ…というところが正直思うところです。
ただこういった挙動を回避するためにも、アドバイス頂きましたように、ポイント間の曲線が単純な曲線になるようポイントの設定するということに気をつけて行きたいと思います。
ありがとうございました

複数のコメント、検証やご提案などありがとうございました。
スレッド内にありますように、ポイントをリニアに変換、カーブに再変換することにより何らかの再計算が行われて配置誤差が少なくなるという不思議なワークアラウンドを発見しました。
アドバイスいただいたように、可能なときはリニアに変える、ポイント間のカーブが単純な形になるようポイントを打つ、そしてどうしても必要なときはポイントの再変換で再計算を促す、ということを組み合わせていきたいと思います。
UE4内部でGet Location at Distance Along Splineノードの処理を元からそうなるよう改善していただけないものかという気持ちはまだ正直ありますが、回避策があるということで解決済みに設定いたします。
もしその他の良い案などございましたらお教えください。

このコメントの投稿時点では解決済みになっていますが、一応補足しておきます

一度Linearに変更してからCurveに戻すと誤差が低減されるのは、Linearに変更した時点でTangent情報が失われるためです
誤差が修正されているわけではありません
Tangentによる歪曲が少なければ、距離計算における誤差はほぼ出ません

であればこそ、UE4の内部的にはじめからそうなるよう上手く処理を改善してくれないものかなあ…というところが正直思うところです。

この点に関してはUE4の問題ではありません
数学の進歩によりベジェ曲線より高速で誤差の少ないアルゴリズムが登場するのを待つべきでしょう