OpenGL之gluLookAt 函数详解

本文代码是基于上一篇文章“基于Viusal C++ 2015 MFC单文档程序中搭建OpenGL框架”的基础上运行

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 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

在单文档程序自定义类MyOpenGL中定义函数void MyOpenGL::DisplayModeInit(void)

void MyOpenGL::DisplayModeInit(void)
{
    glViewport(0, 0, OpenGLRect.Width(), OpenGLRect.Height());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(50.0f, (GLfloat)(OpenGLRect.Width())/(GLfloat)(OpenGLRect.Height()),0.1f,2000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

在单文档程序自定义类MyOpenGL中定义显示函数void MyOpenGL::RenderScene(void)

void MyOpenGL::RenderScene(void)
{
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
    GLfloat Light_Position[] = {1.0,1.0,1.0,0.0};  //设置光源方向
    glShadeModel(GL_SMOOTH);
    glLightfv(GL_LIGHT0,GL_POSITION,Light_Position);  //光源的设置函数
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0);  //启动GL_LIGHT0光源
    glEnable(GL_DEPTH_TEST);
    glutSolidTeapot(1);  //显示茶壶
}

在单文档程序view中定义显示函数void C******View::OnDraw(CDC* pDC)中调用上述两个函数

void CLiDARView::OnDraw(CDC* pDC)
{
    CLiDARDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    // TODO: 在此处为本机数据添加绘制代码
    glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    m_OpenGL->DisplayModeInit();
    m_OpenGL->RenderScene();

    glFlush();
    SwapBuffers(wglGetCurrentDC()); 
}

1、上述函数DisplayModeInit(void)中gluLookAt若设置为gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0),相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点,后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上。其显示的效果图如下:

2、上述函数DisplayModeInit(void)中gluLookAt若设置为gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0),相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点,后面的三个参数(1.0,0.0,0.0),x轴为1,其余为0,表示脑袋朝右。其显示的效果图如下:

3、上述函数DisplayModeInit(void)中gluLookAt若设置为gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0),相当于我们的脑袋位置在(5.0,5.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点,后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示我们的位置在坐标的右上角并且脑袋朝上。其显示的效果图如下:

       如果并没有调用gluLookAt(),那么照相机就被设置为默认的位置和方向,在默认情况下,照相机位于原点,指向z轴的负方向,朝上向量为(0,1,0)。
      若把视图变换函数gluLookAt()函数,改为模型变换函数glTranslatef(),并使用参数(0.0,0.0,-5.0)。这个函数的效果和使用gluLookAt()函数的效果是完全相同的,原因:gluLookAt()函数是通过移动照相机(使用试图变换)来观察这个立方体,而glTranslatef()函数是通过移动茶壶(使用模型变换)。另外注意:视图变换要在模型变换之前进行。
 

猜你喜欢

转载自blog.csdn.net/qq_34911636/article/details/86686906
今日推荐