2011-02-06 49 views
1

我想知道如果gluLookAt連同glFrustum扭曲渲染的圖片。gluLookAt是否與glFrustum一起使渲染失真?

這是一個場景的呈現方式:

enter image description here

及這裏的渲染它的代碼。

InitCamera稱爲一次和應作爲我現在明白它,建立一個矩陣,以便如果我從位置搜索2個單位以上和3個單位在朝向原點的原點的前面。另外glFrustum用於創建透視圖。

void InitCamera() { 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt (
    0, 2 , 3, 
    0, 0 , 0, 
    0, 1 , - 0 
); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum (- 1,  1, 
       - 1,  1, 
        1,1000.0); 

    glMatrixMode(GL_MODELVIEW); 
} 

然後TheScene是實際作畫:

void TheScene() { 

    glClear(
    GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT  
); 

    glMatrixMode(GL_MODELVIEW); 

    // Draw red circle around origin and radius 2 units:  
    glColor3d(1,0,0); 
    glBegin(GL_LINE_LOOP); 
    for (double i = 0; i<=2 * M_PI; i+=M_PI/20.0) { 
    glVertex3d(std::sin(i) * 2.0, 0, std::cos(i) * 2.0); 
    } 
    glEnd(); 

    // draw green sphere at origin: 
    glColor3d(0,1,0); 
    glutSolidSphere(0.2,128, 128); 


    // draw pink sphere a bit away  
    glPushMatrix(); 
    glColor3d(1,0,1); 
    glTranslated(8, 3, -10); 
    glutSolidSphere(0.8, 128, 128); 
    glPopMatrix(); 

    SwapBuffers(hDC_opengl); 
} 

紅球在起源和它周圍的紅色圓圈的中心繪製。但看着它只是感覺很奇怪,並給了我一個綠色的球根本不在中心的印象。

此外,粉紅色的球,應該被畫成一個完美的圓,而不是一個橢圓。

那麼,我錯了,畫面是否正確繪製,還是我設置了錯誤?

+0

它可能只是觀看方向。從另一個角度檢查場景。 – ChrisF 2011-02-06 21:40:44

回答

5

你的期望是完全錯誤的

  • 三維圓的透視投影(如圓是完全可見)是一個橢圓,圓的中心,然而投影不是一般中心的橢圓。 Perspective distortion on centers

  • 的球體的透視投影的輪廓是在一般conic section即可以是圓形,橢圓形,拋物線或取決於視點,投影面和球在三維的位置的雙曲線。原因是可以將球體的輪廓想象爲從視點開始並且觸摸與投影平面相交的球體的錐體。

當然,如果你正在尋找一個完全垂直於相機圓心將被投影到圓投影中心的圓。以同樣的方式,如果你的相機正好指向一個球體,球體輪廓將是一個圓圈,但這些都是特殊情況,而不是一般情況。

這些中心之間的這些差異在強視角(廣角)相機下更爲明顯。用parallel projection而不是這種明顯的失真(即圓的中心的投影正好是圓的投影的中心)。

+0

是的,你寫的很清楚。但你的照片並不覺得奇怪,我的確是這樣。當我寫到綠點應該在中心時,我的意思並不是要被解釋爲應該以幾何形式畫在中心,而應該看起來像是在中心。 – 2011-02-06 22:30:02

1

要看到在屏幕中央的綠色球體周圍有一個完美的圓圈,你需要改變,像這樣的攝像頭位置:

gluLookAt (
    0, 3, 0, 
    0, 0, 0, 
    0, 0, 1 
); 

不知道,雖然是什麼導致了紫色球的失真。

1

該視角是正確的,它只是看起來扭曲,因爲這是事情在這裏如何下降。 嘗試一下本作gluLookAt,並圍繞一點:

gluLookAt (
    0, 2 , 10, 
    0, 0 , 0, 
    0, 1 , 0 
); 

的方式我想它是一個安裝程序,讓我來調整鼠標的位置和視線方向,讓你獲得實時播放運動。當我四處走動時,你的場景看起來很好。如果你想要我可以得到完整的代碼,所以你也可以做到這一點,但這比我想在這裏推出一個答案有點多。