一時對這些東西有些混亂,重新學習一下,嗯重溫!!!加油....
先看看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)
然後呢......上例子圖示:
(本文代碼圖示)
#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;
}
運行結果: