课程设计报告
题 目: 建筑效果
系 科: 管理信息系
专 业: 计算机多媒体应用技术
班 级: 多媒3091
组 名: 3组
时 间: 2011年6月
报告成绩: 作品成绩:
指导教师: 朱云峰
制作过程
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得到最后的图为;
功能:
实现母线为Bezier曲线的旋转集合体,两个光源,基于扫描线z缓冲算法的3D图形渲染。
Csrgp类:
srgp类为一个二维光栅软件包,实现了基本的二维图形的绘制能力(点,直线,圆,多边形,扫描转换多边形)并实现了双缓冲技术(内存缓冲技术)。在此基础上,添加了扫描线z缓冲算法的三维集合体的渲染。
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类实现了三维实体的边界表示法,能够将母线为Bezier曲线的旋转几何体由特征表示转换为边界表示,并配合CSrgp类实现3D实体的渲染。
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
实验名称:粉体真密度的测定粉体真密度是粉体质量与其真体积之比值,其真体积不包括存在于粉体颗粒内部的封闭空洞。所以,测定粉体的真密度…
研究生实验报告范本实验课程实验名称实验地点学生姓名学号指导教师范本实验时间年月日一实验目的熟悉电阻型气体传感器结构及工作原理进行基…
实验报告课程名称物证技术学实验项目名称捺印手印样本指纹显现提取班级与班级代码074213070853实验室名称或课室法学实验教学中…
滁州市政府组织退耕还林(黑体,小二,1.5倍行距,段前段后0.5行)——5060451007范雪花(学号,TimesNewRoma…
科学实验报告单1科学实验报告单2科学实验报告单3科学实验报告单4九完小科学实验报告单10九完小科学实验报告单11九完小科学实验报告…
姓名:学号:指导教师:20xx年x月x日一、技术介绍3D打印是一种通过材料逐层添加制造三维物体的变革性、数字化增材制造技术,它将信…
汇编语言实验报告第六章磁盘文件存取实验设计性实验班级05611102姓名肖枫学号1120xx1431实验日期20xx914下午第六…
3DMAX设计报告设计题目办公室专业计算机科学与技术班级BU计算机091姓名金晓兰学号0911503106指导教师唐拥政完成时间2…
河南城建学院3dsMax课程设计实习报告设计题目写字楼漫游动画系别工商管理系专业市场营销指导老师田慧薛冰同组人员浮依史鑫麻迎花苗小…
厦门城市职业学院实践报告评审表1本表按专业班级填报由学部自行汇总存档备查厦门城市职业学院实践报告实践类型实验实训学部工程学部二09…