3

私は今、学校のプロジェクトに取り組んでいます。これは 3D 編集ソフトウェア (Maya の非常に最小化されたバージョンのようなもの) であることを意図しています。「Windows アプリケーション プロジェクト」を使用して、C# で記述する必要があります。プロジェクションからシェーディングまで、すべての 3D を自分で実装するつもりです。私の質問は、C# Windows アプリケーションで単一のピクセルに直接アクセスするにはどうすればよいですか? ウィンドウにメイン ビュー ポートを配置することはわかっています。でも、どのように作るかはまだ決めていません。ビューポートの境界を定義し、各ピクセルを個別にペイントできる、使用できる組み込みオブジェクトはありますか? (私はここで暗闇の中で撮影しているだけです。C#についてはあまり知りません。ほとんどCでプログラミングしています)

ありがとう、マルキ。

4

5 に答える 5

3

CreateGraphics() メソッドを使用すると、これが機能するはずです。

Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);

ピクセルを特定の色に設定するには、 の代わりにこれを使用しますColor c = b.GetPixel(x,y)

b.SetPixel(x, y, c); // where c is a Color

ビューポートが必要な場合は、パネルまたは PictureBox (おそらく Dock: Fill を使用) を配置してから、次を使用します。

Bitmap b = new Bitmap(viewport.Width, viewport.Height, viewport.CreateGraphics());

以前に使用された最初の行の代わりに。

しかし、あなたがやりたいことから、 OnPaint イベントを使用する方が良いと思います:

void pnlViewport_Paint(object sender, PaintEventArgs e) {
    if ( e.ClipRectange.Width < 1 || e.ClipRectangle.Height < 1 ) return;
    Bitmap b = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height, e.Graphics);
    // ...
}

このイベントは、コントロールの描画が必要になるたびに発生します。最初の行は、描画されている領域が空かどうかをチェックします。これは CPU 時間を節約するだけでなく、アプリケーションがクラッシュする可能性があります。0x0 ビットマップを作成するためです。

編集: はい、Dock = DockStyle.Fill の場合、これはサイズ変更可能です。ウィンドウのサイズが変更されると、コントロールが拡大してスペースを埋めます。その後、再描画されます - イベントが発生します。

EDIT 2:他の人が指摘したように、これはまだ遅いです。自分で3D描画を行う必要があるように聞こえるので、おそらくSDL.NET(ハードウェアアクセラレーションを使用できると思います)が最適です。使用する(遅い)SurfaceControlさえあります。

于 2009-01-24T16:41:25.210 に答える
2

Christian Graus は、www.CodeProject.com でグラフィック操作に関する優れた記事をいくつか公開しています。彼らはあなたの質問に答えるはずです。

于 2009-01-24T16:34:26.457 に答える
1

3D エディタ アプリケーションは、画面に描画するだけでなく、非常に高速である必要があります。.NET での標準的なアプローチは、 person-bで説明されているように、Bitmap および Graphics クラスを使用することです。しかし、これは遅くなります。Bitmap.LockBits()と巧妙な最適化を使用することで速度を向上させることができますが、それでも必要なパフォーマンスが得られるとは思えません。すべての CPU を使い果たし、それでも 10 ~ 20 FPS 未満でスタックします (数値は推測です)。ハードウェア アクセラレーションは、実際に進むべき道です。shuggycoukには正しい方向へのリンクがあります。

残念ながら、ハードウェアのアプローチでは、プロジェクションとシェーディングも取り除かれます。それがハードウェアの目的だからです。だから、あなたがそれを使えるかどうかはわかりません...おそらく.NETの「オーバーレイ」に関する情報を探してください。これは、すべてのメディア プレーヤー ソフトウェアがムービーを表示する方法です。標準の GDI/GDI+ よりも確実に高速で、2D のままです。または、DirectX を使用してトリッキーな回避策を実行することもできます。自分で定義した 2D 形状を描画するために使用します。;)

于 2009-01-24T17:00:03.910 に答える
0

ピクセル速度が必要な場合は、high-speed-graphing-control-for-net-or-mfcがヒントを提供してくれるかもしれません。

于 2009-01-24T18:15:34.973 に答える
0

3D を実行している場合は、最近太陽の下でほぼすべての GPU が提供するハードウェア アクセラレーションを利用するのが理にかなっています。Windows 固有の API を使用することに満足している場合は、DirectX の 3D API がマネージ ラッパーを介して公開されます。また、主にゲームを念頭に置いて設計されたXNAツールセットもありますが、C# から Direct-X 3D アクセラレーションによる描画を行う方法の豊富な例を提供します。

于 2009-01-24T16:50:32.150 に答える