题
我有:
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://img2255.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使用了大量的内存。
解决方案
一旦我遇到了一个非常相似的问题。
这是由于Z-Buffer。如果您有一架飞机,并且想绘制它的线框,而不是像出现的那样重叠和伪像的坐标。它是数值未定义的行为 - 在同一深度上绘制两个对象。您永远不知道哪一个位于顶部。
一种解决方案是稍微抵消线框。我注意到在一些3D建模软件包中。在游戏引擎中,通常可以抵消几何形状上的精灵(墙上的枪声标记)。另一个可能是禁用Z-Buffer并手动阻塞隐藏线。
当您禁用元素绘制时,可能是Z-Buffer的另一个问题。它的界限是远处和剪裁飞机。您很可能会精确地绘制其中一个深处的线(我的猜测是远)。
编辑。我读了一些您的代码。我想看到的是您如何构建投影矩阵。如果您根本没有触摸它,那么(如果我没记错的话)近距离剪裁的平面分别为-1.0和1.0。但是,我可能错了,因为您在z = -6.0绘制...
另一件事,尝试更换:
gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);
沿着:
gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);