OpenGL坐标系介绍
===============
[TOC]
OpenGL可以分成四种坐标系,分别是世界坐标系,模型坐标系,眼坐标系,设备坐标系。
#数学的观点:向量空间和仿射空间
仿射空间(affine space)是向量空间的扩展,除了标量和向量,它还包含另外一种对象-点。
尽管在仿射空间中对两个点以及一个点和一个标量没有定义运算,但对一个向量和一个点定义了一种运算——向量-点加法,它的结果是一个点。也可以说有一种称为点-点减法的运算,这种运算由两个点得到一个向量。
#计算机科学的观点
把标量、点和向量看做是集合中的元素,并且可以按照某些公理在元素之间进行运算,这是数学家更愿意采用的观点,而计算机科学家更愿意把它们看做是抽象数据类型(ADT),ADT是在数据上定义的一些运算,这些运算的定义不依赖与数据在计算机内部的表示方法和运算的具体实现方式。数据抽象是现代计算机科学的基本概念。例如,把一个元素添加到一个列表中是一种运算,对这种运算的定义不依赖与列表的存储方式。从计算机角度来看,不管一个特定系统在其内部如何表示对象,都应该能够通过下面的代码来定义几何对象:
vector u.v;
point p,q;
scalar a,b
#坐标系和标架
目前为止,向量和点都被当做抽象的对象,并没有考虑它们在某个坐标系下的表示。在一个三维向量空间中,可以用任意三个线性无关的向量v1,v2,v3把任意一个向量w表示为
w = a1v1 + a2v2 + a3v3
把w关于这个基[v1 v2 v3]的表示写成矩阵形式:
|a1|
a= |a2|
|a3|
通常我们认为基向量v1,v2,v3定义了一个坐标系(coordinate system)。然而,除了向量,我们还要处理点和标量,所以还要有一种更一般的方法。
三个基向量可以构成一个基,即可以表示三维空间中的任意向量。不过向量虽然有大小和方向,但是没有位置属性。我们没有解决如何表示点的问题。点和向量是不同的,他们是有固定位置的实体。
因为仿射空间中包含点,所以一旦在这样的空间里选定了一个特定的参考点(原点),就可以以一种明确方式来表示所有的点。习惯上把原点作为坐标轴的起点,这在仿射空间里是有意义的,因为我们既要表示点,又要表示向量。不过,这种表示除了要确定基向量意外,还要确定参考点。原点和基向量决定了一个标架(frame)。关于标架的一个不太严谨的说法是:它把向量坐标系的原点固定在了某个点P0处。在给定的一个标架下,每个向量可以唯一的表示为
w = a1v1 + a2v2 + a3v3
这和向量空间中一样,但是点可以唯一表示为:
P= P0 + b1v1 + b2v2 + b3v3
这样,在一个标架下,表示一个向量需要三个标量,而表示一个点需要三个标量和原点的位置。通过放弃更熟悉的坐标系概念转而使用标架的概念,可以避免由于向量具有大小和方向而没有固定位置所带来的困难。此外,我们还能借助矩阵来表示点和向量,并且点和向量这两种几何类型的矩阵是有区别的。
>注意,向量和点一样,其存在与参考系无关,不过