2011-11-12 56 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