图形学D图形渲染实验报告.docx
《图形学D图形渲染实验报告.docx》由会员分享,可在线阅读,更多相关《图形学D图形渲染实验报告.docx(13页珍藏版)》请在冰点文库上搜索。
图形学D图形渲染实验报告
图形学3D图形渲染实验报告
功能:
实现母线为Bezier曲线的旋转集合体,两个光源,基于扫描线z缓冲算法的3D图形渲染。
程序结构:
Csrgp类:
srgp类为一个二维光栅软件包,实现了基本的二维图形的绘制能力(点,直线,圆,多边形,扫描转换多边形)并实现了双缓冲技术(内存缓冲技术)。
在此基础上,添加了扫描线z缓冲算法的三维集合体的渲染。
Csrgp类声明如下:
public:
HDCm_hdc;
DWORDm_iColor;
POINTm_Oring;
HDCm_memHdc;
double**Z_Buf;
boolm_onMemery;
intm_Umin,m_Vmin,m_Eu,m_Ev;//设备坐标系视区
doublem_VCUmin,m_VCUmax,m_VCVmin,m_VCVmax;//观察坐标系uv平面窗口
doublem_Fdistance,m_Bdistance;//前后裁减面,在观察坐标系中指定
Vector3dm_VRP;//观察参考点
Vector3dm_VPN;//观察坐标系法向
Vector3dm_VUP;//观察正向
Vector3dm_PRP;//投影参考点,在观察坐标系中指定
Vector3dm_VrcU,m_VrcV,m_VrcN;//观察坐标系
intwidth;
inthigh;
doublem_Xmin,m_Ymin,m_Ex,m_Ey,m_a;//0-2//设备坐标系视区
Vector3dm_MatrixWindows2Device[3];
Vector4dm_MatrixWorldCoord2VRC[4];
Vector4dm_Npar[4];//平行投影视见体规范化变换
Vector4dm_Nper[4];//透视投影视见体规范化变换
Vector4dm_Npar2per[4];//透视投影到平行投影视见体
Vector4dm_FinalMatrix[4];//最终投影变换矩阵
Vector4dm_MatrixLocal2WorldCoord[4];//局部坐标系到世界坐标系变换
boolm_FinalMatrixInvalidly;
//////////////////////////////////
Vector3dL1,L2;//两个点光源位置,世界坐标系中
Vector3dIa;//环境光强
Vector3dI1;//点光源1强度
Vector3dI2;//点光源强度
doubleIc;//亮度控制
doubleC0,C1,C2;//衰减控制
doublem_maxI;//最大光强度
//////////////////////////
//Operations
public:
voidPutPixel(intx,inty);
voidPutPixel(intx,inty,DWORDcolor);
voidDrawOnMemery(boolonMemery=true);
voidLineCoord(intx0,inty0,intx1,inty1);
voidCirclePoints(intx,inty,intoffsetX,intoffsetY);
voidCircleCoord(intoffsetX,intoffsetY,intradius);
DWORDGetColor();
voidSetColor(DWORDcolor);
voidDraw();
voidFillPolygon(constCPolygon&);
voidLineCoord3D(Vector3d,Vector3d);
voidDisplayParametricPolynomialCurve(Vector3dPG[],doubleM[MAX][MAX],intn,intcount);
voidDisplayCubicHemiteCurve(Vector3dP[2],Vector3dPR[2],intcount);
voidDisplayBezierCurve(Vector3dP[],intn,doubleDELTA);
voidWindows2Device(Vector3dP);
voidWorldCoord2VRC(Vector3dP);
voidSetDeviceViewArea(intUmin,intVmin,intEu,intEv);
voidSetWindow(doubleXmin,doubleYmin,doubleEx,doubleEy,doublea);
voidSetVRC(Vector3dVRP,Vector3dVPN,Vector3dVUP);
voidSetVRP(Vector3dVRP);
voidSetVPN(Vector3dVPN);
voidSetVUP(Vector3dVUP);
voidSetViewCoordCwindow(doubleumin,doubleumax,doublevmin,doublevmax);
voidSetCutPlane(doubleF,doublePB);
voidSetPRP(Vector3dPRP);
voidTransform(Vector3dP,Vector4dMatrix[]);
voidStandardizeParallelProjectObject(Vector3dP);
voidStandardizePerspectiveProjectObject(Vector3dP);
voidStandardizePerspective2ParallelProjectObject(Vector3dP);
voidParallelProject(Vector3dP);
voidDrawEdge(CEdge&p);
voidClean();
voidCaculateFinalMatrix(CSolid&s);
voidDivideBezierCurve(std:
:
vector:
pair>&ret,Vector3dP[],intn,doubleDELTA);
voidRomance(CSolid&solid);
voidInitializeBackGround();
voidInitializeZBuf();
#ifdef_DEBUG
voidCSrgp:
:
trace(CSolid&solid,
std:
:
vector&polygonSt,
std:
:
vector&edgeSt,
std:
:
listPolygonTable[SCANLINE]);
#endif
private:
voidCreatET(constCPolygon&);
intGetInt(double);//取整规则
voidCalculateV(doubleC[3][MAX],intn,doublet,Vector3dnewV);
voidBezierCurveSplitting(Vector3dP[],Vector3dQ[],Vector3dPR[],intn);
doubleDistance(Vector3dP[],intn);
voidCaculateMatrix3d(Vector3dp[],Vector3dQ[]);
voidCaculateMatrix4d(Vector4dp[],Vector4dQ[]);
voidCrossMultiply3d(Vector3dP,Vector3dQ);
voidCaculateVRC();
voidCaculateMatrixWindows2Device();
voidCaculateMatrixWorldCoord2VRC();
voidCaculateNpar();//计算平行投影视见体规范化变换
voidCaculateNper();//计算透视投影视见体规范化变换
voidCreatPt(CSolid&solid,
std:
:
vector&polygonSt,
std:
:
vector&edgeSt,
std:
:
listPolygonTable[SCANLINE]);
doubleAttenuate(doubledistance);//光线衰减系数
public:
virtual~CSrgp();
CSolid类:
CSolid类实现了三维实体的边界表示法,能够将母线为Bezier曲线的旋转几何体由特征表示转换为边界表示,并配合CSrgp类实现3D实体的渲染。
CSolid类声明:
public:
intID;//体ID
CSrgp*srgp;
std:
:
dequevertex;//体的所有顶点
std:
:
vectoredge;
std:
:
vectorface;//体包含的面
Vector3dlocation[4];//局部坐标系在世界坐标系中的定位
intcountV,countE,countF;
//光照
doubleKa;//环境光反射系数
doubleKd;//漫反射系数
doubleKs;//镜面反射系数
intn;//镜面反射指数
Vector3dCd;//满反射系数颜色分解(Cd[R],Cd[G],Cd[B])
Vector3dCs;//镜面反射系数颜色分解(Cs[R],Cs[G],Cs[B])
voidsetLocation(Vector3dl[]);
public:
#ifdef_DEBUG
voiddump();
#endif
CSolid(intid,CSrgp*s);
CSolid(constCSolid&c);
CSolid&operator=(constCSolid&c);
CFace&InsertFace(intQ[],intn,boolisedge=1);
CEdge&InsertEdge(CVertex&P,CVertex&Q);
CVertex&InsertVertex(Vector3dP);
voidDraw();
intDivideCircularity(Vector3dM);
voidCreatRotateGeometry(Vector3dM[],intn);
voidCreatBezierRotateGeometry(Vector3dP[],intn,doubleDELTA);
voidRomance();
3D实体的边界表示:
数据结构:
体结构CSolid
面结构CFace
边结构CEdge
顶点结构CVertex
3D实体线框图效果
图表1两个实体线框图正面效果
图表2两个实体线框图侧面效果
3D实体的渲染:
基本原理:
采用扫描线z缓冲技术,应用Gouraud插值着色方法渲染。
数据机构:
多边形结构:
structPolygonStruct{
Vector4dfeq;//世界坐标系方程
intsort;
intVmax;//
intid;
std:
:
vectoredge;//所有边
std:
:
vectorET[SCANLINE];
};
边结构:
structEdgeStruct{
intVmax;
doubledeltaU;
doublen;
intu;
intsort;//类别
boolhorizon;
std:
:
vectorface;//所属面
Vector3dstart;
Vector3dend;
Vector3dsColor;
Vector3deColor;
intstartID;
intendID;
};
边对结构:
structPairEdge{
public:
PairEdge(EdgeStruct&,EdgeStruct&,PolygonStruct&,int);
doubleUl;
doubledeltaUl;
intVlmax;
doubleUr;
doubledeltaUr;
intVrmax;
doubleNl;
doubledeltaNu;
doubledeltaNv;
intPi;
Vector3dIl;
Vector3dIr;
Vector3ddeltaIl;
Vector3ddeltaIr;
};
多边形分类表:
std:
:
listPolygonTable[SCANLINE];
活化多边形表
std:
:
listActivePolyList;//活化多边形表
/活化边对表
std:
:
listActivePairEdgeList;//活化边对表
算法:
扫描线z缓冲算法
颜色模型:
RGB颜色模型
渲染效果:
图表3两个实体的正面渲染效果(两个光源,分别位于坐上方和右上方)
图表4两个实体的侧面渲染效果(光源同上)
交互设计:
通过鼠标点击按钮改变观察点,观察原点,观察法向和观察窗口值。
设计可改变物体位置,但鉴于渲染效率低,没添加此功能。
(预留并实现了该函数,但是交互界面禁用了此功能)
图表5程序界面
缺陷:
由于程序开始设计较早,所以没能从整体把握程序的结构,在实体表示时数据结构的设计给后面的渲染带来了一定难度。
优点:
将造型和渲染分开的设计叫好的实现和功能的分割,是程序实现更加容易。
程序设计时考虑了交互的情况,所以在任何导致图形改变的参数被改变时,都能够容易的重绘图形,这是设计上的优点。
注:
本程序在VC++6.0SP6 下调试通过。
若使用较低版本的编译器可能导致STL与MFC冲突。
权利:
作者授权中国人民大学信息学院将本程序及源代码用于教学。
作者:
中国人民大学信息学院
王占伟
July13,2007