Monthly Archives: March 2014

坐标系统的变换

本文主要介绍图形学中坐标系统变换的理论基础。 图1. 坐标系统的变换 以二维为例,如图1所示。设坐标系统\({{\Gamma }_{1}}\),原点在\({{\theta }_{1}}=\left( 0,0,1 \right)\),两条坐标轴分别为\({{\vec{i}}_{1}}=\left( 1,0,0 \right),{{\vec{j}}_{1}}=\left( 0,1,0 \right)\),点\(P\)在坐标系统\({{\Gamma }_{1}}\)上的坐标为\(\left( {{a}_{1}},{{b}_{1}} \right)\);类似的,点\(P\)在坐标系统\({{\Gamma }_{2}}\)上的坐标为\(\left( {{a}_{2}},{{b}_{2}} \right)\)。设坐标轴\({{\vec{i}}_{1}},{{\vec{j}}_{1}}\),原点\({{\theta }_{1}}\)经过一个矩阵变换\(M\),得到坐标系统\({{\Gamma }_{2}}\)的坐标轴和原点,即有: \

spacer

环境贴图

本文主要首先介绍下什么是环境贴图,然后分别介绍球面贴图,立方体贴图,和双抛物面贴图,比较三种贴图方式的优缺点,立方体贴图的代码的下载地址为:https://github.com/twinklingstar20/twinklingstar_cn_environment_mapping(从NVIDIA网站上下载下来的)。 一. 环境贴图是什么 环境贴图(Environment Mapping,EM)也称为反射贴图(Reflection Mapping),把反射对象当作一个虚拟眼睛,生成一张虚拟的纹理图,然后把该纹理图映射到反射对象上,得到的图像就是该场景的一个影像。举个例子,比如镜子中的图像,就是对真实场景的一个影像。环境贴图这项技术最早由Blinn和Newell提出的【4】,主要实现的功能是:使物体表面能显示出真实场景的影像。如下图所示,小球表面就有周围环境的影像。 图1. 环境贴图 实现环境贴图,很常见到的主要有三种技术:球面贴图(Spherical Environment Mapping),双抛物面贴图(Dual Paraboloid Mapping)和立方体环境贴图。 环境贴图基本的思想如图2所示,假设场景离对象很远而且对象不会产生自我反射,在对象上某一点的影像就能通过反射向量r来确定。 图2. 环境贴图基本思想 那么环境贴图主要分5个步骤: (1)       创建一个2D环境纹理 (2)       计算反射对象上每个像素点的法向量 (3)       基于人眼位置和平面的法向量,计算反射向量 (4)       使用反射向量,计算该像素点在2D纹理上的值 (5)       使用得到的纹理值来绘制像素 基于人眼位置和平面的法向量,来计算反射向量,也很简单,如下面的图所示: 图3. 计算反射向量 接下来分别介绍3种具体的环境贴图的算法和实现,并且分析各种方法的优缺点。 二. 球面贴图 如图1所示,就是一个经典的球面贴图的样例。假设观察者在无穷远处,则所有的入射光线都是平面,如图4所示。 图4. 球面贴图的几何图示,红色表示法向量,蓝色表示反射射线,黄色表示入射光线 现在考虑如何将表面的颜色值与纹理上的纹理值对应起来。如图5所示,从观察者到顶点的坐标值用U来表示,归一化向量U,得到U’。既然是在视点坐标系统下进行的计算,则眼睛被放置在原点,向量U的值就等于顶点在视点空间下的坐标。当前的向量N也被变换到视点空间下,并且进行规一化,得到N’,反射向理就可以通过下面的等式计算得到: \(R = U' - 2(N'

spacer

齐次表示

齐次表示在图形学中占有非常重要的位置。点表示三维空间中的一个位置,向量表示一个方向,没有具体的位置。使用\(3\times 3\)的矩阵,可以对坐标进行仿射变换,比如旋转、缩放以及错切变换等,然而使用这种矩阵并不能进行平移变换。点的平移是有意义的,但是向量的平移是没有意义的。 简单来说,在三维空间上,点和向量的表示都是3维的,把扩展1维,就得到齐次向量表示,即\(\vec{p}=\left( {{p}_{x}},{{p}_{y}},{{p}_{z}},{{p}_{w}} \right)\)。若\({{p}_{w}}\)为零,\(\vec{p}\)表示一个三维向量;若\({{p}_{w}}\)非零,则\(\vec{p}\)表示点\(\left( {{p}_{x}}/{{p}_{w}},{{p}_{y}}/{{p}_{w}},{{p}_{z}}/{{p}_{w}} \right)\)。 齐次向量扩展1维,那么原先由\(3\times 3\)的矩阵表示的变换也需要扩展1维,变成\(4\times 4\)的齐次矩阵。\(4\times 4\)的齐次矩阵可以实现旋转、缩放和错切变换,形式为: \ \(3\times 3\)矩阵不能表示的位移变换,也可以采用\(4\times 4\)的齐次矩阵来表示 \ 易知,若\(\vec{v}\)是一个向量\(\vec{v}=\left( {{v}_{x}},{{v}_{y}},{{v}_{z}},0 \right)\),则\(T\cdot \vec{v}\)得到的结果仍等于\(\vec{v}\),因为向量的位移是没有意义的。 图1. 点的透视投影 齐次表示除了能表表三维空间上所有的仿射变换(两条互相平面的直线,变换后,仍然互相平行),还可以表示透视变换,参见文章《OpenGL原理介绍》,如图1所示。一个点\(P=\left( {{p}_{x}},{{p}_{y}},{{p}_{z}} \right)\)投影到照相机的近平面上\(\left( {{x}^{*}},{{y}^{*}} \right)\),\({{p}_{z}}\)是在\(z\)轴的负方向上,\(N\)表示投影平面到源点的距离,则有\({{x}^{*}}/{{p}_{x}}=N/\left( -{{p}_{z}} \right)\),则\({{x}^{*}}=N{{p}_{x}}/\left( -{{p}_{z}} \right)\),同理,有\({{y}^{*}}=N{{p}_{y}}/\left( -{{p}_{z}}

spacer