SharpGL: Es können nicht alle Linien aus Liste ziehen
Frage
ich habe:
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
Und Funktion, die angeblich tun alle Elemente und Kanten auf 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();
}
Aber es ist nicht alle Kanten ziehen. Wenn ich drawElements
ändern zieht es unterschiedliche Anzahl von Kanten. Ändern for(int i=0; i<edges.Count; i++)
zu for(int i=edges.Count-1; i>=0; i--)
zeigt, dass esges korrekt erzeugt werden, aber sie sind nicht gezeichnet.
Bilder:
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
Was ist daran falsch? Wie kann ich alle Kanten ziehen?
EDIT:
Macht nichts, ich fiel SharpGL und schrieb genau den gleichen Code in OpenTK. Es funktioniert ausgezeichnet, ohne mich zu fragen, was falsch war. Das war ein guter Ruf, weil SharpGL enorm große Menge an Speicher verwendet.
Lösung
Sobald ich ein sehr ähnliches Problem hatte.
Es war wegen Z-Puffer. Wenn Sie eine Ebene und wollen, dass es das Drahtgitter ziehen, als die Koordinaten überlappen und Artefakte, wie sie entstehen. Es ist numerisch Verhalten nicht definiert - zwei Objekte auf der gleichen Tiefe zeichnen. Man kann nie wissen, was man an der Spitze kommt.
Eine Lösung ist das Drahtgitter ein wenig zu kompensieren. Ich bemerkte, dass in einigen 3D-Modellierung Pakete. In Game-Engines ist es auch für Offset-Sprites auf Geometrie (gunshot Markierungen an einer Wand) üblich. Ein anderer könnte die Z-Puffer werden zu deaktivieren und manuell verschließen verdeckte Linien.
Der Fall, wenn Sie deaktivieren Zeichnung von Elementen zu einer neuen Ausgabe mit Z-Puffer sein könnte. Es wird von nah und fern Zuschneideebenen begrenzt. Wahrscheinlich Sie die Linien genau in der Tiefe von einem von ihnen ziehen (meine Vermutung weit ist).
EDIT. Ich las Ihren Code ein bisschen. Ein Ich mag würde, um zu sehen, wie Sie die Projektionsmatrix konstruieren. Wenn Sie rührten es nicht an allen als (wenn ich mich richtig erinnere) die nahen und fernen Zuschneideebenen sind bei -1,0 bzw. 1,0. Aber ich könnte falsch sein, da Sie bei z ziehen = -6,0 ...
Die andere Sache, versuchen Sie ersetzen:
gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);
Mit etwas entlang der Linien von:
gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);