用过3DMAX的人都知道,一个3D场景是由很多模型(model)组成的,而模型就是通常说的网格(mesh), 它是由三角形面(triangle)组成,而每个三角形面又是由3个顶点(vertex)构成。如图:
材质(materal)和纹理(texture):
光有网格模型看上去就是一个物品的轮廓,为了让模型具有真实感,我们就要为模型赋予材质和纹理。
材质包含颜色,D3D中这样定义颜色:
typedef struct D3DXCOLOR
{
FLOAT r, g, b, a; // 分别对应 红、绿、蓝、透明度
} D3DXCOLOR;
材质的定义是:
// 材质
typedef struct _D3DMATERIAL8
{
D3DCOLORVALUE Diffuse; // 谩反射光
D3DCOLORVALUE Ambient; // 环境光,理解为整体亮度
D3DCOLORVALUE Specular; // 镜面反射,一般用于光滑的平面
D3DCOLORVALUE Emissive; // 放射光,一般用于自发光体(太阳、灯…)
float Power; // 指定镜面高光的强度
} D3DMATERIAL8;
而纹理是附着在模型上的皮肤,在D3D中用IDIRECT3DTEXTURE8接口管理纹理。
下面是一个指定了材质和纹理的模型,看上去是不是真实多了。
向量(vector):
我们说一个模型就是一个对象:
对象都有其位置和方向,在3D空间中由三个值定义:x,y,z。
D3D中的位置和方向都是向量,向量定义为:
typedef struct _D3DVECTOR
{
float x; // x坐标
float y; // y坐标
float z; // z坐标
} D3DVECTOR;
矩阵(matrix):
对象有了方向和位置后,要对其进行移动、放缩和旋转等处理就需要用到矩阵。矩阵在D3D中的定义如下:
typedef struct _D3DMATRIX
{
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;
这是一个4*4的矩阵,通过矩阵变换能实现对象的各种处理。关于矩阵的知识,请大家下去看线形代数的书,这里就不详细介绍了。什么?你没有学过线形代数,没关系,死记吧,把几个重要的变换公式记住就好了(平移、放缩和旋转),其他任何复杂的变换都是通过这几个基本的变换组合而成的。
再给大家吃个宽心丸吧,就算你记不住这些公式也无所谓,D3D已经把他们做好了,通过几个简单的函数调用就能实现麻烦的矩阵运算了,呵呵,微软还是为大家想的很周到的。
灯光(light):
有了对象,还必须有灯光,否则我们将什么都看不到。D3D中的灯光有两4种:
环境光:对场景中所有的对象都提供了固定不变的照明。
点光源:是从一个点发出的光。灯泡就可以理解为点光源。
聚光源:正如它的的名字一样,是有方向和强弱的,电筒就是典型的聚光源。
方向光:常用于模拟太阳光和其它无穷远的光源。这种光源被看作来自无穷远,它的强度不随着接近对象而变化。在唯一的方向上,亮度是固定的。 D3D光源定义是这样的:
typedef struct _D3DLIGHT8
{
D3DLIGHTTYPE Type; // 光源类型,有点光、聚光、方向光3种
D3DCOLORVALUE Diffuse; // 漫反射颜色
D3DCOLORVALUE Specular; // 镜面反射颜色
D3DCOLORVALUE Ambient; // 环境光颜色
D3DVECTOR Position; // 光源位置
D3DVECTOR Direction; // 方向(仅对方向光和聚光起作用)
float Range; // 光的范围,也就是能照多远
float Falloff; // 聚光内外光圈的强度衰减
float Attenuation0; // 距离衰减0
float Attenuation1; // 距离衰减1
float Attenuation2; // 距离衰减2
float Theta; // 指定聚光内圈的夹角大小(0-Phi)
float Phi; // 指定聚光外圈的夹角大小(0-pi)
} D3DLIGHT8;
摄像机(camera):
为了能看见对象,D3D定义了摄像机来代表用户观察3D世界。摄像机有一个位置和一个方向,它们定义了观察者在3D世界的何处和看到的是什么。在3D世界里移动摄像机和改变它的方向使我们看到的世界真实的动起来。
在D3D中没有专门定义摄象机的结构,我们是通过设置一个观察矩阵来控制摄象机的。
pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView ); // m_matView就是摄象机的观察矩阵。
今天讲了不少概念性的东西,我想你们也看的烦了,再说下去估计就该换到其他网站去了。好了,今天就到这里吧。晚上我还要去书店看书,骑车要很远的路,天气又热,真烦啊~~
下一次我们就开始实际动手,打造你的第一个D3D程序。