SharpGL: Non è possibile tracciare tutte le linee da List
Domanda
ho:
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
E la funzione che dovrebbe fare tutti gli elementi e bordi su 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();
}
Ma non trae tutti i bordi. Se cambio drawElements
trae diverso numero di spigoli. Cambiare for(int i=0; i<edges.Count; i++)
a spettacoli for(int i=edges.Count-1; i>=0; i--)
che esges sono generati in modo corretto, ma non sono disegnati.
Immagini:
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
Cosa c'è di sbagliato in questo? Come posso trarre tutti i bordi?
Modifica
Non importa, ho lasciato cadere SharpGL e ho scritto esattamente lo stesso codice in OpenTK. Funziona eccellente senza di me chiedo che cosa era sbagliato. Questa è stata una buona chiamata perché utilizza SharpGL enormemente grande quantità di memoria.
Soluzione
Una volta ho avuto un problema molto simile.
Si deve a z-buffer. Se si dispone di un aereo e vuole disegnare di wireframe che le coordinate si sovrappongono e manufatti come quelli sorgono. E 'numericamente undefined comportamento - disegno due oggetti sulla stessa profondità. Non si sa mai che si arriva in cima.
Una soluzione è quella di compensare il wireframe un po '. Ho notato che in alcuni pacchetti di modellazione 3D. In motori di gioco è anche comune per compensare sprite sulla geometria (segni di arma da fuoco su un muro). Un altro potrebbe essere invalidante z-buffer e manualmente linee nascoste occludere.
Il caso quando si disabilita disegno di elementi potrebbe essere quello di un altro problema con z-buffer. E 'delimitata da lontano e da vicino piani di ritaglio. Molto probabilmente si disegna le linee esattamente alla profondità di uno di loro (la mia ipotesi è di gran lunga uno).
EDIT. Ho letto il tuo codice un po '. Uno che mi piacerebbe vedere è come si costruisce la matrice di proiezione. Se non è stato toccato affatto di quanto (se non ricordo male), i vicini e lontani piani di ritaglio sono a -1.0 e 1.0, rispettivamente. Ma, potrei sbagliarmi poiché Si disegna az = -6.0 ...
L'altra cosa, provare a sostituire:
gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);
Con qualcosa sulla falsariga di:
gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);