计算机图形学基础(三) 观察1

Opengl中的标架

1.对象坐标系(建模坐标系)。
2.世界坐标系。
3眼坐标系(照相机坐标系)。
4裁剪坐标系。
5规范化的设备坐标系。
6窗口坐标系(屏幕坐标系)。
绘制流水线通常按照这个先后顺序出现。


一点说明

1.在大多数情况把照相机看作是固定的,其他标架则相对于照相机移动,一般读者可能更愿意采用不同的观点。

2.从模型坐标到世界坐标+从世界坐标到眼坐标,这两个变换通常合并为模-视变换,对应模-视变换矩阵,后面会遇到必须分开这两个变换的情形。


经典观察简介

透视投影
透视投影,在计算机图形系统中COP位于照相机标架的原点。

平行投影(观察点在无限远处)
平行投影(观察点在无限远处),在计算机图形系统中,照相机标架的原点通常位于投影平面。

在经典观察中有一个基本的概念叫主面,对象的表面往往由一些平面组成,每个平面都可以看成是一个主面。
长方体对象,有前面、后面、顶面等自然概念。此外,许多现实世界中的对象具有相互垂直的面,因此经常可以在这些对象中的表面找到三个彼此正交的方向。
经典投影图
经典投影图


计算机观察

我们应该能够生成任何一种经典投影图,因为建立在虚拟照相机的基础上,不过这两者有本质的区别:所有的经典投影图都依赖于对象、观察者和投影线之间的特定位置关系;
在计算机图形学中,我们强调对象定义和照相机参数设置这两者之间的独立性。因此,为了生成某种经典投影图,应用程序必须利用对象的信息来创建照相机,并且将照相机放在恰当的位置。

在之前没有显示地定义标架,采用默认的情形(三个标架重合)。之前在裁剪坐标系中直接指定顶点位置,或者通过通过仿射变换(基础二中的三维变换)改变位置和大小,并变换到裁剪坐标系中的裁剪立方体内部。
照相机固定在裁剪坐标系的原点并且指向z轴的负方向(如果对象位于裁减体内部,那么默认的照相机可以“看见”它后面的对象)。

为了使观察更加灵活,分解成两个基本操作,(1)模-视变换 –> 顶点位于照相机坐标中。(2)利用投影变换 –> 把指定的投影(正投影或者透视投影)应用于顶点,并且把位于视见体内部的对象变换到位于裁剪坐标系中的裁剪立方体内部。
通俗的说就是:先把照相机摆好,然后指定大小拍照片。
观察过程


定位照相机

照相机
照相机的初始方向是指向z轴负方向

定位照相机的三种方法
(1)通过一系列旋转平移来改变模-视变换矩阵,从而间接的指定照相机方位。(p145)
(2)通过。。。。。
照相机标架
VRP(view-reference point) 观察参考点(就是照相机放的地方)
VPN(view-plane normal) 观察平面法向量(投影平面方向)
VUP(view-up vector) 观察正向向量(确定照相机的方向是向上还是向下)

照相机
这图是网上找的,这里的VUV就是由VUP确定的,也就是上上图的v

一:在对象标架下描述照相机方位,二:通过指定投影变换来获得所需投影类型,第二个步骤经常被称为规范化变换,我们把它当作标架的变换来处理。。。。后面的内容以后再写。。。。

(3)Look-At函数
look at函数定位照相机

照相机位于点e,该点称为视点(eye point),是在对象标架下指定的,照相机的方向指向另一个点a,该点叫做参考点(at point)。
这两个点确定了VPN和VRP。

VRP=e;
VPN=a-e;

进行归一化
n

通过叉积及归一化操作生成uv。
uv

以上就是Look-At函数的思想,下面看代码:

