一时对这些东西有些混乱,重新学习一下,嗯重温!!!加油....
先看看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;
}
运行结果: