2016-09-28 87 views
-1

enter image description here問題與攝像機視圖和照明(openGL的&GLUT)

我想有三個圓環來實現底部子窗口,但未能顯示在子窗口什麼..

的子窗口主要功能:

instrument_window = glutCreateSubWindow(main_window, GAP, view_height + 3*GAP, 2*(view_width+GAP), INSTRUMENT_HEIGHT); 
glutDisplayFunc(display); 
//lighting 
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; 
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
const GLfloat light_position[] = { 600, 1200, 1200, 0.0f }; 

const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; 
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; 
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
const GLfloat high_shininess[] = { 100.0f }; 

//glClearColor(0.33,0.33,0.33,0.33); 
glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

glEnable(GL_LIGHT0); 
glEnable(GL_NORMALIZE); 
glEnable(GL_COLOR_MATERIAL); 
glEnable(GL_LIGHTING); 

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 
glLightfv(GL_LIGHT0, GL_POSITION, light_position); 

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); 
//end of lighting 

glutMainLoop(); 

用於顯示功能:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

float width = 2*(GAP+view_width); 
float height = INSTRUMENT_HEIGHT; 
const float ar = (float) width/(float) height; 

//glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(width/4.0, width*3.0/4.0, height*3.0/4.0, height/4.0, 2.0, 100.0); 
//gluPerspective (160.0, 2*view_width/INSTRUMENT_HEIGHT, 0.1, 1000.0); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity() ; 
/* 
glMatrixMode(GL_PROJECTION); 
// Reset transformations 
glLoadIdentity(); 
gluPerspective (160.0, 2*view_width/INSTRUMENT_HEIGHT, 0.1, 1000.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

// Draw first 
draw (view_width+GAP-400, INSTRUMENT_HEIGHT/2); 

// Draw second 
draw (view_width+GAP-150, INSTRUMENT_HEIGHT/2); 

// Draw third 
draw (view_width+GAP+100, INSTRUMENT_HEIGHT/2); 

爲繪圖功能:

void draw(double cx,double cf) 
glColor3f(0.34f,0.34f,0.34f); 
glPushMatrix(); 
glTranslated(0.0, cx, cy); 
glRotated(-10, 1.0, 0.0, 0.0); 
glutSolidTorus(OUTER_DIAL_RADIUS, OUTER_DIAL_RADIUS+30, 100, 200); 
glPopMatrix(); 
end 

真的令人沮喪,因爲它只是不顯示任何東西,不知道如何調試。任何提示都非常感謝!

+0

將來請不要在回答問題後刪除問題。這是一個面向所有人的問答社區,也是未來任何人的重要問題。 – lfgtm

回答

0

說實話,它很難從提供的代碼示例中回答這個問題。 「displayFunction」的一半是從/*註釋掉的,所以低於它的任何內容都不會被調用。即使那麼它很難推斷出這個問題,因爲在這裏很少有關於多個視口的代碼。既然你使用的是固定管道GL,請看NeHe,它有一個關於使用多個視口的好教程。

http://nehe.gamedev.net/tutorial/multiple_viewports/20002/

調試是一個最重要的工具,開發人員在他們的武器庫來解決問題。瞭解如何做到這一點是明智的,因爲從長遠來看,這會節省您的時間,並且您會發現大多數(如果不是全部的話)編碼問題的答案!

+0

非常感謝!這裏的問題實際上是透視的參數。我很抱歉前面的刪除。我在想這可能是一個重複的問題,我對這裏的規則瞭解不多。我將嘗試將整個程序遷移到新版本的OpenGL。感謝您提供的鏈接。 –