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(); //右上角

下面给出多窗口效果例子的源码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SharpGL; namespace SharpGLWinformsApplication1
{
public partial class SharpGLForm : Form
{
public SharpGLForm()
{
InitializeComponent();
} private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gl.LoadIdentity();
display(gl);
} void display(OpenGL gl)
{
gl.Color(1.0, 0.0, 0.0);
//画分割线,分成四个视见区
gl.Viewport(, , , );
gl.Begin(OpenGL.GL_LINES);
{
gl.Vertex(-1.0, );
gl.Vertex(1.0, );
gl.Vertex(0.0, -1.0);
gl.Vertex(0.0, 1.0);
}
gl.End(); //定义在左下角的区域
gl.Color(0.0, 1.0, 0.0);
gl.Viewport(, , , );
gl.Begin(OpenGL.GL_POLYGON);
{
gl.Vertex(-0.5, -0.5);
gl.Vertex(-0.5, 0.5);
gl.Vertex(0.5, 0.5);
gl.Vertex(0.5, -0.5);
}
gl.End(); //定义在右上角的区域
gl.Color(0.0, 0.0, 1.0);
gl.Viewport(, , , );
gl.Begin(OpenGL.GL_POLYGON);
{
gl.Vertex(-0.5, -0.5);
gl.Vertex(-0.5, 0.5);
gl.Vertex(0.5, 0.5);
gl.Vertex(0.5, -0.5);
}
gl.End(); //定义在左上角的区域
gl.Color(1.0, 0.0, 0.0);
gl.Viewport(, , , );
gl.Begin(OpenGL.GL_POLYGON);
{
gl.Vertex(-0.5, -0.5);
gl.Vertex(-0.5, 0.5);
gl.Vertex(0.5, 0.5);
gl.Vertex(0.5, -0.5);
}
gl.End(); //定义在右下角
gl.Color(1.0, 1.0, 1.0);
gl.Viewport(, , , );
gl.Begin(OpenGL.GL_POLYGON);
{
gl.Vertex(-0.5, -0.5);
gl.Vertex(-0.5, 0.5);
gl.Vertex(0.5, 0.5);
gl.Vertex(0.5, -0.5);
}
gl.End(); gl.Flush();
} private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
gl.ClearColor(, , , );
} private void openGLControl_Resized(object sender, EventArgs e)
{
OpenGL gl = openGLControl.OpenGL;
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity(); gl.Ortho2D(-1.0, 1.0, -1.0, 1.0);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}
}
}
效果如下图:

原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/
SharpGL学习笔记(五) 视口变换的更多相关文章
- SharpGL学习笔记(六) 裁剪变换
在OpenGL中,除了视景体定义的6个裁剪平面(上下左右前后)外, 用户还可以定义一个或者多个附加的裁剪平面,以去掉场景中无关的目标. 附加平面裁剪函数原型如下: ClipPlane(OpenGL.G ...
- SharpGL学习笔记(七) OpenGL的变换总结
笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...
- SharpGL学习笔记(十一) 光源创建的综合例子:光源参数可调节的测试场景
灯光的测试例子:光源参数可以调节的测试场景 先看一下测试场景和效果. 场景中可以切换视图, 以方便观察三维体和灯光的位置.环境光,漫射光,镜面反射光都可以在四种颜色间切换. 灯光位置和摄像机位置(Lo ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
随机推荐
- List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable
public class ConvertX { #region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </s ...
- 联想服务器X3850 X6 配置RAID5
实验环境: 1. 服务器型号 联想 System X3850 X6 2. 四块300G SAS硬盘 实验目的: 配置RAID 5 ,搭建公司重要文件共享服务器使用. 标注:本教程四块硬盘全做RA ...
- 7款HTML5精美应用教程 让你立即爱上HTML5
你喜欢HTML5吗?我想下面的这7个HTML5应用一定会让你爱上HTML5的,不信就一起来看看吧. 1.HTML5/jQuery雷达动画图表 图表配置十分简单 之前我们介绍过不少形形色色的HTML5图 ...
- linux下nginx配置ssl证书(https)
nginx配置ssl很简单,首先需要两个文件,一个是crt文件,另一个是key文件,如下所示: xxx.crt; #(证书公钥)xxx.key; #(证书私钥) 把这两个文件放到nginx的conf ...
- Xcode : svn 无法上传静态库(.a)文件
1.打开终端,输入cd,空格,然后将需要上传的.a文件所在的文件夹(不是.a文件)拖拽到终端(此办法无需输入繁琐的路径,快捷方便) ,回车:2.之后再输入如下命令:svn add xxx.a,回车:3 ...
- 启动zookeeper时出现的问题
zkEnv.cmd @echo off REM Licensed to the Apache Software Foundation (ASF) under one or more REM contr ...
- asp.net导出EXCEL的好方法!(好用,导出全部数据)
1.调用方法: ExportExcel("application/ms-excel", "EXCEL名称.xls", GridView1, this.Page) ...
- Thinkphp5笔记七:设置错误页面①
设置网站的错误提示页面,也是一个很重要的环节. 一.空操作 在当前控制器里面增加E_empty操作 public function _empty(){ $this->error('方法不存在') ...
- 使用 SharpSvn 执行 svn 操作的Demo
1. SharpSvn简介 SharpSvn.dll 是为.Net 2.0-4.0+ 应用提供的 Subversion Client API,更多详细介绍请见 https://sharpsvn.ope ...
- centos 离线安装Ambari
1.首先要下载它们的安装包,别尝试着在yum来下,特别慢,最好的方式是通过建立本地资源的方式来安装. http://public-repo-1.hortonworks.com/HDP/centos6/ ...