0

我按照指南在 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();

问题是我没有在我的窗口中看到任何东西。都是黑色的。我究竟做错了什么?

4

1 回答 1

7

“gluOrtho2D”这个名字有点误导。事实上gluOrtho2D,这可能是有史以来最没用的功能。的定义gluOrtho2D

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

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

无论如何,即使它被称为...2D,也没有什么二维的。投影体积仍然具有[-1 ; 1]完美的 3 维深度范围。

生成的点很可能位于投影体积之外,[0.1 ; 100]在您的情况下,投影体积的 Z 值范围[-1 ; 1]为 所以你必须应用一些翻译才能看到一些东西。我建议你选择

  • 附近 = 1
  • 远 = 10

并应用 Z 的平移:-5.5 将事物移动到查看体积的中心。

于 2014-12-10T16:21:54.227 回答