0

所以我决定用 SDL 和 OpenGL 用 C++ 制作一个 3D Stars。我创建了一个包含 x、y 和 z 值的 Point 类。我创建了一个点数组并用随机坐标填充它。这似乎可行,但是当我执行 glTranslatef(0,0,0.1f) 或类似的操作时,星星并没有靠近,它们只是消失了。

//OpenGL Initialization Code
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0f,640.0/480.0,0.3f,500.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);

//Random point generation
for(int i = 0; i < 200000; i++)
{
   float randomX = (float)rand()/((float)RAND_MAX/100.0f) - 50.0f;
   float randomY = (float)rand()/((float)RAND_MAX/20) - 10.0f;
   float randomZ = (float)rand()/((float)RAND_MAX/20) - 20.0f;
   points[i] = Point(randomX, randomY,randomZ);
}

//Render
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POINTS);
for(int i = 0; i < 200000; i++)
{
   glVertex3f(points[i]._x, points[i]._y, points[i]._z);
}
glEnd();
glTranslatef(0,0,0.1f);
SDL_GL_SwapBuffers();
SDL_Flip(screen);

我究竟做错了什么?

4

3 回答 3

2

该代码是您的渲染功能吗?

如果是,那么您应该将点生成移到其他地方,以便它们只生成一次。

如果不是,那么您应该将初始化代码移动到渲染函数的开头。应该每帧清除矩阵。

如果这不起作用:

尝试暂时禁用深度测试。如果它们没有消失并且您看到线条,则需要调整视锥。尝试使用 gluLookAt

另外,尝试在负 z 轴上平移它们。如果我没记错的话,在opengl中,随着z的减小,对象空间坐标越远。(0 比 -1 更接近)

于 2012-08-16T00:47:59.387 回答
0

我不确定它们为什么会消失,但在您的示例代码中它应该是惰性的。您在顶部为 MODELVIEW 矩阵加载一个新的 Identity 矩阵,然后在渲染对其进行转换。尝试将 glTranslate 移到 glBegin 之前。

于 2012-08-16T00:33:26.477 回答
0

我在初始化 SDL SetVideoMode 的代码之后移动了 OpenGL 初始化代码,它现在可以正常工作。

于 2012-08-16T00:51:52.303 回答