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

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

效果如下图:

SharpGL之Viewport的更多相关文章

  1. SharpGL学习笔记(七) OpenGL的变换总结

    笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...

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

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

  3. CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口

    CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...

  4. 移动WEB开发之viewport

    问题: 在codepen上写了一个响应式页面,调试的时候没有问题.结果放到网站上,在手机上打开之后竟然和在电脑中的布局是一样的.         查阅资料之后知道响应式布局应该有这样一句话:<m ...

  5. viewport理解

    viewport预备知识 dpr === dppx dpr:device pixel ratio 设备像素比 dppx:Number of dots per px unit 每像素有多少点 . 1dp ...

  6. 移动WEB viewport 相关知识

    了解移动web viewport的知识,主要是为了切图时心中有数.本文主要围绕一个问题:切图时怎样设置<meta name="viewport">相关参数?围绕这个问题 ...

  7. 理解SVG的viewport,viewBox,preserveAspectRatio

    万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...

  8. 移动端开发viewport深入理解(转)

    一.viewport的概念   移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,就是浏览器上用来显示网页的那部分区域,但viewport不局限于浏览器可视区域 的大小,它 ...

  9. 移动前端开发之viewport的深入理解

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...

随机推荐

  1. Mybatis书写

    Mybatis设置主键和自增 方法1: <insert id="insert" parameterType="Person" useGeneratedKe ...

  2. 记录TortoiseGit=>https请求/ssh请求配置

    ssh C:\Program Files\Git\usr\bin\ssh.exe https C:\Program Files\TortoiseGit\bin\TortoisePlink.exe

  3. Mysql—索引原理与详解

    索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...

  4. Linux文件传输协议2019-7-9

    FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...

  5. 【BZOJ2655】calc(拉格朗日插值)

    bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...

  6. 如何对jmeter设置IP欺骗

    由于服务器出于安全考虑会对同一IP地址做过滤,所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址.主要步骤分为以下3步:第一步:在负载机上绑定IP地址. 第二步:在要欺骗的http ...

  7. IntelliJ IDEA 快捷键(七)

    /*方法参数提示*/ ctrl + p /*折叠代码/展开代码*/ ctrl + - / ctrl + + /*快速查找和打开最近使用过的文件*/ ctrl + E /*自动代码片*/ ctrl + ...

  8. leetcode279. 完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12输出: 3 解释: 12 = ...

  9. oracle存储过程中循环游标,变量的引用

    创建出错时使用: show errors查看具体的错误提示 一. 存储过程中的一个循环及变量引用示例: create or replace procedure my_proiscursor cur i ...

  10. maven 常见命令

    mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个阶段.mvn clean ...