第9章课后习题参考答案

上传人:沈*** 文档编号:157367593 上传时间:2022-09-29 格式:DOC 页数:167 大小:585.50KB
收藏 版权申诉 举报 下载
第9章课后习题参考答案_第1页
第1页 / 共167页
第9章课后习题参考答案_第2页
第2页 / 共167页
第9章课后习题参考答案_第3页
第3页 / 共167页
资源描述:

《第9章课后习题参考答案》由会员分享,可在线阅读,更多相关《第9章课后习题参考答案(167页珍藏版)》请在装配图网上搜索。

1、第九章 习题参考答案1基于Turbo C环境进行动画编程可以采用哪些方法?(1)全局画擦画:cleardevice( )(2)局部画擦画:getimage( ) putimage( )(3)页切换:setactivepage( ) setvisualpage( )(4)延时: delay( )(5)函数式(6)图形变换2简要说说你对OpenGL及OGRE的认识?(1)GL是美国SGI公司为图形工作站开发的一种功能强大的三维图形机制,经过长期发展,在跨平台移植的过程中,由GL扩充形成了OpenGL,目前,它已经成为高性能图形和交互式视景处理的工业标准。有了OpenGL的帮助,编程者可以轻松地进行

2、三维动画的程序设计。OpenGL提供的相关库有:1)OpenGL核心库(GL)2)OpenGL实用库(GLU)3)OpenGL辅助库(GLAUX)4)OpenGL工具库(GLUT)5)OpenGL对窗口系统的扩展(WGL,等等)对于各个库,函数功能可分为两大类:渲染功能,提供图形绘制所需的各种功能函数;窗口管理功能,管理窗口系统的所有相关功能,如键盘鼠标的响应,各种窗口事件等等。(2)OGRE(Object-oriented Graphics Rendering Engine,面向对象的图形渲染引擎)是国际上知名的开源图形渲染引擎。OGRE是用C+开发的面向对象且使用灵活的3D引擎,它的目的是

3、让编程者能更容易开发基于3D的动画或游戏等应用程序。引擎中的类库对更底层的系统库(如OpenGL或Direct3D)的全部使用细节进行了简化封装和抽象,同时提供基于现实世界的对象接口以及其它非常有用的工具类。因此,利用OGRE引擎来进行动画编程可以提高开发的效率,并且一般情况下要比基于OpenGL的动画编程还简单些。3基于Turbo C环境编写模拟自由落体的动画。#include#include#define g 10main()int x=320,y,t; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); cleardevice()

4、; setcolor(15); do for(t=0;t10;t+) y=0.5*g*t*t; circle(x,y,20);delay(50000); cleardevice(); for(t=0;t10;t+) y=405-(90*t-0.5*g*t*t); circle(x,y,20);delay(50000); cleardevice(); while(!kbhit(); closegraph();4编写基于OpenGL图形库的Visual C+程序,内容为旋转一茶壶的三维动画。#include #include #include static float rot = 0.0f;voi

5、d init(void) glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST);void display(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0.0f, 1.5f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);glBegin(GL_QUADS);glColor3f(1.0f, 0.0f, 0.0f);glNormal

6、3f( 0.0f, 1.0f, 0.0f);glVertex3f(-2.5f, -0.75f, 2.5f);glVertex3f(2.5f, -0.75f, 2.5f);glVertex3f(2.5f, -0.75f, -2.5f);glVertex3f(-2.5f, -0.75f, -2.5f);glEnd();glRotatef(rot, 0.0f, 1.0f, 0.0f);glColor3f(1.0f, 1.0f, 1.0f);glutSolidTeapot(1.0f);rot += 0.1f;glutSwapBuffers();void reshape (int width, int

7、height)glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void keyboard(unsigned char key, int x, int y)switch (key)case 27:exit(0);break;case p:break;default:br

8、eak; int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(640, 480); glutInitWindowPosition(100, 100);glutCreateWindow(Rotate);init();glutDisplayFunc(display); glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(

9、display);glutMainLoop();return 0;5编写基于OGRE引擎的Visual C+程序,内容为一9行9列的机器人阵列。#include #include #include ExampleApplication.hclass SelectionRectangle : public ManualObjectpublic: SelectionRectangle(const String &name) : ManualObject(name) setRenderQueueGroup(RENDER_QUEUE_OVERLAY); setUseIdentityProjection

10、(true); setUseIdentityView(true); setQueryFlags(0); void setCorners(float left, float top, float right, float bottom) left = left * 2 - 1; right = right * 2 - 1; top = 1 - top * 2; bottom = 1 - bottom * 2; clear(); begin(, RenderOperation:OT_LINE_STRIP); position(left, top, -1); position(right, top,

11、 -1); position(right, bottom, -1); position(left, bottom, -1); position(left, top, -1); end(); AxisAlignedBox box; box.setInfinite(); setBoundingBox(box); void setCorners(const Vector2 &topLeft, const Vector2 &bottomRight) setCorners(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); ;class DemoLi

12、stener : public ExampleFrameListener, public OIS:MouseListenerpublic: DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager) : ExampleFrameListener(win, cam, false, true), mSceneMgr(sceneManager), mSelecting(false) mRect = new SelectionRectangle(Selection SelectionRectangle); mScen

13、eMgr-getRootSceneNode()-createChildSceneNode()-attachObject(mRect); mVolQuery = mSceneMgr-createPlaneBoundedVolumeQuery(PlaneBoundedVolumeList(); mMouse-setEventCallback(this); / DemoListener DemoListener() mSceneMgr-destroyQuery(mVolQuery); delete mRect; bool mouseMoved(const OIS:MouseEvent &arg) C

14、EGUI:System:getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel); if (mSelecting) CEGUI:MouseCursor *mouse = CEGUI:MouseCursor:getSingletonPtr(); mStop.x = mouse-getPosition().d_x / (float)arg.state.width; mStop.y = mouse-getPosition().d_y / (float)arg.state.height; mRect-setCorners(mSta

15、rt, mStop); return true; bool mousePressed(const OIS:MouseEvent &arg, OIS:MouseButtonID id) if (id = OIS:MB_Left) CEGUI:MouseCursor *mouse = CEGUI:MouseCursor:getSingletonPtr(); mStart.x = mouse-getPosition().d_x / (float)arg.state.width; mStart.y = mouse-getPosition().d_y / (float)arg.state.height;

