OpenGL-光源位置的控制

光源位置

1.視圖變換:

將相機移動到準備拍攝的位置,將它對準某個方向。

2.模型變換

將準備拍攝的對象移動到場景中的指定位置。

3.光源保持靜止

在使用完視圖和模型變換之前設置光源的位置,init()後面,display()之前。

光源出現在視圖變換之前,後面進行的變換與光源沒有關係,相對於視點固定。

void init(void)   
{  
	glClearColor (0.0, 0.0, 0.0, 0.0);  
	glShadeModel (GL_SMOOTH);  
	glEnable(GL_LIGHTING);  
	glEnable(GL_LIGHT0);  
	glEnable(GL_DEPTH_TEST);  

	GLfloat position[] = { 0.0, 0.0, -3.0, 1.0 }; //燈泡
	glLightfv (GL_LIGHT0, GL_POSITION, position); 
}

4.獨立的移動光源

在模型變換之後設置光源位置。

void init(void)   
{  
	glClearColor (0.0, 0.0, 0.0, 0.0);  
	glShadeModel (GL_SMOOTH);  
	glEnable(GL_LIGHTING);  
	glEnable(GL_LIGHT0);  
	glEnable(GL_DEPTH_TEST);  
}  
void display(void)  
{  
	GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; //燈泡
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
	glPushMatrix ();//用於隔離視圖變換和模型變換 
	gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  

	glPushMatrix ();//用於隔離視圖變換和模型變換 
	glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);//旋轉光源 
	glLightfv (GL_LIGHT0, GL_POSITION, position);  
	glTranslated (0.0, 0.0, 1.5);  
	glDisable (GL_LIGHTING);  
	glColor3f (0.0, 1.0, 1.0);  
	glutWireCube (0.1);  
	glEnable (GL_LIGHTING);  
	glPopMatrix ();//局部座標系歸位 

	glutSolidTorus (0.25, 0.85, 8, 15);  
	glPopMatrix ();  
	glFlush ();  
}
void reshape (int w, int h)  
{  
	glViewport (0, 0, (GLsizei) w, (GLsizei) h);  
	glMatrixMode (GL_PROJECTION);  
	glLoadIdentity();  
	gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);  
	glMatrixMode(GL_MODELVIEW);  
	glLoadIdentity();  
}


5.光源和對象一起移動

void display(void) //光源和對象一起移動
{  
	GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };  
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	glPushMatrix ();  
	gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  

	//glPushMatrix ();  
	glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);//旋轉對象
	glLightfv (GL_LIGHT0, GL_POSITION, position); 

	glTranslated (0.0, 0.0, 1.5);  
	glDisable (GL_LIGHTING);  
	glColor3f (0.0, 1.0, 1.0);  
	glutWireCube (0.1);  
	glEnable (GL_LIGHTING);  

	glTranslated (0.0, 0.0, 1.5); 
	glutSolidTorus (0.275, 0.85, 8, 15);   
	glPopMatrix ();  
	glFlush ();  
}

6.光源和觀察點一起移動

在視圖變換之前設置光源位置,(ex, ey, ez)控制觀察點位置;(upx, upy, upz)控制朝上向量的值;現在如果觀察點移動位置,光源也跟着一起移動

void display(void) //光源和一起移動
{    
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

	glPushMatrix (); 
	//gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz); 
	gluLookAt (5.0, 0.0, move, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
	glutSolidTorus (0.275, 0.85, 8, 15);   
	glPopMatrix ();  
	glFlush ();  
}  

void reshape (int w, int h)  
{  
	glViewport (0, 0, (GLsizei) w, (GLsizei) h);  
	glMatrixMode (GL_PROJECTION);  
	glLoadIdentity();  
	gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);  
	glMatrixMode(GL_MODELVIEW);  
	glLoadIdentity();  

	GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; 
	glLightfv (GL_LIGHT0, GL_POSITION, position); 
}
發佈了10 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章