作者Nestarneal (Nestarneal)
看板C_and_CPP
標題[問題] OpenGL 光照與旋轉
時間Fri Mar 29 10:12:13 2013
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VS 2010
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
OpenGL
問題(Question):
我想請問 OpenGL 中,旋轉會不會影響到光照呢?
我自己做的測試如下:(以下貼部分 code)
CASE 1:
GLfloat lightP[] = {0.0f, 0.0f, 5.0f, 1.0f};
GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD);
glLightfv(GL_LIGHT0, GL_POSITION, lightP);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 2.5f, 0.0f);
glEnd();
螢幕上顯示的是
很亮的紅色三角形,這是預期內。
CASE 2:
GLfloat lightP[] = {0.0f, 0.0f, 5.0f, 1.0f};
GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD);
glLightfv(GL_LIGHT0, GL_POSITION, lightP);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 2.5f, 0.0f);
glEnd();
螢幕上顯示的是
暗淡的紅色三角形。
由此我做出的結論是:
「
光照會跟著座標軸一起旋轉,故此例中三角形為暗紅色」
但是之後的 CASE4 卻好像與結論違背。
CASE 3:
GLfloat lightP[] = {0.0f, 0.0f, -5.0f, 1.0f};
GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD);
glLightfv(GL_LIGHT0, GL_POSITION, lightP);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 2.5f, 0.0f);
glEnd();
光源在
三角形背面,因此螢幕上看到的是
暗紅色三角形。
CASE 4:
GLfloat lightP[] = {0.0f, 0.0f, -5.0f, 1.0f};
GLfloat lightD[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightD);
glLightfv(GL_LIGHT0, GL_POSITION, lightP);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColor3f(1.0f, 0.0f, 0.0f);
glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(2.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 2.5f, 0.0f);
glEnd();
將座標軸轉 180 度到背面後,
若由 CASE 2 的結論來看,
光源會從背面跑到正面,因此三角形應是亮紅色。
但事實上卻是暗紅色。
所以 CASE1、2 以及 CASE 3、4 會得到兩個不同的結論。
不曉得哪個才是正確的,哪個才是錯誤的呢?
想請前輩們指點指點,謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.1.75
→ linotwo:亮暗是根據光源與法向量的夾角來計算。 03/29 18:38
→ linotwo:glRotate 之後的指令才會被影響,因此這些 case 的光源 03/29 18:40
→ linotwo:都沒有跟著轉。 03/29 18:40