3D实验报告1

课程设计报告

    目:             

    科:             

    业:  计算机多媒体应用技术     

    级:        多媒3091            

    名:        3             

    间:       20116           

报告成绩:           作品成绩:       

指导教师:       朱云峰                     


制作过程

1:制作房子的步骤

一、         制作房子

1、  在创建命令面板上单击[几何体]按钮,在类型卷展栏中单击[长方体]按钮,并在顶视图创建一个长方体,为了在后期修改中能使模型更平滑一些,需要提高其宽度分段和高度分段。如图所示

2、  切换到修改命令面板,展开参数卷展栏,将[长度]和[宽度]都设置为3000,将[长度分段]和[宽度分段]都设置为32。

3、  按M键打开材质编辑器,在示例窗口中选择一个空白的示例球.

4、  选择贴图,设置[漫反射]为100,设置UV,[平铺]U=10,V=10如图所示

5、  将几何体改成[复合对象],利用布尔拾取对象,得到想要的一个形状

6、  再将几何体改成[标准基本体],再画一个长方体,将长和宽高分段都设置为10,10 ,10,再利用[晶格]把长方体变为窗体的样式。如图

7、做到这里,我们差不多所用的都画好了,剩下的就是我们调整一下方位和组合,

最后的组合如图:

8、在做这个场景的最后就是还有个像楼梯的样式,最后通过【几何体】画一个小的长方体,再通过菜单栏里面的【工具】中的【阵列】调试Y=10移动Y=100得到最后的图为;

 

第二篇:图形学3D图形渲染实验报告

图形学3D图形渲染实验报告

功能:

实现母线为Bezier曲线的旋转集合体,两个光源,基于扫描线z缓冲算法的3D图形渲染。

程序结构:

Csrgp类:

srgp类为一个二维光栅软件包,实现了基本的二维图形的绘制能力(点,直线,圆,多边形,扫描转换多边形)并实现了双缓冲技术(内存缓冲技术)。在此基础上,添加了扫描线z缓冲算法的三维集合体的渲染。

Csrgp类声明如下:

public:

       HDC m_hdc;

       DWORD m_iColor;

       POINT m_Oring;

       HDC m_memHdc;

       double **Z_Buf;

       bool m_onMemery;

       int m_Umin, m_Vmin, m_Eu, m_Ev;//设备坐标系视区

       double m_VCUmin, m_VCUmax, m_VCVmin, m_VCVmax;//观察坐标系uv平面窗口

       double m_Fdistance, m_Bdistance;//前后裁减面,在观察坐标系中指定

       Vector3d m_VRP;//观察参考点

       Vector3d m_VPN;//观察坐标系法向

       Vector3d m_VUP;//观察正向

       Vector3d m_PRP;//投影参考点,在观察坐标系中指定

       Vector3d m_VrcU, m_VrcV, m_VrcN;//观察坐标系

       int width ;

       int high ;

      

       double m_Xmin, m_Ymin, m_Ex, m_Ey, m_a;//0-2//设备坐标系视区

       Vector3d m_MatrixWindows2Device[3];

       Vector4d m_MatrixWorldCoord2VRC[4];

       Vector4d m_Npar[4];//平行投影视见体规范化变换

       Vector4d m_Nper[4];//透视投影视见体规范化变换

       Vector4d m_Npar2per[4];//透视投影到平行投影视见体

       Vector4d m_FinalMatrix[4];//最终投影变换矩阵

       Vector4d m_MatrixLocal2WorldCoord[4];//局部坐标系到世界坐标系变换

       bool m_FinalMatrixInvalidly;

       //////////////////////////////////

       Vector3d L1, L2;//两个点光源位置,世界坐标系中

       Vector3d Ia;//环境光强

       Vector3d I1;//点光源1强度

       Vector3d I2;//点光源强度

       double     Ic;//亮度控制

       double C0, C1, C2;//衰减控制

       double   m_maxI;//最大光强度

       //////////////////////////

// Operations

