3D游戏从头编--第二回:3D基本概念
2010-09-07 17:24
232 查看
::金点时空:: |
第二回:3D基本概念 上一回我们建立起了D3D的编程环境,但是不要着急开始编码,我们还是先来看看3D中的一些基本概念,这些东西都是3D编程基础中的基础,一定要牢记。 用过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程序。 主页:http://www.gpgame.com 邮件:softboy@sina.com soft于2002-7-7午后 返回 金点时空 2000/7/7 |
www.gpgame.net |
相关文章推荐
- HOOPS 3D可视化入门教程三:基本概念和数据结构
- Direct3D 开发之旅 3D 游戏基本概念的介绍2
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- 3D图形学基本概念澄清
- 3D基本概念答疑(1)
- [Axiom 3D]2.Axiom 基本概念
- [3D] 基本概念
- Direct3D 开发之旅 3D 游戏基本概念的介绍1
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- OpenGL学习笔记(5)3D基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- 3D游戏基础 Direct3D(一) D3D基本概念及渲染流水线简介
- 从头学习Drupal--基本概念一
- android 3D系列之基本概念篇
- adnroid 3D 系列之基本概念篇
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程 03 <3D绘图基本概念>
- 3D图形学基本概念澄清
- 三维声场(虚拟3D音频)学习总结(1):基本概念