mat4 LookAt( const vec4& eye, const vec4& at, const vec4& up )
{
    vec4 n = normalize(eye - at);
    vec4 u = normalize(cross(up,n));
    vec4 v = normalize(cross(n,u));
    vec4 t = vec4(0.0, 0.0, 0.0, 1.0);
    mat4 c = mat4(u, v, n, t);
    return c * Translate( -eye );
}

返回上述矩阵成为变换矩阵,原理大家可以自己推导,在后面也会补充这些数学知识。
下面是mat4的部分代码

class mat4 {
    vec4  _m[4];
public:
     mat4( const vec4& a, const vec4& b, const vec4& c, const vec4& d )
    { _m[0] = a;  _m[1] = b;  _m[2] = c;  _m[3] = d; }

    mat4( GLfloat m00, GLfloat m10, GLfloat m20, GLfloat m30,
      GLfloat m01, GLfloat m11, GLfloat m21, GLfloat m31,
      GLfloat m02, GLfloat m12, GLfloat m22, GLfloat m32,
      GLfloat m03, GLfloat m13, GLfloat m23, GLfloat m33 )
    {
        _m[0] = vec4( m00, m10, m20, m30 );
        _m[1] = vec4( m01, m11, m21, m31 );
        _m[2] = vec4( m02, m12, m22, m32 );
        _m[3] = vec4( m03, m13, m23, m33 );
        // _m[0] = vec4( m00, m01, m02, m03 );
        // _m[1] = vec4( m10, m11, m12, m13 );
        // _m[2] = vec4( m20, m21, m22, m23 );
        // _m[3] = vec4( m30, m31, m32, m33 );
    }
    mat4( const GLfloat d = GLfloat(1.0) )  // Create a diagional matrix
    { _m[0].x = d;  _m[1].y = d;  _m[2].z = d;  _m[3].w = d; }
}

normalize是归一化函数

vec4 normalize( const vec4& v ) {
    return v / length(v);
}

cross函数就是叉积操作,关于数学的问题以后会专门写一个

vec3 cross(const vec4& a, const vec4& b )
{
    return vec3( a.y * b.z - a.z * b.y,
         a.z * b.x - a.x * b.z,
         a.x * b.y - a.y * b.x );
}
//vec3到vec4转化的构造函数。
vec4( const vec3& v, const float s = 1.0 ) : w(w)
    { x = v.x;  y = v.y;  z = v.z; }
//这是作者网站上下载的代码,我感觉不是很对,就改了下。以前打开的示例程序全是白的,现在能运行出效果了。。。。纠结了好久的问题。。。。。。
vec4( const vec3& v, const float w = 0.0 ) : w(w)
    { x = v.x;  y = v.y;  z = v.z; }

其他观察API

首先复习下极坐标,留作备用。(参考资料:百度百科)
(1)二维极坐标
这里写图片描述
在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度,θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系。

(2)三维极坐标
这里写图片描述
极坐标系也可以运用坐标(ρ, φ, θ)扩展为三维,其中ρ是距离球心的距离,φ是球半径在xy平面的投影距离x轴的角度(与极坐标中一样),θ是距离z轴的角度(称作余纬度或顶角,角度从0到180°)。这个坐标系被称作球坐标系。

球坐标系
百度百科
用(r,θ,φ)来表示,r和ρ意义一样,两个希腊字母意义也一样。
这里写图片描述
这里写图片描述

飞行模拟器
飞行员通常用三个角度:滚转角(roll)、俯仰角(pitch)和偏航角(yaw)来指定方向。
基准点是飞行器的质心,基准方向是飞行器机身的三个轴向,根据这三个角度和对象到飞行器质心的距离,我们可以用一个平移和三个简单的旋转构造出观察变换(示例以及程序以后会写)。
这里写图片描述

一些对象绕另外一些对象旋转
考虑在天空中指定一颗恒星。从观察者来看,这颗恒星的方向由仰角和方位角给出。p151后面懒得打了。
这里写图片描述
考虑绕着地球运行的卫星,它在地球上空的位置由极坐标指定,求使观察者的视线一直指向地球的模–视变换矩阵。在卫星运行时可以用该变换矩阵来显示地球的图像。(过程以及程序以后会写)。