public:

       void PutPixel(int x, int y);

       void PutPixel(int x, int y, DWORD color);

       void DrawOnMemery(bool onMemery = true);

       void LineCoord(int x0, int y0, int x1, int y1);

       void CirclePoints(int x, int y, int offsetX, int offsetY);

       void CircleCoord(int offsetX, int offsetY, int radius);

       DWORD GetColor();

       void SetColor(DWORD color);

       void Draw ();

       void FillPolygon(const CPolygon &);

       void LineCoord3D(Vector3d, Vector3d);

       void DisplayParametricPolynomialCurve(Vector3d PG[],double M[MAX][MAX], int n, int count);

       void DisplayCubicHemiteCurve(Vector3d P[2], Vector3d PR[2], int count);

       void DisplayBezierCurve(Vector3d P[], int n, double DELTA);

      

       void Windows2Device(Vector3d P);

       void WorldCoord2VRC(Vector3d P);

       void SetDeviceViewArea(int Umin, int Vmin, int Eu, int Ev);

       void SetWindow(double Xmin, double Ymin, double Ex, double Ey, double a);

       void SetVRC(Vector3d VRP, Vector3d VPN,       Vector3d VUP);

       void SetVRP(Vector3d VRP);

       void SetVPN(Vector3d VPN);

       void SetVUP(Vector3d VUP);

       void SetViewCoordCwindow(double umin,double umax,double vmin,double vmax);

       void SetCutPlane(double F,double PB);

       void SetPRP(Vector3d PRP);

       void Transform(Vector3d P, Vector4d Matrix[]);

       void StandardizeParallelProjectObject(Vector3d P);

       void StandardizePerspectiveProjectObject(Vector3d P);

       void StandardizePerspective2ParallelProjectObject(Vector3d P);

       void ParallelProject(Vector3d P);

       void DrawEdge(CEdge& p);

       void Clean();

       void CaculateFinalMatrix(CSolid& s);

       void DivideBezierCurve(std::vector<std::pair<double, double> >& ret,Vector3d P[], int n, double DELTA);

       void Romance(CSolid & solid);

       void InitializeBackGround();

       void InitializeZBuf();

#ifdef _DEBUG

       void CSrgp::trace(CSolid & solid,

                                   std::vector <PolygonStruct>& polygonSt,

                                   std::vector <EdgeStruct>& edgeSt,

                                   std::list <PolygonStruct *> PolygonTable[SCANLINE]);

#endif

private:

       void CreatET (const CPolygon &);

       int GetInt(double);//取整规则

       void CalculateV(double C[3][MAX], int n, double t, Vector3d newV);

       void BezierCurveSplitting(Vector3d P[], Vector3d Q[], Vector3d PR[], int n);

       double Distance(Vector3d P[], int n);

       void CaculateMatrix3d(Vector3d p[], Vector3d Q[]);

       void CaculateMatrix4d(Vector4d p[], Vector4d Q[]);

       void CrossMultiply3d(Vector3d P, Vector3d Q);

       void CaculateVRC();

       void CaculateMatrixWindows2Device();

       void CaculateMatrixWorldCoord2VRC();

       void CaculateNpar();//计算平行投影视见体规范化变换

       void CaculateNper();//计算透视投影视见体规范化变换

       void CreatPt(CSolid & solid,

                                   std::vector <PolygonStruct>& polygonSt,

                                   std::vector <EdgeStruct>& edgeSt,

                                   std::list <PolygonStruct *> PolygonTable[SCANLINE]);

       double Attenuate(double distance);//光线衰减系数

public:

       virtual ~CSrgp();

CSolid类:

CSolid类实现了三维实体的边界表示法,能够将母线为Bezier曲线的旋转几何体由特征表示转换为边界表示,并配合CSrgp类实现3D实体的渲染。

CSolid类声明:

