当前位置: 首页 > news >正文

SharpGL学习笔记(五) 视口变换

视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是将经过几何变换, 投影变换和裁剪变换后的物体显示于屏幕指定区域内.

前面我们讨论过的透视投影, 正射投影, 它们都会产生一个视景体, 利用Viewport()函数, 就可以把这些视景体内投影的物体显示到屏幕指定的区域内.

默认情况下, 视口就是你用来绘制3D图像的整个矩形区域. 

Viewport的原型是:  Viewport(int x, int y, int width, int height)

 

我们来用示意图描述一下这个函数的作用:

(1) Viewport定义了视口在窗口中的区域, 同时也规定了二维像素平面到视口区域的映射关系.

(2) 若有Viewport(0,0,w/2,h)则会有下面的效果:

 

(3) 也可以利用Viewport()生成多窗口效果:

Viewport(0,0, w/2, h/2); drawpic();      //左下角

Viewport(w/2,0, w/2, h/2); drawpic();    //右下角

Viewport(0, h/2, w/2, h/2); drawpic();   //左上角

Viewport(w/2, h/2, w/2, h/2); drawpic();  //右上角

 

 

下面给出多窗口效果例子的源码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using SharpGL;
 10 
 11 namespace SharpGLWinformsApplication1
 12 {
 13     public partial class SharpGLForm : Form
 14     {
 15         public SharpGLForm()
 16         {
 17             InitializeComponent();
 18         }
 19 
 20         private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
 21         {
 22             OpenGL gl = openGLControl.OpenGL;
 23             gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 24             gl.LoadIdentity();
 25             display(gl);
 26         }
 27 
 28         void display(OpenGL gl)
 29         {
 30             gl.Color(1.0, 0.0, 0.0);
 31             //画分割线,分成四个视见区
 32             gl.Viewport(0, 0, 400, 400);
 33             gl.Begin(OpenGL.GL_LINES);
 34             {
 35                 gl.Vertex(-1.0, 0);
 36                 gl.Vertex(1.0, 0);
 37                 gl.Vertex(0.0, -1.0);
 38                 gl.Vertex(0.0, 1.0);
 39             }
 40             gl.End();
 41            42 
 43             //定义在左下角的区域
 44             gl.Color(0.0, 1.0, 0.0);
 45             gl.Viewport(0, 0, 200, 200);
 46             gl.Begin(OpenGL.GL_POLYGON);
 47             {
 48                 gl.Vertex(-0.5, -0.5);
 49                 gl.Vertex(-0.5, 0.5);
 50                 gl.Vertex(0.5, 0.5);
 51                 gl.Vertex(0.5, -0.5);
 52             }
 53             gl.End();
 54 
 55             //定义在右上角的区域
 56             gl.Color(0.0, 0.0, 1.0);
 57             gl.Viewport(200, 200, 200, 200);
 58             gl.Begin(OpenGL.GL_POLYGON);
 59             {
 60                 gl.Vertex(-0.5, -0.5);
 61                 gl.Vertex(-0.5, 0.5);
 62                 gl.Vertex(0.5, 0.5);
 63                 gl.Vertex(0.5, -0.5);
 64             }
 65             gl.End();
 66 
 67             //定义在左上角的区域
 68             gl.Color(1.0, 0.0, 0.0);
 69             gl.Viewport(0, 200, 200, 200);
 70             gl.Begin(OpenGL.GL_POLYGON);
 71             {
 72                 gl.Vertex(-0.5, -0.5);
 73                 gl.Vertex(-0.5, 0.5);
 74                 gl.Vertex(0.5, 0.5);
 75                 gl.Vertex(0.5, -0.5);
 76             }
 77             gl.End();
 78 
 79             //定义在右下角
 80             gl.Color(1.0, 1.0, 1.0);
 81             gl.Viewport(200, 0, 200, 200);
 82             gl.Begin(OpenGL.GL_POLYGON);
 83             {
 84                 gl.Vertex(-0.5, -0.5);
 85                 gl.Vertex(-0.5, 0.5);
 86                 gl.Vertex(0.5, 0.5);
 87                 gl.Vertex(0.5, -0.5);
 88             }
 89             gl.End();
 90 
 91             gl.Flush();
 92         }
 93 
 94         private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
 95         {
 96             OpenGL gl = openGLControl.OpenGL;
 97             gl.ClearColor(0, 0, 0, 0);
 98         }
 99 
100 
101         private void openGLControl_Resized(object sender, EventArgs e)
102         {
103             OpenGL gl = openGLControl.OpenGL;
104             gl.MatrixMode(OpenGL.GL_PROJECTION);
105             gl.LoadIdentity();
106 
107             gl.Ortho2D(-1.0, 1.0, -1.0, 1.0);
108             gl.MatrixMode(OpenGL.GL_MODELVIEW);
109         }
110     }
111 }

 

效果如下图:

 

本节源代码下载

原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/

 

相关文章:

  • win2012配置
  • shell运算(加、减、乘、除)
  • 配置 linux-bridge mechanism driver - 每天5分钟玩转 OpenStack(77)
  • Android listview的item设定高度
  • 解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
  • Spring注解解释(@Primary、@Qualifier)
  • storm-kafka(storm spout作为kafka的消费端)
  • js没有重载
  • 【索引】Oracle之不可见索引和虚拟索引的比对
  • 分区
  • class文件概述
  • 关于 LVM 逻辑卷管理
  • mysql学习之旅-数据库自动备份和手动恢复
  • 寻找二叉查找树中的下一个结点
  • nginx的安装及基本配置,及多个域名服务
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译] React v16.8: 含有Hooks的版本
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • HTML-表单
  • java取消线程实例
  • maven工程打包jar以及java jar命令的classpath使用
  • vue脚手架vue-cli
  • Web标准制定过程
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于 Cirru Editor 存储格式
  • 汉诺塔算法
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 检测对象或数组
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 人脸识别最新开发经验demo
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 入门级的git使用指北
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 优秀架构师必须掌握的架构思维
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何用纯 CSS 创作一个货车 loader
  • 说说我为什么看好Spring Cloud Alibaba
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #define用法
  • (C++)八皇后问题
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)德国人的记事本
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)hibernate缓存
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .Mobi域名介绍
  • .NET DataGridView数据绑定说明
  • .net 程序发生了一个不可捕获的异常
  • .NET 使用 XPath 来读写 XML 文件