2011-06-01 102 views
3

我想提出一個光在被固定在某個點現場固定的光源。下面介紹一下OpenGL site不得不說的是:創建,保留它的世界座標

我怎樣才能讓我的光相對固定的留到我的場景?我怎樣才能在角落裏放一盞燈,讓它留在那裏,而我改變了我的看法?

隨着你的看法的改變,你的模型視圖矩陣也改變。這意味着您需要重新指定燈光位置,通常在每個幀的開始處。一個典型的應用程序將顯示用下面的僞代碼的幀:

  • 設置視圖變換。
  • *設置光源的位置// glLightfv(GL_LIGHT_POSITION,...)*
  • 發下來的場景或模型的幾何形狀。
  • 交換緩衝區。

如果你的光源是燈具的一部分,你可能還需要指定一個造型變換,使光源的位置是在相同的位置周圍的固定幾何形狀。

所以我加了這個到paintGL()函數。

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
gluLookAt(0.0, 5.0, 0.0, 
    0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0); 
GLfloat l0pos[] = {0.0, 0.0, 0.0, 1.0}; 
glLightfv(GL_LIGHT0, GL_POSITION, l0pos); 
glPopMatrix(); 

看來還好,當我站在原地,但是當我移動相機的眼睛位置或攝像機的中心位置,光閃爍。我究竟做錯了什麼?


UPDATE2:我結束了使用此代碼,但我仍然有問題。光線不再移動,但其位置不準確。在堆棧頂部的矩陣是通過一個gluLookAt命令,它表示攝像機位置所產生的矩陣。

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glTranslatef(xCoordinate, yCoordinate, zCoordinate); 
GLfloat lpos[] = {0.0, 0.0, 0.0, w}; 
glLightfv(GL_LIGHT0, GL_POSITION, lpos); 
glPopMatrix(); 
+0

什麼是在lpos [] = {0,0,0,w}中設置的變量'w';?它應該是一個,否則你會得到一些縮放效果。 – Zilchonum 2011-06-14 22:52:51

回答

4

我不能完全肯定這是否然而是什麼原因造成你的症狀,:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
gluLookAt(0.0, 5.0, 0.0, 
    0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0); 

有你想看看這裏的幾件事情。首先,根據在線文檔,gluLookAt 乘以堆棧頂部的矩陣由相機轉換矩陣,而不是設置它(此外,glPushMatrix保留當前矩陣)。出於這個原因,在進行相機轉換之前確保當前矩陣是單位矩陣是一個好主意。推/流行通常是足夠的,但如果你調用gluLookAt後或「中」其他任何轉變,壞的事情都可能發生。

其次,您需要使用您的實際攝像機座標,以便GL可以正確轉換燈光位置。否則,光線不會隨場景幾何圖形移動。我建議先做一次gluLookAt,然後再轉換光線並繪製幾何圖形,然後再次彈出相機轉換矩陣。這樣,您可以確定您的燈光和幾何圖形如預期保持一致。

+0

我根據你的建議解決了這個問題。謝謝!爲了幫助其他人解決這個問題,我附上我的代碼來解決這個問題。 – Pieter 2011-06-02 20:13:41