public:

       int ID;            //体ID

       CSrgp * srgp;

       std::deque<CVertex> vertex;//体的所有顶点

       std::vector<CEdge>       edge;

       std::vector<CFace> face; //体包含的面

       Vector3d location[4];//局部坐标系在世界坐标系中的定位

       int countV, countE, countF;

       //光照

       double Ka;      //环境光反射系数

       double Kd;     //漫反射系数

       double Ks;      //镜面反射系数

       int          n;    //镜面反射指数

       Vector3d Cd;//满反射系数颜色分解(Cd[R],Cd[G],Cd[B])

       Vector3d Cs;//镜面反射系数颜色分解(Cs[R],Cs[G],Cs[B])

       void setLocation(Vector3d l[]);

public:

#ifdef _DEBUG

       void dump();

#endif

       CSolid(int id, CSrgp* s);

       CSolid(const CSolid& c);

       CSolid& operator = (const CSolid& c);

       CFace& InsertFace (int Q[],int n, bool isedge=1);

       CEdge& InsertEdge (CVertex& P, CVertex& Q);

       CVertex& InsertVertex (Vector3d P);

       void Draw();

       int DivideCircularity(Vector3d M);

       void CreatRotateGeometry(Vector3d M[], int n);

       void CreatBezierRotateGeometry(Vector3d P[], int n, double DELTA);

       void Romance();

3D实体的边界表示:

数据结构:

体结构CSolid

面结构CFace

边结构CEdge

顶点结构CVertex

3D实体线框图效果

图表 1 两个实体线框图正面效果

图表 2 两个实体线框图侧面效果

3D实体的渲染:

基本原理:

采用扫描线z缓冲技术,应用Gouraud插值着色方法渲染。

数据机构:

多边形结构:

struct PolygonStruct{

       Vector4d  feq;  //世界坐标系方程

       int                 sort;

       int                 Vmax;     //

       int                 id;

       std::vector <int>edge;    //所有边

       std::vector<EdgeStruct *> ET[SCANLINE];

};

边结构:

struct EdgeStruct{

       int                 Vmax;

       double            deltaU;

       double            n;

       int                 u;

       int                 sort; //类别

       bool        horizon;

       std::vector<int> face;     //所属面

       Vector3d  start;

       Vector3d  end;

       Vector3d  sColor;

       Vector3d  eColor;

       int                 startID;

       int                 endID;

};

边对结构:

struct PairEdge{

public:

       PairEdge(EdgeStruct&,EdgeStruct&,PolygonStruct&,int);

       double Ul;

       double deltaUl;

       int Vlmax;

       double Ur;

       double deltaUr;

       int Vrmax;

       double Nl;

       double deltaNu;

       double deltaNv;

       int Pi;

       Vector3d Il;

       Vector3d Ir;

       Vector3d deltaIl;

       Vector3d deltaIr;

};

多边形分类表:

std::list <PolygonStruct *> PolygonTable[SCANLINE];

活化多边形表

std::list <PolygonStruct *> ActivePolyList;//活化多边形表

/活化边对表

std::list <PairEdge > ActivePairEdgeList;//活化边对表

算法:

扫描线z缓冲算法

颜色模型:

RGB颜色模型

渲染效果:

图表 3两个实体的正面渲染效果(两个光源,分别位于坐上方和右上方)

图表 4两个实体的侧面渲染效果 (光源同上)

交互设计:

通过鼠标点击按钮改变观察点,观察原点,观察法向和观察窗口值。设计可改变物体位置,但鉴于渲染效率低,没添加此功能。(预留并实现了该函数,但是交互界面禁用了此功能)

图表 5程序界面

缺陷:

由于程序开始设计较早,所以没能从整体把握程序的结构,在实体表示时数据结构的设计给后面的渲染带来了一定难度。

优点:

将造型和渲染分开的设计叫好的实现和功能的分割,是程序实现更加容易。程序设计时考虑了交互的情况,所以在任何导致图形改变的参数被改变时,都能够容易的重绘图形,这是设计上的优点。

注:

本程序在VC++6.0  SP6 下调试通过。若使用较低版本的编译器可能导致STL与MFC冲突。

权利:

作者授权中国人民大学信息学院将本程序及源代码用于教学。

作者:

中国人民大学信息学院

王占伟

July 13, 2007

相关推荐