OPengl学习(五)——视图(2)


主要衔接上述的文章继续说明,其中主要的函数作用和使用方法

#include "3dr/freeglut1/include/GL/freeglut.h"
#include <QApplication>

void init(void)
{
    
    
    glClearColor(0.0,0.0,0.0,0.0);
    glShadeModel(GL_FLAT);
}

void display(void)
{
    
    

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);
    glLoadIdentity();
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
    glScalef(1.0,2.0,1.0);
    glutWireCube(1.0);
    glFlush();
}

void reshape(int w ,int h)
{
    
    

   glViewport(0,0,(GLsizei)w,(GLsizei)h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
   glMatrixMode(GL_MODELVIEW);
}


int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();

    return a.exec();
}


1、视图变换

视图变换相当于相机三脚架放置位置,需要从哪个角度去看物体。‘
glLoadIdentity():当前矩阵设为单位矩阵
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0):
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
可以形象的描述为人眼:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
如果不使用该函数的话,那么视角有默认的方向。

2、模型变换

在这里插入图片描述

使用模型变化的目的主要是设置模型的方向和位置,可以进行缩放、旋转、移动。
glScalef(1.0,2.0,1.0):参数指定在各个坐标轴的缩放比例,1.0表示不缩放。
glTanslatef(0.0,0.0,-5.0):模型变换函数
(上述的gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)可以用函数glTanslatef(0.0,0.0,-5.0)来达到同样的效果)。
glutWireCube(1.0):绘制立方体函数。


3、投影变换

投影变换相当于相机的镜头,可以选择广角、长焦还是标准镜头,进而决定哪些物体可以展现出来以及如何展示。
主要提供两种类型的投影展示:透视投影(perspective projection)和正投影(orthographic projection)。在进行投影变换之前需要做一些准备。
glMatrixMode(GL_PROJECTION):当前举证用于投影矩阵
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0):投影变换
(上述的也可以用gluRerspective()函数替代)
glMatrixMode(GL_MODELVIEW):当前举证用于视图矩阵,而投影矩阵不受影响


4、视口变换

**视口变化和投影变换共同影响场景映射到屏幕的效果。**视口主要是屏幕展示区域的大小。
glViewport(0,0,(GLsizei)w,(GLsizei)h):参数描述额窗口内有效空间的原点,以及有效屏幕的宽度和高度。


5、绘制场景

在指定上述的必要变换之后,就可以绘制场景了,经过转换之后的坐标到投影坐标,如果坐标在投影坐标之外就被裁减,然后最终显示在视口区域。


其他函数具体参考书籍《OpenGL编程指南原书第九版本》


猜你喜欢

转载自blog.csdn.net/ljsant/article/details/129830126
今日推荐