2011-11-12 57 views
2

一直在整合本相机教程http://www.swiftless.com/tutorials/opengl/camera2.html并且在将相机对准天空盒时有点麻烦。OpenGL相机的位置和天空盒

使用下面这段代码让我的相机内盒:

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if (w <= h) 
     glOrtho(-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, 
       1.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0); 
    else 
     glOrtho(-1.0*(GLfloat)w/(GLfloat)h, 
       1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0, -10.0, 10.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

要绘制天空盒,我跟着这个教程:http://sidvind.com/wiki/Skybox_tutorial 我一直在试图翻译更接近摄像机的对象,但没” t按我的预期工作。现在我不确定我需要做什么。

感谢任何帮助。

回答

2

第一:不要在重塑处理程序中应用投影。否则,简单的事情看起来是不可能的(如做一个天空盒)。第二:为了使天空盒工作,您必须使用与渲染场景其余部分相同的投影。你应该改变的是模型视图的转换为0,但保持相机的方向。

您可以通过将modelview矩阵的最后一列设置为(0,0,0,1)来完成此操作。

所以这让你的渲染代码:

void render_skybox() 
{ 

    push_modelview(); 
    set_modelview_column(3, 0, 0, 1); 
    draw_skybox(); 
    pop_modelview(); 

} 

void render() 
{ 
    set_viewport(); 
    set_projection(); 

    apply_camera_transform(); 

    render_skybox(); 
    render_scene(); 
} 
+0

所以应该在重塑什么()?我添加了我的display(),这样你就可以看到我在做什么。 – user985351

+0

@ user985351:相信与否,通过使用GLUT我通常不会使用重塑。相反,我在显示中使用glutGet(GLUT_WINDOW_WIDTH)和glutGet(GLUT_WINDOW_HEIGHT)来获取该信息。 – datenwolf