全球彩票平台_全球彩票注册平台|官网下载地址

热门关键词: 全球彩票平台,全球彩票注册平台,全球彩官网下载地址

视口变换,OpenGL的变换总结

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

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

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

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

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

 

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

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

图片 1

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

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

 

图片 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 }

 

效果如下图:

图片 4

 

本节源代码下载

 

) 视口变换,sharpgl学习笔记 视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是...

 

 

SharpGL学习笔记(七) OpenGL的变换总结,sharpgl学习笔记

笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好!

这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对"将三维体正确的显示在屏幕上指定位置"这样的操作都无法完成.

 

OpenGL变换包括计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换,以及针对OpenGL的特殊变换概念理解和用法,如相机模拟、矩阵堆栈等,这些基础是开始真正走进三维世界无法绕过的基础.

所以笔者在前面花了5篇的篇幅详细讲解了这些基础概念.

 

SharpGL学习笔记(二) 模型变换(几何变换)

SharpGL学习笔记(三) 投影变换和视点变换

SharpGL学习笔记(四) 正射投影

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

SharpGL学习笔记(六) 裁剪变换

 

但是这些概念是零散的, 你可能感觉在实际应用中无法把它们有机的串联起来吧? 本节就是想把这些基础知识点按照应用时的逻辑关系理清楚, 并且要彻底搞清楚这些功能之间的关系.

 

我们拿日常使用相机的例子打个比方:

实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念):
第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。
第二步,将三维物体放在适当的位置(模型变换(几何变换),Modeling Transformation)。
第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation)。
第四步,决定二维像片的大小(视口变换,Viewport Transformation)。
这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。

下面的示意图,表达了上面的意思。

图片 5

 

三维图形世界中的还有几个特殊坐标系的概念。
显示三维图形的这个坐标系称为世界坐标系
要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左上角,长度单位常取成一个象素的长度,大小可以是整型数。
为了使三维休能在二维显示器上显示出来,必须要通过投影进行降维处理。投影的方法有两种,即正射投影和透视投影
正射投影和透视投影定义一个三维视景体(Viewing Volume)。正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。只有视景体内的物体能被投影在显示平面上,其他部分则不能。

在绘画3D图形的屏幕窗口内可以定义一个矩形,称为视口Viewport),视景体投影后的图形就在视口内显示,三维图形根据视口变换后, 即可以显示满屏,也可以只显示一部分。
为了适应物理设备坐标和视口所在坐标的差别,还要作一适应物理坐标的变换。这个坐标系称为物理设备坐标系

根据上面所述,三维图形的显示流程应如下图所示。

图片 6

 

上面所有这些步骤,在OpenGL中,需要好几条语句才能完成。但在3dsmax中,只是使用变换工具,摄像机工具, 这两个工具就可以全部完成了。

其中“移动,旋转,缩放”工具如果对三维模型做操作就是模型变换

调节摄像机位置与目标点,还有旋转摄像机就是在做 视点变换

顶视图,前视图,左视图, 是三个 正射投影视图, 而Camera01视图是一个透视投影视图, 并且这三个视图加上Camera01视图一起是四个视口

摄像机工具中的一个功能选项“手工剪切”, 就是裁剪变换

顶,前,左,Camera01四个视图中的横竖黑线就是世界坐标系的XY轴, 而屏幕坐标系的原点是在每个视图左上角,水平方向是X,垂直方向是Y。

图片 7

 

 

如果仍然有疑惑,可以回复本贴,笔者再加以补充。

 原创文章 : 

 

) OpenGL的变换总结,sharpgl学习笔记 笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对...

这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对"将三维体正确的显示在屏幕上指定位置"这样的操作都无法完成.

 

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

 

原创文章,出自"博客园, 猪悟能'S博客" : 

图片 8

上面所有这些步骤,在OpenGL中,需要好几条语句才能完成。但在3dsmax中,只是使用变换工具,摄像机工具, 这两个工具就可以全部完成了。

 

 

在绘画3D图形的屏幕窗口内可以定义一个矩形,称为视口Viewport),视景体投影后的图形就在视口内显示,三维图形根据视口变换后, 即可以显示满屏,也可以只显示一部分。
为了适应物理设备坐标和视口所在坐标的差别,还要作一适应物理坐标的变换。这个坐标系称为物理设备坐标系

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

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

其中“移动,旋转,缩放”工具如果对三维模型做操作就是模型变换

 

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

下面的示意图,表达了上面的意思。

图片 9

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

SharpGL学习笔记(四) 正射投影

Viewport(w/2,0, w/2, h/2); drawpic();    //右下角

图片 10

 

本文由全球彩票平台发布于全球彩票注册平台编程,转载请注明出处:视口变换,OpenGL的变换总结

TAG标签: 全球彩票平台
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。