平行投影

使用 投影线互相平行且指向投影方向这样一个事实直接推导出平行投影的方程。

(1)正投影

正交投影或者说正投影是平行投影的一种特殊情形:投影线垂直于观察平面,照相机的胶片平面应该平行于镜头,并且镜头焦距无限大。
这里写图片描述
意思就是
Xp=X;
Yp=Y;
Zp=0;
矩阵为:这里写图片描述
矩阵应用于顶点着色器输出的顶点并由硬件来执行。

(2)OpenGL中的平行投影

这里写图片描述
opengl中唯一一个平行投影观察函数。 4个侧面:
x = right;
x = left;
y = top;
y = bottom;
前(近)裁剪平面相距原点的距离为near,而后(远)裁剪平面相距原点的距离为far。所有这些变量是在照相机坐标系下取值。
注意:Windows必须修改near和far,因为是程序设计语言的一个保留字。(zNear和zFar)

mat4 Ortho( const GLfloat left, const GLfloat right,
        const GLfloat bottom, const GLfloat top,
        const GLfloat zNear, const GLfloat zFar )

可以通过这个生成投影变换矩阵

正交相机初始时位于照相机坐标系的原点,并且由下面三个等式确定它的视见体。
x=
我们将其作为默认的设置。

(3)投影的规范化
在计算机图形系统中。第一,在四维空间里使用齐次坐标来计算投影。第二,尽量保留深度信息(沿投影线的距离),这样可以在后面进行隐藏面消除。第三,使用了一种叫做投影规范化矩阵的技术。
这里写图片描述
a透视投影——————————————————-b扭曲变形后的对象的正交投影

先把对象变形,使得变形后的对象的正交投影图与原来想要得到的对象的投影图相同,这样就把所有的投影都转化为正交投影。这里的扭曲变形由规范化矩阵来执行。

这里写图片描述

变形(规范化)———–正投影

(4)正投影变换矩阵
默认的投影变换矩阵是单位矩阵(单位矩阵意思是不改变,下面的是默认的视见体),等价于

mat4 N = Ortho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

前面也有描述。

OpenGL的投影变换矩阵被设置成这样的变换矩阵,该矩阵把Ortho指定的视见体变换为中心位于原点,边长为2的立方体(上述默认的视见体)。
这里写图片描述

变换过程
这里写图片描述
平移:T( -(left+right)/2, -(bottom+top)/2, (near+far)/2));
缩放:S(2/(left-right), 2/(top-bottom), 2/(near-far));

级联在一起,所得如下:
这里写图片描述

代码按照上图看就可以了

mat4 Ortho( const GLfloat left, const GLfloat right,
        const GLfloat bottom, const GLfloat top,
        const GLfloat zNear, const GLfloat zFar )
{
    mat4 c;
    c[0][0] = 2.0/(right - left);
    c[1][1] = 2.0/(top - bottom);
    c[2][2] = 2.0/(zNear - zFar);
    c[3][3] = 1.0;
    c[0][3] = -(right + left)/(right - left);
    c[1][3] = -(top + bottom)/(top - bottom);
    c[2][3] = -(zFar + zNear)/(zFar - zNear);
    return c;
}

(5)交互式观察立方体
采用极坐标定位照相机。

斜投影

这里写图片描述
这里写图片描述
通过这两个图理解下面的俯视图和侧视图
这里写图片描述

通过俯视图:
这里写图片描述
由此以及同理得
这里写图片描述
把P拆分为两个矩阵的乘积

这里写图片描述
H是错切矩阵,于是,过程为先错切变换,然后进行正投影。

再加上和前面相同的缩放和平移矩阵ST。
所以N=Morth*STH

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章绪论 1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教学 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形学研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科学计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数学描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值