OpenGL学习札记_1

 屏幕坐标系

当我们在三维图形学中谈论"点(point)"时,我们常说"顶点(vertex)"。一个点有三个坐标:X, Y, Z。如何想象这三个坐标呢?

这里有一个形象的方法:使用右手定则

  • X 是你的拇指
  • Y 是你的食指
  • Z 是你的中指。如果你把你的拇指指向右边,食指指向天空,那么中指将指向你的背后。

我们的观察方向是Z轴负半轴的方向。

为了将物体的三维坐标转换为屏幕上的像素位置,需要以下3个步骤:

1.变换

包括视图(视点)变换、模型变换和投影变换。都是由矩阵乘法表示。

这些操作中包括旋转,移动,缩放,反射,正投影和透视投影等。一般情况下,需要组合使用几种变换。

2.剪裁

场景是在一个矩形窗口中渲染的,位于窗口之外的部分就要丢掉。

3.视口变换

视口变换,就是将经过变换的坐标和屏幕像素之间建立对应关系的过程。

变换

视图(视点)变换:

相当于照相机(眼睛)的位置,要对准场景。函数gluLookAt()来指定视图变换,这函数有9个参数,前3个表示照相机(眼睛)的位置,中间3个表示我们要瞄准哪个方向,后3个表示哪个是朝上的向量。

模型变换:

对被拍摄的模型的各种变换操作。包括各种模型变换函数,glScalef(), glTranslatef()等。注意,我们可以不通过移动照相机(视图变换)来观察一个立方体,而是移动这个立方体(模型变换)。

模型视图矩阵(modelview martrix):模型变换和视图变换的组合。

投影变换:

a.确定视野(视景体),即确定哪些物体位于视野之内,以及它们被看到的程度。

b.除了视野,投影变换还决定物体是如何投影到屏幕上。两种投影类型:透视投影(perspective projection)和正投影(orthographic projection)

透视投影:

类似于日常生活看到的场景,远处物体看起来小,近处看起来大。使用透视投影函数glFrustum()和gluPerspective().

glFrustum(GLdouble left, GLdouble right,

          GLdouble bottom, GLdouble top,

        GLdouble near, GLdouble far)

far, near是指近裁剪面,远剪裁面离视点的距离(>0),

对角坐标, (left, bottom, -near)和(right, top, -near)定义了近裁剪面的左下角和右上角的(x, y, z)坐标。

gluPerspective(GLdouble fovy,  GLdouble aspect,

            GLdouble near, GLdouble far)

fovy视角,aspect = w/h。

正投影:

把物体直接映射到屏幕上,不影响它们的相对大小。也就是图像反映物体的实际大小,而不是它们看上去的样子。

函数glOrtho()创建一个用于正交投影的平行视景体, 将其与当前矩阵相乘。

void glOrtho(GLdouble left, GLdouble right,

      GLdouble bottom, GLdouble top,

      GLdouble near, GLdouble far);

void glOrtho2D(GLdouble left, GLdouble right,

      GLdouble bottom, GLdouble top);

视口变换

投影变换和视点变换一起决定了场景的映射方式,而视口变换指出了场景被映射到什么样的屏幕区域,即指定场景在屏幕上所占据的区域。可以这样认为:视口变换定义处理后照片的大小和位置, 你希望照片像海报那么大还是钱包那么大。

函数glViewport(0.0, 0.0, (GLsizei) w, (GLsizei) h)有4个参数,前2个参数描述窗口内部有效屏幕空间的原点(0, 0); 后2个参数描述有效区域的width和height(均以像素为单位)。

绘制场景

指定了所有的变换后,就可以进行绘制场景了。

a. 通过模型变换和视图变换对场景中得每个物体的每个定点进行变换;

b. 根据指定的投影变换对每个顶点进行变换;

c. 如果顶点位于视景体(视野)之外,则进行剪裁;

d. 经过变换的剩余顶点除以w, 然后映射到视口中。

时间: 2024-11-09 02:10:13

OpenGL学习札记_1的相关文章

OpenGl学习进程(7)第五课:点、边和图形(二)边

本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的.可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定.     (2)如何绘制边: 1)OpenGL支持绘制三种类型的边: GL_LINES :指定两个顶点,在它们之间绘制一条直线.如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略. GL

OpenGL学习 Following the Pipeline

Passing Data to the Vertex Shader Vertex Attributes At the start of the OpenGL pipeline,we use the in keyword to bring inputs into the vertex shader. Between stages,in and out can be used to form conduits from shader to shader and pass databetween th

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

OpenGL学习笔记:拾取与选择

转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当前鼠标的位置是哪一个物体呢? OpenGL有一套机制,叫做Picking, 里面涉及到几个核心概念: 1. selection mode. 选择模式 2. name stack. 名字栈 3. hit record. 命中记录 4. viewing volume. 视角范围 在OpenGL的pick

OpenGL学习进程(3)第一课:初始化窗体

    本节是OpenGL学习的第一个课时,下面介绍如何初始化一个窗体:     (1)显示一个有蓝色背景的窗体: #include <GL/glut.h> #include <stdlib.h> void display(void) { /* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glFlush (); } int main(int argc, char** argv) { glutInit(&argc, a

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

Java 学习札记(三)免安装版TomCat中tomcat6w.exe的运行

1.使用环境 很多时候我们用的是官网的解压免安装版的Tomcat,相比安装Tomcat除了少了安装步骤以外还少了tomcat6w.exe运行所需要的环境变量,所以一般Java开发免安装版的已经足够使用了,但是如果部署服务的时候我们不可能只运行startup.bat文件,我们需要新建一个服务并可以通过tomcat6w.exe启动和关闭服务. 2.无法运行tomcat6w.exe (1)提示错误: 运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the serv

OpenGL学习进程(11)第八课:颜色绘制的详解

    本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿.     (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. RGBA模式与索引模式的区别: 计算机必须为每个像素保存一些数据,在RGBA模式中数据就代表了颜色:而颜色索引模式中数据代表了一个索引,要获取真正的颜色值还需要查索引表.数据的数量是由帧缓存中的位面决定的.一个位面为一个像素的一个位的数据.假如是8位面的颜色,每个像素就有8个颜色位,因此就有2的8次方