zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    独立与条件独立
    独立事件、笛卡尔积与矩阵向量乘法
    独立事件、笛卡尔积与矩阵向量乘法
    OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
    等高线的认识
    等高线的认识
    概率相关的证明
    概率相关的证明
    OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
    中英文对照 —— 歌词
  • 原文地址:https://www.cnblogs.com/hackpig/p/5790728.html
Copyright © 2011-2022 走看看