OpenGL glTranslatef不能正常工作

时间:2012-08-16 00:21:47

标签: c++ opengl sdl

所以我决定使用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);

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

如果是,那么你应该将点生成移动到别处,以便它们只生成一次。

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

如果不起作用:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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