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

摘要:
Viewport(intx,inty,intheight)让我们用一个图表来描述函数:h/2);7使用System.Text;23gl.清除(OpenGL.GL_COLOR_BUFFER_BIT|OpenGL_GL_DEPTH_BUFFER_BIT);25显示器(gl);33gl.Begin(OpenGL.GL_LINES);39}40gl.End();

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

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

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

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

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

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

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

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

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

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

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

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

  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 }

效果如下图:

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

本节源代码下载

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

免责声明:文章转载自《SharpGL学习笔记(五) 视口变换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信分享接口SDK简介使用Font Awesome字体图标下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CSS(十一)-- 手机像素

目录 1.像素css像素:编写网页时,我们所用像素都是css像素 2.视口: 3.移动端的像素 3.1完美视口通过视口来调整像素比 3.2手机端元素布局 使用vw(视口宽度)来布局 使用rem来布局 页面的设计图像素设置 1.像素 屏幕是由一个一个发光的小点构成,这一个个小点就是像素 分辨率:1920*1080 说的是屏幕...

CAD日常操作

一、图形充满视口: 第一种操作:鼠标中键双击; 第二种操作:z--空格---E--空格 放大其中一个图形:z--空格 单击一点-----框选图形----单击---此时选中图形已放大 二、闭合操作:c--空格 :直线闭合 cl--空格:是曲线闭合 三、返回上一步:z--空格/u--空格 四、删除:选中图形---E--空格 五、长度和角度输入的切换方式: 画一...

3DMAX中坐标解析

World:世界坐标系,又称世界空间。位于各视口左下角的图标,显示了世界坐标系的方向,其坐标原点位于视口中心。该坐标系永远不会变化。Screen:屏幕坐标系,此时将使用活动视口屏幕作为坐标系。在活动视口中,x轴将永远在视图的水平方向并且正向向右,y轴将永远在视图的垂直方向并且正向向上,z轴将永远垂直于屏幕并且正向指向用户。View:视图坐标系,它混合了世界...

OpenGL(十二) 纹理映射(贴图)

OpenGL绘制纹理的步骤: 1. 开启纹理功能 使用glEnable(GL_TEXTURE_2D)开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)关闭纹理,默认情况下纹理是关闭的。 2. 读取纹理图片到内存 读取的时候注意以下3点:  1) BMP文件数据前54位是文件头和信息头数据,偏移54位之后才是要读取的图像数...

element-ui走马灯如何实现图片自适应 长度和高度 自适应屏幕大小

最近写用vue2.0写一个项目,用到了走马灯效果,由于项目赶时间,想偷下懒,第一次引用了element组件(纯JS也可以写的出来,赶时间嘛,懂得。。。。),结果用了发现一个问题,element的组件(Carousel) 走马灯,高度是固定的,页面缩小会有空隙。网上查了一大堆资料,都说的不全面,要么报错,要么根本无法实现。浪费了大半天时间,还不如JS写的快,...

JS 滚动条滚动到指定元素触发

JS 版 <!DOCTYPE html> <html> <head> <style type="text/css">#showIt { 200px; height: 200px; background-color: red;...