gluLookAt 和 變換

一時對這些東西有些混亂,重新學習一下,嗯重溫!!!加油....

先看看glLookAt:

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

      GLdouble centerx,GLdouble centery,GLdouble centerz,

      GLdouble upx,GLdouble upy,GLdouble upz);

該函數定義一個視圖矩陣,並與當前矩陣相乘。

eyex, eyey,eyez 指定視點的位置

centerx,centery,centerz 指定參考點的位置

upx,upy,upz 指定視點向上的方向(0,1,0)

opengl中glulookat函數的意思 - 流光如夢 - 流光手記
然後呢......上例子圖示:


(本文代碼圖示)

#include <gl/glut.h>

#define WIDTH 400
#define HEIGHT 400

//渲染前的初始化
void Initialize()
{
	glClearColor(0.0f, 0.0f, 0.0f , 1.0f);
	glShadeModel (GL_SMOOTH);
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	
}
//重置渲染窗口和視圖
void Reshape(int width, int height)
{
	// 創建透視效果視圖
	
	glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,4.828f,1000.0f);
	glViewport(0, 0, width, height);
    glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(5, 0, -4.828, 0, 0, -4.828, 0, 1, 0);
	glTranslatef(0.0f, 0.0f, -4.828f);
	
}

void DrawTriangle() //繪製三角形
{
	glPushMatrix();
	glTranslatef(0.0f, 0.0f, 1.0f);
	glRotated(90, 0, 1, 0);    //遵循右手定則,大拇指指向Y正軸。
	glBegin(GL_TRIANGLES);							
	glColor3f(1.0f,0.0f,0.0f);					
	glVertex3f( 0.0f, 1.0f, 0.0f);				
	glColor3f(0.0f,1.0f,0.0f);					
	glVertex3f(-1.0f,-1.0f, 0.0f);				
	glColor3f(0.0f,0.0f,1.0f);					
	glVertex3f( 1.0f,-1.0f, 0.0f);					
	glEnd();		
	glPopMatrix();
}

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
	glLineWidth(5.0f);	
	glBegin(GL_LINES);				//繪製Y對稱軸
		glVertex3d(0, -10, 0);
		glVertex3d(0, 10, 0);
	glEnd();
	glPopMatrix();
	
	DrawTriangle(); //繪製源三角形,在對稱軸左邊

	glScaled(1,1,-1);//對之後的圖形的Z軸都區反方向值,相當相對於當前模型座標關於Y軸對稱
	DrawTriangle(); //繪製經glScaled變換三角形,關於模型座標Y軸對稱
    glutSwapBuffers();
}


int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE|GLUT_STENCIL);
    glutInitWindowPosition(200, 200);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutCreateWindow("OpenGL模版緩存演示");
	
	Initialize();
	glutReshapeFunc(&Reshape);
    glutDisplayFunc(&Display);
	
    glutMainLoop();//進入渲染和消息循環
    return 0;
}

運行結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章