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工程拆分成一个个功能相对独立但相互依赖的小 ...
随机推荐
- 图像处理、计算机视觉与模式识别“SCI期刊和顶级会议”总结
期刊: best (1) IEEE Transactions on Pattern Analysis and Machine Intelligence,IEEE模式分析与机器智能汇刊,简称PAMI,是 ...
- 决策树-Cart算法二
本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...
- spark 非常好的学习内容
http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html
- 腾讯QQ积分CSRF导致积分任意挥霍(我的积分为什么少了)
触发点:http://jifen.qq.com/html5/index.html?ADTAG=JIFEN.MART.INDEX 随意兑换一个商品: 因为刚才我已经兑换过了,所以积分没有了.. 没关系, ...
- Xming导致的SecureCRT远程登录的普通用户图形程序不能运行
SecureCRT+Xming,用惯之后感觉特别方便,就是绘制效率稍差,不过可以忍受. 但是今天发生奇怪错误: 启动liteide后一切正常,但是选择打开目录菜单后就崩溃退出: 重新连接没用: 重新连 ...
- MyEclipse使用笔记
简单记录下个人常用的一些MyEclipse设置 VS颜色方案 Window-->Preference-->Java->Editor-->Syntax Coloring Clas ...
- Go 文件操作(创建、打开、读、写)
https://blog.csdn.net/Tovids/article/details/77887946
- MTK 预置apk
一.如何将带源码的APK预置进系统? 1) 在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例 2) 将 Test ...
- messagpack的使用
我打算使用messagepack对通信的对象进行序列化,使用的方式参考这篇文章: http://www.cppfans.org/1410.html 此处记录一下自己遇到的一些问题 先是用VS2010对 ...
- java命令启动jar包
本人对这些命令也是一知半解,记录备用. 1. 使用java命令行执行java文件 # 设置命令窗口标题 title test1 # 开启输出 @echo on # 设置环境变量JAVA_HOME se ...