ベジェ表面をレイトレースする方法は?


18

math.SEでこの質問を試してみましたが、驚くべきことに、答えは「方程式はあまりにも厄介です。関数を数値のルートファインダーに渡すだけです」。しかし、自分を自分のような「グラフィックスの男」と考え、デザイン作業のためにベジエ曲線を幅広く使用したことがあるなら、もっと良いことができると信じるようになりました。Kajiyaが公開しているアルゴリズムには、理解する背景がありませんが(Sylvester Matrices)、math.SEに関する関連するアドバイスは、結果はtの18次多項式であり、それを解決する必要があるということです数値的に。同様の結果が得られた別のアイデアがありました

それでは、レイ/ベジエ面の交点を代数的に解決して、明示的にコーディングし、超高速で超滑らかにすることを望むのは、完全なパイプの夢ですか?

それを除いて、この計算を実行するための最速の方法は何ですか?「ウィグルを見つけて」、再帰的なサブディビジョンの厳密な境界(およびターゲット)を取得できますか?数値のルートファインダー(ため息)を使用する必要がある場合、どのようなプロパティが必要ですか?速度に最適な選択肢はありますか?

私の元々の考えは、三角形に関する他の数学の質問への答えで説明したラプラス展開に似た特定の表面の準備についてでした。しかし、一般的な方法にも興味があります。ユタ州のティーポットのような固定された一連の形状を考えています。しかし、アニメーション化されたフレーム全体の時間的一貫性を最適化する方法に非常に興味があります。


任意のベジェサーフェスに適用できる一般的な方法、または特定のサーフェス用の高速な方法を準備する方法をお探しですか?実行前に表面形状が修正されますか?
-trichoplax

1
ベジェサーフェスをレイトレースするよりもはるかに簡単にレイマーチできることに注意してください。また、他の種類よりもはるかに簡単にレイトレースまたはレイマーチ単変量サーフェスを作成できます blog.demofox.org/2015/07/28/rectangular-bezier-patches
アランウルフ

回答:


14

まず最初に、ji屋レイトレーシングパラメトリックパッチ、SIGGRAPH 82 を考えていると思います。技術レポートバージョンの方が参考になるかもしれません。

そこから得られることは、不可能ではなく、代数幾何学と複素数で手を汚すことを気にしないなら、概念的に難しくないということです。しかし、それを直接行うことはばかげて高価です。

「実際の」レイトレーサーは、次の2つのことを組み合わせて行う傾向があります。

  • パッチに境界階層(AABBなど)を配置して、数値ルートファインダーの適切な「初期値」を取得します。これをうまく行えば、「しわ」の問題を回避できます。
  • パッチをDDGシェルにテッセレーションし、ポリゴンメッシュのようにレイトレーシングします。

その最後の点は、「非常に滑らかな」要件をなくすように聞こえますが、光線微分を使用している場合ほど悪くはありません。テッセレーションレベルを光線の「サイズ」に一致させると、エラーの境界がきれいになります。それに、おそらくテクスチャ座標の差分が必要になるので、交差テストの精度を制御するためにそれを使用することもできます。

時間的一貫性を活用することは悪い考えではありませんが、それをどのように行うかは、シーングラフ表現に大きく依存します。光線のコヒーレンスを見たいと思うかもしれません。光線パケットトレース光線の並べ替えについては、お気に入りの検索エンジンに問い合わせてください。


9

レイ/ベジエ面の交点を代数的に解くことを望むのは完全な夢です

はい、それは夢想です。バイキュービックベジェパッチは18次の代数曲面です。この曲面と光線を交差させるには、18次の多項式の根を見つける必要があります。これらの根には式はありません。数値法で見つける必要があります。 。実際、数学の結果(Abel-Ruffiniの定理)があり、次数4を超える方程式の根の公式は決して存在しないことを示しています。数学は、公式がまだ見つかっていないというだけではありません。彼らは存在することができないので、彼らは決して見つけられないと言います。

曲線形状の分析(代数的)光線追跡を本当に行いたい場合は、Steinerパッチを使用してみてください。これらは4次であるため、レイパッチの交差は、4次4次の多項式)を見つけることで計算できます。4次のルートを見つけるための数式はありますが、それらはかなり厄介であり、数式を確実に実装するコードを書くのは驚くほど困難です。


5

私が数十年前に使用した別のオプション(いいね!)は、 1985年からのTothのスキームを使用して、間隔計算を使用して検索スペースを絞り込むことです。IIRC、最終的にはニュートン・ラプソンに頼ることになりますが、再びIIRCでは、良い解決策を得るために1つまたは2つ以上のステップを必要とすることはめったにないと思います。

私はそれを見ていませんが(まあ、一見は別ですが)、Mitchellは間隔計算を使用したレイトレーシングに関する最近の研究をいくつか公開しています。

(ベジェサーフェスのみを実行している場合は、開花などのトリックを使用して境界と微分を取得できるため、インターバルメソッドは少し「過剰」になる可能性があります。ただし、ベジェ曲線を他の関数と組み合わせる場合、例えば、軸の周りの回転、その一般性はより有用です。)


1

互換性の問題がある場合は、https://www.shadertoy.com/results?query = bezier年齢で並べ替え:

、... 2Dスプラインまでの距離を返すか、3Dパッチをトレースして、多くのスプラインサブセットの多くのソリューションを示します。スプラインとパッチには多くの形式があります。天国は最も単純で、ベジェは単純で、Nurbは過度に複雑です。スプラインに追加する制約が多いほど、より簡単になります。NURBSは拡張機能の過剰です。-重みの不均一性( "NU")は、より対称的なスプラインと比較して効率を低下させます。 (再帰的に解決)。

bezier-patch-tracingはルート解決であり、それに伴って精度に関するコンテキストの優先順位付けが行われます。二次方程式を解く順序。これは、指数関数的な複雑さと精度の低下により、キュービックよりも高い指数では実用的ではなくなります。

ray-marching == sphere-trackingはルート解決へのより単純な発見的アプローチであり、ほとんどのスプラインパッチをレンダリングするためのシンプルで最も効率的なソリューションと思われます。

ラグランジュ表現は、トレース/マーチングを単純化します(Lポイントがスプライン上にあるのに対し、ControlVectorポイント(まったく同じスプラインの)はめったにスプライン上にないため)

statsとendの1次導関数が== 0である天空スプラインの特別な場合。連続性を簡素化し、差分を減らします(減算を減らします)。heavensine-patchは、1回のパスで効率的にトレースできます:https ://www.shadertoy.com/view/4djfW3 他のキュービック(またはそれ以上の)スプラインは、ヒューリスティックな球追跡/レイマーチングアプローチをより効率的に(および "すべてのルートを分析的に計算して最小の正のルートを維持することを大胆に行うよりも(十分に正確)(各ルートに対して指数関数的に累積する精度エラーを伴う)。


コンピューターグラフィックスでは、スプラインとパッチは2006年までにほぼ完全にzブラシに置き換えられています。 0、球体の長さは0、ユニオンはシンプルで便利です)。ルックアップテーブルのメモリコストを比較的低くして、パフォーマンスを大幅に向上させるための精度のわずかな低下については、GPUで簡単に動的にできます。


気にしないで。すべての3Dパッチソリューションは、球の追跡によって行われます。
ollj

パッチが単純であれば、パフォーマンスと精度が大幅に向上します。シームスの天国のパッチがいくつかの反復であなたを非常に遠くまで連れて行く点まで:
-ollj

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.