例としてマップを使用した分析サーフェスの生成。 パート3

はじめに


正確な物理モデリングには、ハイポリカードが必要です。 カードの精度が高いほど、より多くのメモリを消費し、高さを取得するためにより多くのデータを処理する必要があります。 スプライン補間を使用すると、現在の緯度と経度に便利なステップで、任意の解像度のグリッドを取得できます。

仕事内容


パート1.データの準備
パート2.均一なグリッドの生成
パート3.分析サーフェスの作成

サブタスクの目的


すべての開始点を含む均一なグリッドからスプラインサーフェスを取得します。 任意のステップで2つの座標に高さ計算を実装します。

アルゴリズム


アルゴリズムを検索する際の最大の問題は、高さマップ(補間)のすべての必要なポイントを含む接続されたスプライン(境界条件)からサーフェスを作成する適切な説明を見つけることでした。

また、初期データと比較して、サーフェス上のパーツの数が減少するだけであることに留意する必要があります。 シャノン-コテルニコフの定理を思い出すのに十分です

高さマップからスプラインサーフェスを作成するアルゴリズムの優れた説明は、 E。A. Nikulin著の本「コンピュータージオメトリとコンピューターグラフィックスアルゴリズム」に記載されています。 この領域には多くの理論的な材料と数学が含まれています(ボリュームサーフェスの作成を可能にするフラクタルアルゴリズムによるサーフェス生成へのアプローチの説明もあります)。

数学は本で見つけることができ、実装は記事の最後に添付されるので、ここでは数学的な計算とコード例を示しません。

処理結果


均一なグリッドを処理した結果、スプライン係数を持つかなり大きなファイルが得られます。

1 33
3.30000000000000E+0001 1.00000000000000E+0000 -1.51788304147970E-0018 -1.95156391047391E-0018
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.50000000000000E+0002 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1 34
3.40000000000000E+0001 1.00000000000000E+0000 8.67361737988404E-0019 2.38524477946811E-0018
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.50000000000000E+0002 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1 35
3.50000000000000E+0001 1.00000000000000E+0000 -2.60208521396521E-0018 -3.03576608295941E-0018
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
2.16840434497101E-0019 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000

1.50000000000000E+0002 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000
0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000



つまり、均一なグリッドの4ポイントごとに、独自のスプラインを作成しました。このスプラインは、2番目の導関数に沿ってすべての隣接する導関数と分離できません。 これで、スプラインの任意のポイント、したがってマップ全体の高さを決定できるようになりました。

ご覧のとおり、スプライン係数の行列は非常にまばらであるため、圧縮率は高くなります。 データ処理速度を落とすことなく、カードが占有するスペースを節約できます。

結果の表面の例:





結論


マップを自由に移動できる機能は、アプリケーションソフトウェアの開発に大きな可能性をもたらします。 ランドスケープの詳細を動的に変更するアルゴリズムは、完全な強度( LODMegaTexture )で機能し始めます。 高さは一定の複雑さで計算されます(行列の乗算)。

次に、投影ではなくジオイド上に直接マップを作成して、地球の領域または地球の表面全体を高精度でシミュレートできます。 そして、それはすべてファンタジーに十分です。

この結果を達成する他のアルゴリズムがあります。 それはすべてタスクに依存します。 提案されたアプローチは、反射の理由とタスクの解決への小さな推進力のみを提供します。

Delphi7のジェネレーターソース

Source: https://habr.com/ru/post/J124108/


All Articles