图形学D图形渲染实验报告.docx

上传人:b****1 文档编号:15083504 上传时间:2023-06-30 格式:DOCX 页数:13 大小:147.43KB
下载 相关 举报
图形学D图形渲染实验报告.docx_第1页
第1页 / 共13页
图形学D图形渲染实验报告.docx_第2页
第2页 / 共13页
图形学D图形渲染实验报告.docx_第3页
第3页 / 共13页
图形学D图形渲染实验报告.docx_第4页
第4页 / 共13页
图形学D图形渲染实验报告.docx_第5页
第5页 / 共13页
图形学D图形渲染实验报告.docx_第6页
第6页 / 共13页
图形学D图形渲染实验报告.docx_第7页
第7页 / 共13页
图形学D图形渲染实验报告.docx_第8页
第8页 / 共13页
图形学D图形渲染实验报告.docx_第9页
第9页 / 共13页
图形学D图形渲染实验报告.docx_第10页
第10页 / 共13页
图形学D图形渲染实验报告.docx_第11页
第11页 / 共13页
图形学D图形渲染实验报告.docx_第12页
第12页 / 共13页
图形学D图形渲染实验报告.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

图形学D图形渲染实验报告.docx

《图形学D图形渲染实验报告.docx》由会员分享,可在线阅读,更多相关《图形学D图形渲染实验报告.docx(13页珍藏版)》请在冰点文库上搜索。

图形学D图形渲染实验报告.docx

图形学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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2