2016-05-22 4 views
1

私は、ビームで構成された構造の3Dモデルを生成し、オブジェクトのいくつかのビュー(フロント、サイド、トップ、アイソメ)を生成するプログラムをC#で構築しようとしています。どの3Dレンダリング技術/アルゴリズムがエッジでビームを描くのに最も効果的ですか?

私は表面を描画する必要があります(エッジは十分です)、私は描画する各ラインを計算してきたし、その後

GraphicObject.DrawLine(myPen, x1, y1, x2, y2) 

これは、これまでのところうまくいきました、しかしとしてでそれをしないと構造体に部品を追加すると、GraphicObjectのリフレッシュに時間がかかりすぎます。だから私は描画する線の量を減らすために線の可視性チェックに入っています。

私はWikipediaとそのPDFをいくつか検索しましたが、私が見つけたものはすべて表面に向けられています。だから私の質問:オブジェクトのエッジの可視性をチェックするための単純化されたアルゴリズムがありますか、または私は別のアプローチ、表面を検討するように行く必要がありますか?

ご協力いただきありがとうございます。

その他の注意事項/質問:

私の現在のアプローチ:

  • 計算ローカル軸内のすべてのビーム(すべての頂点)

    • =>自分のグローバル位置
    • に移動
    • =>ポイントのペアを含むリストを作成する(ビューに投影され、スケーリングされたもの)
    • =>GraphicObject.DrawLineポイントのペアのリスト)私はDrawLineメソッドを使用するのではなく、ピクセルのビューを計算したい場合
  • は全部がより速くなるでしょうか?

スクリーンショットは(まだ完全に完了していないが)、何をするつもりだ構造の種類には、次のとおりです。

  • 構造ビュー

structure view

  • 構造詳細

structure detail

答えて

2

パフォーマンスを向上させるソリューションは2つあります。 a)計算をグラフィックカードに切り替えます。 b)kdツリーまたは他の同様のデータ構造を使用して、目に見えないエッジをすばやく削除します。

詳細はこちら a)の場合、多くの計算では多くの頂点(長さ3のベクトル)に何らかの行列が掛けられています。 CPUは一度にこれらの操作を2回しか実行しないため、速度が遅くなります。たとえば、CUDAを使用してGPUに切り替えると、より多くのメモリアクセスインフラストラクチャを使用して並列処理をより多く行うことができます。また、OpenGL/DirectX/Vulkanなどを使用して、ライン自体をレンダリングして、グラフィックカードやWindowsコード/ライブラリによって導入されたその他の問題から戻って結果を得る必要はありません。ほとんどの場合、これによりパフォーマンスが向上します。

b)の場合は、シーン全体を見ていないときにのみ役立ちます(その場合、すべてを描画する必要があります)。この場合、シーンをkdツリーやその他のデータ構造に保存して、ビュー領域外にあるものをすばやく削除することができます。あなたは通常、いくつかの直方体とピラミッド/フューストラムを交差させる必要がありますので、より多くの数学が必要です。

すべてを見たい大きなシーンに役立つ妥協点として、詳細レベルの調整を検討することができます。あなたの例から、読み込まれたBeanは8個程度のコンポーネントで構成されています。あなたが十分遠ければ、あなたは8を区別することができませんので、ただ一つを描きましょう。たくさんの丸められたエッジがある場合は、これを非常に簡単にすることができます。

関連する問題