2015-12-21 277 views
0

我想通過在屏幕上投影球體繪製橢圓(如光柵化)。這是我的代碼,但它沒有在屏幕上顯示任何內容。我應該使用更多的函數來初始化投影嗎?這種方式可以通過使用球體在屏幕上繪製橢圓形嗎?在Opengl中繪製橢圓球體

GLfloat xRotated, yRotated, zRotated; 
GLdouble radius=1; 

void display(void); 
void reshape(int x, int y); 

int main (int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitWindowSize(800,800); 
    glutCreateWindow("OVAL"); 
    zRotated = 30.0; 
    xRotated=43; 
    yRotated=50; 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 

void display(void) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glOrtho(0.1, 1.0, 0.1, 1.0, -1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0.0,0.0,-5.0); 
    glColor3f(0.9, 0.3, 0.2); 
    glRotatef(xRotated,1.0,0.0,0.0); 
    glRotatef(yRotated,0.0,1.0,0.0); 
    glRotatef(zRotated,0.0,0.0,1.0); 
    glScalef(1.0,1.0,1.0);glutSolidSphere(radius,20,20); 
    glFlush();   
    } 

void reshape(int x, int y) 
{ 
    if (y == 0 || x == 0) return; 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(39.0,(GLdouble)x/(GLdouble)y,0.6,21.0); 
    glMatrixMode(GL_MODELVIEW); 
    glViewport(0,0,x,y); 
} 
+0

您正在使用嚴重過時的OpenGL版本。你在這裏做什麼是沒有意義的,沒有價值。我強烈建議使用着色器學習OpenGL 3.0+。此外,供應過剩不再發展,被視爲過時。 – Poriferous

回答

2

您compltely繪製球體觀察空間之外,所以它應該是毫不奇怪,它不能被看到。

有幾個與你的代碼問題:

  1. 除了glLoadIndentityglLoadMatrix所有的OpenGL矩陣功能始終後乘矩陣當前的矩陣堆棧目前頂級元素。在您的display函數中,您可以調用glOrtho而不需要重置之前識別的投影矩陣。如果不止一次調用display回調,這將導致完全奇怪的和不同的結果。

    在致電glOrtho之前,您應該添加致電glLoadIdentity()

  2. 您設置了模型視圖變換,以便球體的中心始終以眼睛空間中的(0,0,-5)結束。但是,您設置了一個投影矩陣,該投影矩陣將視角範圍從z=1(近平面)定義爲z=-1(遠平面),因此您的視角實際上位於遠平面之後。

    有幾種方法可以解決這個問題。通過修改glOrtho的參數來改變視角可能是最簡單的。例如,您可以嘗試(-2, 2, -2, 2, 1, 10)以查看球體。

  3. 這是不是真的清楚,我想通過投影繪製一個橢圓屏幕(如光柵化)在球體什麼

    的意思。如果您只想將球體扭曲成橢球體,則可以應用一些不均勻的縮放。這原則上可以在投影矩陣中完成(如果不需要顯示其他對象),但是將其應用於球體的模型矩陣會更有意義 - 您已經在那裏調用了glScale,您可以嘗試像glScalef(1.0f, 0.5f, 1.0f);

    另請注意,如果您的視口不是完全正方形的話,我以前建議的正視參數會導致一些失真。在現實世界中,人們希望將視口的縱橫比合併到投影矩陣中。

    如果你想看到透視投影變形的球體,你必須跳過glOrtho altogheter並切換到透視投影矩陣。

  4. 您使用的代碼完全過時。在OpenGL 3.0(2008)中已經棄用OpenGL矩陣堆棧,而在現代OpenGL的核心配置文件中,不可用。這同樣適用於內置頂點屬性,如glColor或立即模式繪製和客戶端頂點數組。因此,GLUT的繪圖功能也不能與現代GL一起使用。

    如果你現在真的打算學習OpenGL,我強烈建議你忽略這個老東西,明星學習現代的方式。

+0

感謝您的回答。我做了你所說的每件事,但它沒有再顯示任何東西。這是我的代碼[link](https://goo.gl/bPf7d7)。我想學習opengl,我在網上找到這個opengl(老版本):(。 –

+0

@ Farshid.M:請不要使用dropbox鏈接進行stackoverflow問題。更新問題本身。 – derhass

+0

@ Farshid.M:note你在'glOrtho'後面加上了'glLoadIdentity',我解釋了爲什麼你必須這樣做_before_。 – derhass