2013-05-15 80 views
-2

這是我的重塑FUNC看起來像gluLookAt在重塑功能

`void Reshape(int w, int h) 
{ 
    const float ar = (float)w/(float)h; 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();    
    gluPerspective(20.0, ar, 1.0, 60.0); // fovy, aspect ratio, zNear, zFar 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();   
    gluLookAt(7,7,7,0,-1,0,0,1,0); 
}` 

當我轉動我的觀點,然後調整攝像頭回來在gluLookAt設定位置的窗口。調整大小後,如果想讓相機保留在旋轉的位置,應該更改哪些內容?

+0

從Reshape刪除gluLookAt? – Andrew

+0

但是然後放在哪裏? – Mruvek

回答

0

我敢打賭,你有另一個glu在顯示。所以你是。只需在重塑後在下一幀中擦拭即可。

無論如何,只要將窗口大小保存在int w, h;中,然後在顯示或更新功能中使用glulookat即可。或者事實上,您可以將視口呼叫留在那裏。

我會建議看看GLFW而不是GLUT,當你得到這個固定的。

+0

如果我在displayfunc中有glulookat,我無法旋轉相機。 – Mruvek

+0

我必須有一個glulookat重塑設置視圖在開始 - 它會重置我的視圖每個窗口調整大小 – Mruvek

+1

-1不,你錯了。爲什麼會調整大小是移動攝像頭的唯一方法。在按下鍵或移動鼠標後不想移動它? – Andrew

0

如果我在displayfunc中有glulookat,我無法旋轉相機。

說誰? 我不願意透露以下代碼段中使用的「class Camera」的代碼,但語義應該很清楚。

void reshape(int w, int h) { 
    g_width = w; g_height = h; 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    ::glutPostRedisplay(); 
} 


void display(void) { 
    /* 
     ... 
    */  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    /* 
     ... 
    */  
    gluPerspective(60.0, g_width/g_height, 0.1, 100.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.2,0.2,0.2,1.0); 

    real* polar = &(Camera::get_instance()->polar[0]); 

    gluLookAt(polar[0]*cos(polar[2])*sin(-polar[1]), 
       polar[0]*cos(polar[1]), 
       polar[0]*sin(-polar[2])*sin(-polar[1]), 
       0,0,0, // look_at 
       0.0f, 1.0f, 0.0f); 

    /* 
     building the scene 
     [...] 
    */ 
} 

g_width和g_height在模塊範圍內是變量。

+0

爲什麼你覺得我張貼一個片段,完全是這樣做的。 – Solkar

+0

我最近的評論是針對已被刪除的OP的評論。 – Solkar

0

你的問題是在yor reshape函數中使用的glLoadIdentity() + gluLookAt(...)會完全覆蓋你當前的模型視圖矩陣 - 如果你以前使用glRotate應用了任何旋轉,它們將會消失,這是沒有辦法的。

一個可能的快速修復您的問題:不要只按左/右鍵時調用glRotate;相反,將旋轉總量存儲在某個變量中,並在調整大小函數中調用glRotate之後的gluLookAt。然而,如果你打算在代碼之後爲你的代碼增加更多的相機交互,保持相機矩陣正確可能會變得麻煩;你最終會得到glRotate/glTranslate/glScale到處都是。相反,我建議您使用變量來表示所有相關值,例如相機位置,視圖向量等,並在繪製任何東西之前通過調用gluLookAt以及gluPerspective來計算相機矩陣每幀一次 - 保留概覽辦法。