编辑:所以似乎glOrtho做我想做的事情(设置你想要查看的区域),错误出现在我的代码中。但是,它可能是一个常见的初学者错误,所以有人可能仍然会发现这个有用的
我正在使用glOrtho(我认为设置正交投影应该比透视更容易)。无论如何,我在500x500x500的区域(我所有可见区域)绘制小立方体(1x1x1)。如何告诉OpenGL(使用openGL 2)在屏幕上绘制该区域内的所有内容(500,500,500)?
这是我的代码 - 它是用Java编写的,但它的工作方式应该相同......
public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
{
final GL2 gl = gLDrawable.getGL().getGL2();
if (height <= 0) // avoid a divide by zero error!
{
height = 1;
}
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(0, 512, 0, 512, 0, 512);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
这似乎没有诀窍,我只能看到几个正方形而不是数百个......
这是我的立方体绘图代码(所有立方体的所有坐标都在0到500之间):
public void display(GLAutoDrawable gLDrawable)
{
final GL2 gl = gLDrawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
for(InterestingVoxel iv: visibleList) {
gl.glTranslatef(iv.getI(), iv.getJ(), iv.getK());
System.out.println("x:"+iv.getI() + ", y:" + iv.getJ() + ", z:" + iv.getK());
drawCube(gl);
}
}
void drawCube(GL2 gl)
{
gl.glBegin(GL2.GL_QUADS);
// front
gl.glVertex3f(0.5f, 0.5f, 0.5f);
gl.glVertex3f(1.5f, 0.5f, 0.5f);
gl.glVertex3f(1.5f, 1.5f, 0.5f);
gl.glVertex3f(0.5f, 1.5f, 0.5f);
// back
gl.glVertex3f(0.5f, 0.5f, -0.5f);
gl.glVertex3f(1.5f, 0.5f, -0.5f);
gl.glVertex3f(1.5f, 1.5f, -0.5f);
gl.glVertex3f(0.5f, 1.5f, -0.5f);
// right
gl.glVertex3f(1.5f, 0.5f, 0.5f);
gl.glVertex3f(1.5f, 0.5f, -0.5f);
gl.glVertex3f(1.5f, 1.5f, -0.5f);
gl.glVertex3f(1.5f, 1.5f, 0.5f);
// left
gl.glVertex3f(0.5f, 0.5f, 0.5f);
gl.glVertex3f(0.5f, 0.5f, -0.5f);
gl.glVertex3f(0.5f, 1.5f, -0.5f);
gl.glVertex3f(0.5f, 1.5f, 0.5f);
// top
gl.glVertex3f(0.5f, 1.5f, 0.5f);
gl.glVertex3f(1.5f, 1.5f, 0.5f);
gl.glVertex3f(1.5f, 1.5f, -0.5f);
gl.glVertex3f(0.5f, 1.5f, -0.5f);
// bottom
gl.glVertex3f(0.5f, 0.5f, 0.5f);
gl.glVertex3f(1.5f, 0.5f, 0.5f);
gl.glVertex3f(1.5f, 0.5f, -0.5f);
gl.glVertex3f(0.5f, 0.5f, -0.5f);
gl.glEnd();
gl.glFlush();
}
答案 0 :(得分:2)
你的glTranslate
调用正在累积,这使得大多数多维数据集都能超出512.也许你想使用矩阵堆栈,或者在循环中使用glLoadIdentity
。
答案 1 :(得分:0)
我假设您正在询问如何限制绘图到特定区域。如果没有,这是一个更通用的目的&#34;我的代码不起作用&#34;问题,你可以忽略这个答案。
由于您正在使用GL 2.x,因此您可能希望使用ClipPlane
将绘图剪辑到特定区域。因此,在您的情况下,(根据您传递给GL的数据),您可能想要传递3到6个剪裁平面并启用它们(Enable(CLIP_PLANEi)
其中 i
是剪辑平面索引/数字。)
例如(伪代码,因为我现在没有工作的GL2测试版):
plane planes[] = {
plane::from_triangle(
500, 500, 500,
500, 500, 0,
500, 0, 500,
),
plane::from_triangle(
500, 500, 500,
0, 500, 500,
500, 0, 500,
),
...
}
// Assume the above is just a lot of GLdoubles somehow [e.g., POD types]
ClipPlane(6, planes)
for (unsigned plane_index = 0 to 5) {
Enable(CLIP_PLANE0 + plane_index)
}
这样做,你可以合理地将渲染限制在指定平面一侧的任何东西上。请记住,虽然这已被弃用(就像许多GL 2.x一样),所以如果你打算超越它,你可能希望重新实现着色器中的剪裁平面。
或者,只需检查您要绘制的内容,只有在您想要绘制的区域中绘制它。