从gluOrtho2D到3D

时间:2014-12-10 16:03:44

标签: opengl frustum

我跟着a guide画了2D的Lorenz系统。

我现在想要扩展我的项目并从2D切换到3D。据我所知,我必须用gluPerspective或glFrustum替换gluOrtho2D调用。不幸的是,无论我尝试什么都没用。 这是我的初始化代码:

// set the background color
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

/// set the foreground (pen) color
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);*/

// set the foreground (pen) color
glColor4f(1.0f, 1.0f, 1.0f, 0.02f);

// enable blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// enable point smoothing
glEnable(GL_POINT_SMOOTH);
glPointSize(1.0f);

// set up the viewport
glViewport(0, 0, 400, 400);

// set up the projection matrix (the camera)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
    //gluOrtho2D(-2.0f, 2.0f, -2.0f, 2.0f);
gluPerspective(45.0f, 1.0f, 0.1f, 100.0f); //Sets the frustum to perspective mode


// set up the modelview matrix (the objects)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

在画画时我这样做:

glClear(GL_COLOR_BUFFER_BIT);

// draw some points
glBegin(GL_POINTS);

// go through the equations many times, drawing a point for each iteration
for (int i = 0; i < iterations; i++) {

    // compute a new point using the strange attractor equations
    float xnew=z*sin(a*x)+cos(b*y);
    float ynew=x*sin(c*y)+cos(d*z);
    float znew=y*sin(e*z)+cos(f*x);

    // save the new point
    x = xnew;
    y = ynew;
    z = znew;

    // draw the new point
    glVertex3f(x, y, z);
}
glEnd();

// swap the buffers
glutSwapBuffers();

问题是我没有在窗口中显示任何内容。一切都是黑色的。我做错了什么?

1 个答案:

答案 0 :(得分:5)

名称&#34; gluOrtho2D&#34;有点误导。实际上gluOrtho2D可能是有史以来最无用的功能。 gluOrtho2D的定义是

void gluOrtho2D(
    GLdouble left,
    GLdouble right,
    GLdouble bottom,
    GLdouble top )
{
    glOrtho(left, right, bottom, top, -1, 1);
}

即。它唯一能够使用 的默认值调用glOrtho。哇,多么复杂和巧妙</sarcasm>

无论如何,即使它被称为...2D,也没有任何关于它的二维。投影体积仍然具有[-1 ; 1]的深度范围,这是完全三维的。

生成的点很可能位于投影体积之外,在您的情况下,投影体积的Z值范围为[0.1 ; 100],但您的点被限制在任一轴的范围[-1 ; 1](和IIRC Z范围的奇怪吸引力是完全积极的)。所以你必须应用一些翻译才能看到一些东西。我建议你选择

  • near = 1
  • far = 10

并应用Z:-5.5的平移将物体移动到观察体积的中心。