1

私は持っている:

float[,] nodesN = null; //indexes:
                        //number of node;
                        //value index 0->x, 1->y, 2->temperature
int[,] elements = null; //indexes:
                        //indexof element (triangle)
                        //1, 2, 3 - vertexes (from nodesN)
List<Pair> edges = null; //Pair is a class containing two int values which are
                         //indexes of nodesN

そして、すべての要素とエッジを実行するはずの関数SharpGL.OpenGLCtrl

    private void openGLCtrl1_Load(object sender, EventArgs e)
    {
        gl = this.glCtrl.OpenGL;
        gl.ClearColor(this.BackColor.R / 255.0f,
            this.BackColor.G / 255.0f,
            this.BackColor.B / 255.0f, 1.0f);
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
    }

    private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
    {
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
        gl.LoadIdentity();
        gl.Translate(0.0f, 0.0f, -6.0f);

        if (!draw) return;

        bool drawElements = false;

        if (drawElements)
        {
            gl.Begin(OpenGL.TRIANGLES);

            for (int i = 0; i < elementNo; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    float x, y, t;
                    x = nodesN[elements[i, j], 0];
                    y = nodesN[elements[i, j], 1];
                    t = nodesN[elements[i, j], 2];

                    gl.Color(t, 0.0f, 1.0f - t);
                    gl.Vertex(x, y, 0.0f);
                }
            }

            gl.End();
        }

        gl.Color(0f, 0f, 0f);            

        gl.Begin(OpenGL.LINES);

        //for(int i=edges.Count-1; i>=0; i--)
        for(int i=0; i<edges.Count; i++)
        {               

            float x1, y1, x2, y2;
            x1 = nodesN[edges[i].First, 0];
            y1 = nodesN[edges[i].First, 1];

            x2 = nodesN[edges[i].Second, 0];
            y2 = nodesN[edges[i].Second, 1];

            gl.Vertex(x1, y1, 0.0f);
            gl.Vertex(x2, y2, 0.0f);                
        }   

        gl.End();          
    }

しかし、すべてのエッジを描画するわけではありません。変更drawElementsすると、異なる数のエッジが描画されます。に変更for(int i=0; i<edges.Count; i++)するとfor(int i=edges.Count-1; i>=0; i--)、エッジは正しく生成されますが、描画されません。

画像:
for(int i=0; i<edges.Count; i++)
drawElements=false
http://img225.imageshack.us/img225/9295/noup.jpg

for(int i=edges.Count-1; i>=0; i--)
drawElements=false
http://img828.imageshack.us/img828/9595/nodown.jpg

for(int i=0; i<edges.Count; i++)
drawElements=true
http://img64.imageshack.us/img64/4929/withup.jpg

for(int i=edges.Count-1; i>=0; i--)
drawElements=true
http://img833.imageshack.us/img833/9167/withdown.jpg

これの何が問題なのですか?すべてのエッジを描画するにはどうすればよいですか?

編集:
気にしないでください。SharpGL を削除し、OpenTK でまったく同じコードを書きました。何が悪いのか不思議に思うことなく、うまく機能します。SharpGL は非常に大量のメモリを使用するため、これは良い呼び出しでした。

4

1 に答える 1

2

かつて私は非常によく似た問題を抱えていました。

Zバッファが原因でした。平面があり、それをワイヤーフレームで描画したい場合、座標が重なり合い、そのようなアーティファクトが発生します。これは数値的に定義されていない動作です - 同じ深度に 2 つのオブジェクトを描画します。どちらが上に来るかは決してわかりません。

解決策の 1 つは、ワイヤーフレームを少しオフセットすることです。いくつかの 3d モデリング パッケージでそれに気付きました。ゲーム エンジンでは、ジオメトリ (壁の銃声の跡) のスプライトをオフセットすることも一般的です。もう 1 つは、z バッファーを無効にして、手動で隠線を隠している可能性があります。

要素の描画を無効にする場合は、z-buffer の別の問題になる可能性があります。これは、遠くと近くのクリッピング プレーンによって囲まれています。ほとんどの場合、それらのいずれかの深さで正確に線を引きます (私の推測では 1 つではありません)。

編集。あなたのコードを少し読みました。私が見たいのは、射影行列をどのように構築するかです。まったく触れていない場合 (私の記憶が正しければ)、ニア クリッピング プレーンとファー クリッピング プレーンはそれぞれ -1.0 と 1.0 です。でも、z=-6.0で描いてるから間違ってるかも…

もう1つは、置き換えてみてください:

gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);  

次のようなものがあります。

gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);  
于 2011-01-08T21:20:51.343 に答える