文档章节

OpenGL编程之窗口 视口 裁剪区

小青_1989
 小青_1989
发布于 2014/05/04 18:48
字数 877
阅读 753
收藏 3
  • 首先解释下图形学中的屏幕,窗口,视见区(视口),裁剪区。

    屏幕:即计算机的整个屏幕大小。

    窗口:即屏幕中的某一个窗口,可放大放小和移动关闭。

    视口:即在窗口中可以见到或可以用来绘图的部分。一般设置视口等于窗口。

    裁剪区:即在视口中让你看到的图形,即显示出来的那部分。

     

    GLUT的窗口初始化是在main函数中使用


    view sourceprint?

    1.//初始化窗口位置

    2.//x:距屏幕左边的像素大小

    3.//y:距屏幕顶部的像素大小

    4.extern void APIENTRY glutInitWindowPosition(int x, int y);

    5.//初始化窗口的宽度和高度

    6.//width:宽度大小

    7.//height:高度大小

    8.extern void APIENTRY glutInitWindowSize(int width, int height);

    视口一般是基于已经定义了的窗口的来定义的。

     

    view sourceprint?

    1.//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了)

    2.//所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。

    3.glViewport(0,0,w,h);

    裁剪区的定义:

       一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。


    view sourceprint?

    01.GLfloat aspectRatio;

    02.glMatrixMode(GL_PROJECTION);//切换为透视投影矩阵

    03.glLoadIdentity();   //将透视投影矩阵转换为单位矩阵

    04.//建立裁剪区域(左右底顶近远)

    05.aspectRatio = (GLfloat)w/(GLfloat)h;  

    06.if(w<=h){        //如果宽度小于高度(aspectRatio < 1)

    07.glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);

    08.else {

    09.glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);

    10.}

    附上一个例子:

     

    view sourceprint?

    01.#include <GL/glut.h>

    02.//绘制场景

    03.void RenderScence(Void)

    04.{

    05.//用当前颜色清除窗口

    06.glClear(GL_COLOR_BUFFER_BIT);

    07.//把绘图颜色设置为红色

    08.glColor3f(1.0f,0.0f,0.0f);

    09.//用当前的颜色绘制一个填充矩形

    10.glRectf(-25.0f,25.0f,25.0f,-25.0f);

    11.//刷新绘图命令

    12.glFlush();

    13.}

    14.//当窗口改变大小时由GLUT函数库调用

    15.void ChangeSize(GLsizei w, GLsizei h)

    16.{

    17.GLfloat aspectRatio;

    18.//防止被0所除

    19.if(h == 0){

    20.h = 1;

    21.}

    22.//把视口区设置为窗口大小,相对与窗口而言(而窗口的位置在开始运行是已经定义了)

    23.//所以(0,0,w,h)中的(0,0)是相对于已经定义好的窗口的左下角的位置。

    24.//glViewport(0,0,w,h); 

    25.glViewport(15,15,w-100,h-100); 

    26.//重置坐标系统

    27.glMatrixMode(GL_PROJECTION);            //切换为透视投影矩阵

    28.glLoadIdentity();                       //将透视投影矩阵转换为单位矩阵

    29.//建立裁剪区域(左右底顶近远)

    30.aspectRatio = (GLfloat)w/(GLfloat)h;

    31.if(w<=h){                                //如果宽度小于高度(aspectRatio < 1)

    32.//glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);

    33.glOrtho(-30.0, 30.0, -30/aspectRatio, 30.0/aspectRatio, 1.0, -1.0);

    34.else {

    35.//glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);

    36.glOrtho(-30.0*aspectRatio, 30.0*aspectRatio,-30.0, 30.0, 1.0, -1.0);

    37.}

    38.glMatrixMode(GL_MODELVIEW);             //切换为平行投影矩阵

    39.glLoadIdentity();                       //将平行投影矩阵转换为单位矩阵

    40.}

    41.//设置渲染状态

    42.void SetupRC(void)

    43.{

    44.//设置清除颜色

    45.glClearColor(0.0f, 0.6f, 1.0f, 1.0f);

    46.}

    47.//主程序入口

    48.int main(int argc, char* argv[])

    49.{

    50.glutInit(&argc,argv);

    51.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    52.glutInitWindowPosition(100,300);

    53.glutInitWindowSize(400,400);

    54.glutCreateWindow("coder");                  //创建一个窗口

    55.glutDisplayFunc(RenderScence);                  //注册回调函数

    56.glutReshapeFunc(ChangeSize);

    57.SetupRC();                                      //设置初始化状态(有些状态只需要设置一次)

    58.glutMainLoop();                                 //开始循环运行,显示绘图。

    59.return 0;

    60.}

     


本文转载自:http://www.it165.net/pro/html/201307/6392.html

小青_1989
粉丝 3
博文 75
码字总数 12913
作品 0
大连
程序员
私信 提问
计算机图形与OpenGL学习六(二维观察2.OpenGL二维观察函数)

OpenGL二维观察函数 本节概念性内容较多,为便于理解与记忆,可以查看之前文章的实例中的函数操作 1. OpenGL投影模式 在选择OpenGL裁剪窗口和视口之前,必须建立合适的模式以便构建从世界坐标...

lhs322
2018/04/17
0
0
opengl超级宝典笔记—Using OpenGL(二)

OpenGL数据类型 Technorati 标记: opengl 函数命名约定 <函数库前缀><命令名称><可选的参数个数><可选的参数类型> 例子: glColor3f 代表是gl函数库里的 color命令,此命令有3个参数,参数类...

Mario_Q
2013/09/04
1K
0
实验5 OpenGL变换综合练习

1.实验目的: 理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。 2.实验内容: (1)使用图a中的尺寸绘制小桌,三维效果图见图b。要求绘制小桌各部件时只能使...

小青_1989
2014/04/08
177
0
OpenGL学习(1)——创建窗口

这是我的第一篇博客,试着记录学习OpenGL的过程。使用的教程:LearnOpenGL,系统:Deepin 15.9.3,IDE:Qt Creator。 添加头文件 创建窗口用到两个库:GLFW和GLAD,这里GLAD也可以替换成GLE...

一只名为狗的猫
04/17
0
0
OpenGL超级宝典笔记——选择

有时我们不仅仅是渲染场景,而且还要与渲染的场景进行交互。大多数情况下是使用鼠标进行交互。注:viewing volume(可视区域,视景体) 选择 OpenGL的选择模式允许你通过鼠标点击屏幕,来选择...

Mario_Q
2013/12/26
2.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
今天
4
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
4
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部