3

状況

2 つのビューを持つ高さフィールド エディターを実装しています。メイン ビューには、高さフィールドが 3D で表示され、トラックボール ナビゲーションが可能になります。編集ビューには、高さフィールドが 2D 画像として表示されます。
この高さフィールドの上に、その外観を変更する新しい画像を適用できます (穴を開けたり、特定の領域を低くしたり、高くしたりします)。これはパッチと呼ばれます。
高さフィールドとパッチの両方が 1 チャネルのグレースケール png 画像です。

視覚化には、視覚化ライブラリフレームワーク (c++) と OpenGL 4 を使用しています。

タスク
実行時にこのパッチを (個別の画像として) 作成する、2D 編集ビュー (正投影) で使用可能な描画ツールを実装します。

重要事項・制約事項

  • 高さフィールドの画像は、スケーリング、回転、転置することができます。
  • パッチは高さフィールドと同じスケールを持つ必要があるため、パッチ内の 1 つのピクセルが高さフィールド内のピクセルを正確にカバーします。
  • スケーリングの結果として、フレームバッファ ピクセルのサイズは、ハイト フィールド/パッチ イメージ ピクセルのサイズより大きくなったり小さくなったりする場合があります。
  • シーンには、パッチに表示されるべきではないオブジェクト (例: 矢印) が含まれています。

質問 このタスクへの正しいアプローチは何ですか? これまでのところ、次のアイデアがありました。

  • ある種の QT キャンバスを使用してパッチを作成し、それを高さフィールド イメージ プロポーションにマップして、新しいパッチとして保存します。これは、ユーザーが描画を開始するたびに行われます。この方法では、元に戻すの実装が簡単になります (最後に作成されたパッチを削除します)。
  • ニュートラルカラーの画像を textre バッファオブジェクトと組み合わせて使用​​して、ある種のキャンバスを自分で実装します。このようにして、ユーザーが描画を停止するたびに、キャンバスの内容が高さフィールドにマップされ、パッチとして保存されます。次の描画のためにキャンバスをリセットします。
  • フレーム バッファ オブジェクトを使用した例をいくつか示します。ただし、このアプローチが私のニーズに合っているかどうかはわかりません。open gl を使用してサブ イメージをフレーム バッファに描画すると、結果のイメージにすべてのデータが含まれませんか?
4

1 に答える 1

1

これが私が最終的に得たものです:

視覚化ライブラリのPickIntersectorを使用して、編集ビューで高さフィールド画像を再度選択します。これは、画像のローカル座標を強調します。紫外線座標に変換され、次にピクセル座標に変換されます。これは、ユーザーがマウスボタンを押したときに実行され、マウスが画像上にある限り移動したときに発生し続けます。

このすべてのポイントを収集するPatchCanvasクラスがあります。コマンドでは、Anti-Grain Geometryライブラリを使用して、ポイントから作成できる線を正確にラスタライズします。

その後、ラスタライズされた画像が固定サイズのグリッドに分割されます。すべてのタイルは、ニュートラルな色とは異なる色でスキャンされます。ニュートラルカラーのみを含むタイルは削除されます。もう1つは、適切な命名スキーマに従って保存され、次のフレームでロードできます。

Aggは異なるサイズのラインをサポートします。これは実装されたジェットではありませんが、画面スペース内の隣接するポイントを選択し、それらのuv座標を取得してピクセルに変換し、これを線の太さとして使用するという考え方です。これにより、ズームアウトビューの幅が広くなります。

于 2011-08-19T13:58:03.690 に答える