D3D基本概念

来源:互联网 发布:苹果mac办公软件 编辑:程序博客网 时间:2024/06/11 02:33

用过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程序。