16、 mStop = mStart; mSelecting = true; mRect-clear(); mRect-setVisible(true); return true; bool mouseReleased(const OIS:MouseEvent &arg, OIS:MouseButtonID id) if (id = OIS:MB_Left) performSelection(mStart, mStop); mSelecting = false; mRect-setVisible(false); return true; void performSelection(const Vec

17、tor2 &first, const Vector2 &second) float left = first.x, right = second.x, top = first.y, bottom = second.y; if (left right) swap(left, right); if (top bottom) swap(top, bottom); if (right - left) * (bottom - top) getCameraToViewportRay(left, top); Ray topRight = mCamera-getCameraToViewportRay(righ

18、t, top); Ray bottomLeft = mCamera-getCameraToViewportRay(left, bottom); Ray bottomRight = mCamera-getCameraToViewportRay(right, bottom); PlaneBoundedVolume vol; vol.planes.push_back(Plane(topLeft.getPoint(3), topRight.getPoint(3), bottomRight.getPoint(3); vol.planes.push_back(Plane(topLeft.getOrigin

19、(), topLeft.getPoint(100), topRight.getPoint(100); vol.planes.push_back(Plane(topLeft.getOrigin(), bottomLeft.getPoint(100), topLeft.getPoint(100); vol.planes.push_back(Plane(bottomLeft.getOrigin(), bottomRight.getPoint(100), bottomLeft.getPoint(100); vol.planes.push_back(Plane(topRight.getOrigin(),

20、 topRight.getPoint(100), bottomRight.getPoint(100); PlaneBoundedVolumeList volList; volList.push_back(vol); mVolQuery-setVolumes(volList); SceneQueryResult result = mVolQuery-execute(); deselectObjects(); SceneQueryResultMovableList:iterator itr; for (itr = result.movables.begin(); itr != result.mov

21、ables.end(); +itr) selectObject(*itr); void deselectObjects() std:list:iterator itr; for (itr = mSelected.begin(); itr != mSelected.end(); +itr) (*itr)-getParentSceneNode()-showBoundingBox(false); void selectObject(MovableObject *obj) obj-getParentSceneNode()-showBoundingBox(true); mSelected.push_ba

22、ck(obj); private: Vector2 mStart, mStop; SceneManager *mSceneMgr; PlaneBoundedVolumeListSceneQuery *mVolQuery; std:list mSelected; SelectionRectangle *mRect; bool mSelecting; static void swap(float &x, float &y) float tmp = x; x = y; y = tmp; ;class DemoApplication : public ExampleApplicationpublic:

23、 DemoApplication() : mRenderer(0), mSystem(0) DemoApplication() if (mSystem) delete mSystem; if (mRenderer) delete mRenderer; protected: CEGUI:OgreCEGUIRenderer *mRenderer; CEGUI:System *mSystem; void createScene(void) mRenderer = new CEGUI:OgreCEGUIRenderer(mWindow, Ogre:RENDER_QUEUE_OVERLAY, false

24、, 3000, mSceneMgr); mSystem = new CEGUI:System(mRenderer); CEGUI:SchemeManager:getSingleton().loadScheme(CEGUI:utf8*)TaharezLookSkin.scheme); CEGUI:MouseCursor:getSingleton().setImage(CEGUI:utf8*)TaharezLook, (CEGUI:utf8*)MouseArrow); mCamera-setPosition(-60, 100, -60); mCamera-lookAt(60, 0, 60); mS

25、ceneMgr-setAmbientLight(ColourValue:White); for (int i = 0; i 9; +i) for (int j = 0; j createEntity(Robot + StringConverter:toString(i + j * 10), robot.mesh); SceneNode *node = mSceneMgr-getRootSceneNode()-createChildSceneNode(Vector3(i * 15, 0, j * 15); node-attachObject(ent); node-setScale(0.2, 0.

26、2, 0.2); void createFrameListener(void) mFrameListener = new DemoListener(mWindow, mCamera, mSceneMgr); mFrameListener-showDebugOverlay(true); mRoot-addFrameListener(mFrameListener); ;#if OGRE_PLATFORM = OGRE_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include windows.hINT WINAPI WinMain(HINSTANCE hIn

27、st, HINSTANCE, LPSTR strCmdLine, INT)#elseint main(int argc, char *argv)#endif / Create application object DemoApplication app; try app.go(); catch(Exception& e) #if OGRE_PLATFORM = OGRE_PLATFORM_WIN32 MessageBoxA(NULL, e.getFullDescription().c_str(), An exception has occurred!, MB_OK | MB_ICONERROR

28、 | MB_TASKMODAL);#else fprintf(stderr, An exception has occurred: %sn, e.getFullDescription().c_str();#endif return 0;6利用3D Max软件制作模拟神州飞船返回地面的三维动画。(略)7简述基于编程实现的动画与基于软件制作的动画的异同点。编程实现方式:灵活,可以随心所欲进行动画创作,但要求较高,需要大量编程;软件制作方式:方便,可以快速生成动画,但受限于所采用软件的功能强弱,仅需少量脚本;事实上,很难说哪一种方式更好,主要看需求,若软件制作方式能够完成的,且采购正版软件的费用在用

29、户的承受范围之内,那不妨采用软件制作方式,而当软件制作方式不能实现所需要的功能和效果时,那就必须进行手工编程了。通常大些的动画作品往往采用两者结合的方式来开发。8编程实现卫星1、卫星2以及地球三个球体在空间中的运动旋转三维动画,环境不限。/*三个球体在空间中的运动旋转三维动画 */#include #include #include #include #include #include #include #include #include #include #define ESC 27 #define F 80 /*此数表示通常情况下操作者离电脑的距离(80厘米)*/ #define HIGH

30、T 480 /*屏幕纵向分辩率 */ #define WIDE 640 /*屏幕横向分辨率 */ #define PAI 3.1415926 /*圆周率*/ #define TIME 0.2 /*转动间隔时间(每0.2秒转动5度)*/ typedef struct float x; float y; _2D ; /*二维坐标点*/ typedef struct float x; float y; float z; _3D; /*三维坐标点*/ typedef struct int anglex; int angley; int anglez; Axle; /*轴向量(angle x,y,z分别

31、表示向量与x,y,z轴的夹角)*/ typedef struct /*纬度圈由赤道加上南北半球的各四个纬度圈共9个纬度圈组成,经度等分成10个圈*/ /*所以用 二维数组g910来记录经纬度交点*/ _3D *g910; /* temp910用来记录g910各点从三维变换到二维时的坐标 */ _2D *temp910; _3D *center; /*自转中心坐标,即球心坐标*/ _3D *round_center; /*公转中心坐标*/ float r; /*球体半径*/ Globe; /*球体*/ float Observe_Mat44,World_Mat44; /*观察坐标矩阵 与世界坐标

32、矩阵 */ float Sin360,Cos360; /*存放三角函数值的两个数组,可以减少大量的浮点运算,以提高效率*/ size_t Size2D,Size3D,Sizeaxle,Sizeglobe;/*各结构体的尺寸*/ _3D *Observe; /*观察者所在的位置坐标 */ Globe *Moon1,*Moon2,*Earth; /*卫星1,卫星2,地球 三个球体 */ int Zangle=5; /*转动角速度*/ /*建立三角函数表*/ void create_table() int i; for(i=0;ix=160; Observe-y=0; Observe-z=0; /*

33、把单位矩阵赋值给目标矩阵*/ void to_EMat(float mat44) int i,j; for(i=0;i4;i+) for(j=0;j4;j+) matij=0; for(i=0;ix=point2-x; point1-y=point2-y; point1-z=point2-z; /*把二维坐标点1的值赋给点2*/ void _2D_cpy(_2D *point1,_2D *point2) point1-x=point2-x; point1-y=point2-y; /*初始化各结构体的尺寸*/ void init_size() Size2D=sizeof(_2D); Size3D

34、=sizeof(_3D); Sizeaxle=sizeof(Axle); Sizeglobe=sizeof(Globe); /*初始化观察坐标矩阵与世界坐标矩阵(设定为单位矩阵)*/ void init_Mat() int i,j; for(i=0;i4;i+) for(j=0;j4;j+) Observe_Matij=0; World_Matij=0; for(i=0;i4;i+) Observe_Matii=1; World_Matii=1; /*矩阵1乘矩阵2得到矩阵3*/ void mat_mult(float mat144,float mat244,float mat344) int

35、 i,j; for(i=0; i4; i+) for(j=0; j4; j+) mat3ij=mat1i0*mat20j+mat1i1*mat21j+mat1i2*mat22j+mat1i3*mat23j; /*复制矩阵2到矩阵1*/ void mat_cpy(float mat144,float mat244) int i,j; for(i=0;i=3;i+) for(j=0;jx,2)+pow(Observe-y,2),0.5); _3Dr=pow(pow(Observe-x,2)+pow(Observe-y,2)+pow(Observe-z,2),0.5); Observe_Mat00=

36、Observe-y/_2Dr*-1; Observe_Mat01=Observe-x*Observe-z/_2Dr/_3Dr*-1; Observe_Mat02=Observe-x/_3Dr*-1; Observe_Mat10=Observe-x/_2Dr; Observe_Mat11=Observe-y*Observe-z/_2Dr/_3Dr*-1; Observe_Mat12=Observe-y/_3Dr*-1; Observe_Mat21=_2Dr/_3Dr; Observe_Mat22=Observe-z/_3Dr*-1; Observe_Mat32=_3Dr; Observe_Mat

37、33=1; /*三维坐标点对指定矩阵变换以得到新的三维坐标*/ void _3D_mult_mat(_3D *Source,float mat44) _3D *temp; temp=(_3D *)malloc(Size3D); temp-x=Source-x*mat00+Source-y*mat10+Source-z*mat20+mat30; temp-y=Source-x*mat01+Source-y*mat11+Source-z*mat21+mat31; temp-z=Source-x*mat02+Source-y*mat12+Source-z*mat22+mat32; _3D_cpy(S

38、ource,temp); /*把三维坐标点从世界坐标变换成观察坐标*/ void world_to_ob(_3D *point1,_3D *point2) point2-x=point1-x*Observe_Mat00+point1-y*Observe_Mat10+ point1-z*Observe_Mat20+Observe_Mat30; point2-y=point1-x*Observe_Mat01+point1-y*Observe_Mat11+ point1-z*Observe_Mat21+Observe_Mat31; point2-z=point1-x*Observe_Mat02+po

39、int1-y*Observe_Mat12+ point1-z*Observe_Mat22+Observe_Mat32; /*把三维坐标投影为二维坐标*/ void _3Dto_2D(_3D *_3Dpoint,_2D *_2Dpoint) _2Dpoint-x=WIDE/2+F*_3Dpoint-x/_3Dpoint-z; _2Dpoint-y=HIGHT/2-F*_3Dpoint-y/_3Dpoint-z; /*球体绕z轴转动后的坐标变换*/ void z_round(Globe *globe,int angle) float z44; int i,j; to_EMat(z); z00=Co

40、sget_angle(angle); z01=Singet_angle(angle); z10=-z01; z11=z00; for(i=0;i9;i+) for(j=0;jgij,z); /*球体绕y轴转动后的坐标变换*/ void y_round(Globe *globe,int angle) float y44; int i,j; to_EMat(y); y00=Cosget_angle(angle); y20=Singet_angle(angle); y02=-y20; y22=y00; for(i=0;i9;i+) for(j=0;jgij,y); /*球体绕x轴转动后的坐标变换*/

41、 void x_round(Globe *globe,int angle) float x44; int i,j; to_EMat(x); x11=Cosget_angle(angle); x12=Singet_angle(angle); x21=-x12; x22=x11; for(i=0;i9;i+) for(j=0;jgij,x); /*初始化图形模式*/ void init_gph() int gd=DETECT,gm; initgraph(&gd,&gm,); setfillstyle(SOLID_FILL,BLACK); bar(0,0,640,480); /*开辟一个用来存放球体

42、数据的空间,并返回头地址*/ Globe *create_globe() Globe *p; int i,j; p=(Globe *)malloc(Sizeglobe); for(i=0;i9;i+) for(j=0;jgij=(_3D *)malloc(Size3D); p-tempij=(_2D *)malloc(Size2D); p-center=(_3D *)malloc(Size3D); p-round_center=(_3D *)malloc(Size3D); return p; /*把一个角化为0-360的角,要求是它的三角函数值不变*/ int get_angle(int an

43、gle) angle%=360; if(anglex=x0; p-y=y0; p-z=z0; return p; /*给一个轴向量赋值*/ Axle *get_axle(int qx,int qy,int qz) Axle *p; p=(Axle *)malloc(Sizeaxle); p-anglex=qx; p-angley=qy; p-anglez=qz; return p; /*从世界坐标原点平移球体到指定点(球体初始化时用)*/ void place_globe(Globe *globe) float tempf44; int i,j; to_EMat(tempf); tempf30

44、=(globe-center)-x; tempf31=(globe-center)-y; tempf32=(globe-center)-z; for(i=0;i9;i+) for(j=0;jgij,tempf); /*球体初始化*/ void init_globe(Globe *globe,float r,_3D *thecenter,_3D *rnd_center) int i,j; globe-r=r; for(i=-4;i=4;i+) for(j=0;jgi+4j)-x=r*Cosget_angle(i*18)*Cosget_angle(j*36); (globe-gi+4j)-y=r*

45、Cosget_angle(i*18)*Singet_angle(j*36); (globe-gi+4j)-z=r*Singet_angle(i*18); _3D_cpy(globe-center,thecenter); _3D_cpy(globe-round_center,rnd_center); place_globe(globe); /*把球体上的点从世界坐标变成观察坐标,然后再把观察坐标投影为二维坐标*/ void Wglobe_to_2D(Globe *globe) int i,j; _3D *point; for(i=0;i9;i+) for(j=0;jgij,point); _3D

46、to_2D(point,globe-tempij); /*用指定颜色绘制球体*/ void draw_globe(Globe *g,int color) int i,j,n; Wglobe_to_2D(g); setcolor(color); for(i=0;i9;i+) for(j=0;jtempij)-x,(g-tempij)-y,(g-tempin)-x,(g-tempin)-y); for(j=0;j10;j+) for(i=0;itempij)-x,(g-tempij)-y,(g-tempnj)-x,(g-tempnj)-y); /*初始化*/ void init_start() i

47、nt i; _3D *p1,*p2,*p3,*p4; init_gph(); setcolor(RED); circle(320,240,200); init_size(); create_table(); init_observe(); init_Mat(); create_obMat(); Moon1=create_globe(); Moon2=create_globe(); Earth=create_globe(); p1=get_3Dpoint(0,100,0); p2=get_3Dpoint(0,-100,0); p3=get_3Dpoint(0,0,0); p4=get_3Dpoi

48、nt(0,0,0); init_globe(Moon1,20,p1,p4); init_globe(Moon2,20,p2,p4); init_globe(Earth,50,p3,p4); draw_globe(Earth,BLUE); draw_globe(Moon1,DARKGRAY); draw_globe(Moon2,CYAN); /*各球体随时间变化而在各自轨道上运行的动画(按任意键退出)*/ void roll() clock_t start,end; int angle=0; start=clock(); while(!kbhit() end=clock(); if(end-start)/CLK_TCKTIME) draw_globe(Moon1,BLACK); draw_globe(Moon2,BLACK); draw_globe(Earth,BLACK); z_round(Moon1,Zangle); x_round(Moon2,Z

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!