OpenGL第四节:滚动和矩阵栈

头文件不变

LUtil.h

GLfloat gCameraX = 0.f, gCameraY = 0.f;//相机位置

bool initGL()
{
  glViewport( 0.f, 0.f, SCREEN_WIDTH, SCREEN_HEIGHT );

  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();//加载投影矩阵为单位矩阵
  glOrtho( 0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, 1.0, -1.0 );//缩放到全屏

  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity();//加载模型矩阵为单位矩阵

  glPushMatrix();//保存模型矩阵到栈里面

  glClearColor( 0.f, 0.f, 0.f, 1.f );

  GLenum error = glGetError();
  if( error != GL_NO_ERROR )
  {
    printf( "Error initializing OpenGL! %s\n", gluErrorString( error ) );
    return false;
  }

  return true;
}

void render()
{
  glClear( GL_COLOR_BUFFER_BIT );

  glMatrixMode( GL_MODELVIEW );
  glPopMatrix();//弹出栈里的矩阵到当前矩阵

  glPushMatrix();//保存当前矩阵到栈里

  glTranslatef( SCREEN_WIDTH / 2.f, SCREEN_HEIGHT / 2.f, 0.f );//移到屏幕中心

  glBegin( GL_QUADS );
    glColor3f( 1.f, 0.f, 0.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
  glEnd();

  glTranslatef( SCREEN_WIDTH, 0.f, 0.f );//右边

  glBegin( GL_QUADS );
    glColor3f( 0.f, 1.f, 0.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
  glEnd();

  glTranslatef( 0.f, SCREEN_HEIGHT, 0.f );//从上次的右边 移动到右下边,其中右边是上一次的移动效果,因为没有把模型矩阵重置为单位矩阵

  glBegin( GL_QUADS );
    glColor3f( 0.f, 0.f, 1.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
  glEnd();

  glTranslatef( -SCREEN_WIDTH, 0.f, 0.f );//从上次的右下边 移动到正下边

  glBegin( GL_QUADS );
    glColor3f( 1.f, 1.f, 0.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, -SCREEN_HEIGHT / 4.f );
    glVertex2f( SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
    glVertex2f( -SCREEN_WIDTH / 4.f, SCREEN_HEIGHT / 4.f );
  glEnd();

  glutSwapBuffers();
}

void handleKeys( unsigned char key, int x, int y )
{
  if( key == ‘w‘ )
  {
    gCameraY -= 16.f;
  }
  else if( key == ‘s‘ )
  {
    gCameraY += 16.f;
  }
  else if( key == ‘a‘ )
  {
    gCameraX -= 16.f;
  }
  else if( key == ‘d‘ )
  {
    gCameraX += 16.f;
  }

  glMatrixMode( GL_MODELVIEW );
  glPopMatrix();//弹出栈里的矩阵作为当前矩阵
  glLoadIdentity();//重置为单位矩阵

  glTranslatef( -gCameraX, -gCameraY, 0.f );//移动位置

  glPushMatrix();//压入栈里
}

//其他地方不变

时间: 2024-10-11 00:01:24

OpenGL第四节:滚动和矩阵栈的相关文章

Android OpenGL ES(四)----调整屏幕的宽高比

1.宽高比问题 我们现在相当熟悉这样一个事实,在OpenGL里,我们要渲染的一切物体都要映射到X轴和Y轴上[-1,1]的范围内,对于Z轴也一样.这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际尺寸或形状. 不幸的是,因为它们独立于实际的屏幕尺寸,如果直接使用它们,我们就会遇到问题,例如在横屏模式下被压扁的桌子. 假设实际的设备分辨率以像素为单位是1280*720,这在新的Android设备上是一个常用的分辨率.为了使讨论更加容易,让我们也暂时假定OpenGL占用整个显示屏. 如果设备是在竖

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

centos 监控cacti/nagios/zabbix 第三十四节课

centos   监控cacti/nagios/zabbix   第三十四节课 上半节课 下半节课 f

centos 目录文件管理 第四节课

centos 目录文件管理  第四节课 上半节课 下半节课 mkdir   -p 创建多个目录mkdir  12  34  56 创建多个目录 mkdir  12  34  56 /bin/rm :直接跳过alias,直接执行rm,不提示 touch :若文件存在,更改文件的三个time rm -rf 误删文件用extundelete,不要再写,inode和文件名还在 1.安装依赖包 yum install -y e2fsprogs* 2.下载并安装extundelete

第三百二十四节,web爬虫,scrapy模块介绍与使用

第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy 使用了 Twisted异步网络库来处理网络通讯.

centos mysql 优化 第二十四节课

centos mysql  优化  第二十四节课 f

centos mysql 优化 第四节课

centos mysql  优化  第四节课 =================================================rhel5.3左右的版本用vim打开slow log并wq,mysqld没有停还在读写slow log,导致mysqld无法写数据到slow log:wq 写入后,句柄有没有发生变化/proc文件系统里找句柄数据fd top.free.sar vmstat vmstat -S m 1 procs -----------memory---------- -