




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告课程名称:三维图形设计学院:计算机科学与工程专业:计算机科学与技术指导教师:周川学生姓名: 学号:实验成绩:日期:2014年5月19日电子科技大学计算机学院实验中心电 子 科 技 大 学实 验 报 告一、实验三:OpenGL光照与材质编程实验二、实验室名称:主楼A2-412 实验时间:2014年5月19日 三、实验目的:1、理解OpenGL光照模型的相关原理,掌握与光照参数和对象材质设置相关的OpenGL API函数的用法,熟悉光照与材质参数设置的基本技巧;2、理解OpenGL混合(融合)的基本原理,掌握与混合相关的OpenGL API函数的用法。四、实验原理:1. openGL图形编
2、程技术原理2. 选择与拾取、光照与材质、混合与透明、纹理贴图、菜单。五、实验内容:(一)编程任务1绘制一个具有光照的房间1、 建立光照场景并为场景中的几何对象设置材质属性void CreateWorld()a. 四面墙壁 void CreateWall()b. 屋顶 void CreateCeiling()c. 地板 void CreateGround()d. 一个圆锥体和一个球体 void CreateFurnishings()e. 在房间中创建并放置两个光源 void CreateLightAndProxy(void)a) 一个是点光源b) 一个是聚光灯;c) 为光源创建代理几何体(Pro
3、xy),可以通过鼠标拖动光源代理来交互式的移动光源;2、 绘制场景void DrawWorld(void)a. 绘制四面墙壁 void DrawWall()b. 绘制屋顶 void DrawCeiling()c. 绘制地板 void DrawGround()d. 绘制屋内物品 void DrawFurnishings()e. 绘制光源代理 voidDrawLightProxy()其它要求:1、可交互式移动光源;2、可用右键菜单交互式的开启或关闭场景光照;3、可利用键盘快捷键调整球的材质属性,如辉度系数(GL_SHININESS)等。分析材质是如何影响几何对象的光照效果的。(二)编程任务2绘制一
4、个具有地板反光效果的房间利用OpenGL混合功能可以模拟地板反光效果,这需要将地板和场景中其它物体分开处理,其基本思路如下:1、首先以上下颠倒的方式来绘制出地板镜像场景(即沿着地板面将光源和场景进行镜像);2、接者利用混合在上述镜像场景之上绘制出半透明的地板;3、最后以正常的光源和场景位置来绘制场景。参考代码如下:void RenderScene(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); / 光源镜像移动到地板下,以照射这个“镜像”场景 glLightfv(GL_LIGHT0, GL_PO
5、SITION, fLightPosMirror); glPushMatrix(); /场景被镜像,同时交换正反面 glFrontFace(GL_CW); glScalef(1.0f, -1.0f, 1.0f); DrawWorldExGround(); glFrontFace(GL_CCW); glPopMatrix(); / 在镜像场景上绘制一个半透明的地板 glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawGround(); glDisable
6、(GL_BLEND); glEnable(GL_LIGHTING); / 恢复正常的光照,并正确绘制场景 glLightfv(GL_LIGHT0, GL_POSITION, fLightPos); DrawWorldExGround(); glPopMatrix(); glutSwapBuffers(); 六、实验器材(设备、元器件):电脑型号戴尔 System Inspiron N4110 笔记本电脑操作系统 Windows 8 专业版 64位 ( DirectX 11 )软件环境 Microsoft Visual Studio Express 2012 for Windows Deskto
7、p OpenGL Glut3.7七、实验步骤:1.做出具有两个光照的房间2.利用拾取做出交互的光照代理3.做出其他相关附加需求如菜单4.利用透明与变换做出反光地板八、实验数据及结果分析:(一)交互光照房间1. 代码:#include<gl/glut.h>#include<stdio.h>#define W 500/窗口宽#define H 500/窗口高#define D 50.0/因为鼠标移动数据太大,而世界坐标设定得太小,所以用D将鼠标移动增量进行缩小映射int hits,hitx,hity;/命中次数、坐标GLint viewport4;GLuint select
8、Buf512;/材质属性结构定义typedef struct matattrGLfloat ambient4;GLfloat diffuse4;GLfloat specular4;GLfloat shininess;matattr;/各种材质数据设置matattr ball=0.2,0.3,0.3,1.0,0.3,0.3,0.85,1.0,0.5,0.5,0.81,1.0,50.0;matattr cone=0.3,0.0,0.0,1.0,0.6,0.0,0.0,1.0,0.8,0.6,0.6,1.0,50.0;matattr wall=0.2,0.5,0.5,1.0,0.2,0.5,0.5,
9、1.0,0.9,0.9,0.9,1.0,100.0;matattr ceiling=0.5,0.5,0.7,1.0,0.5,0.5,0.9,1.0,0.9,0.9,0.9,1.0,100.0;matattr ground=0.9,0.0,0.4,1.0,0.9,0.0,0.4,1.0,0.9,0.9,0.9,1.0,100.0;matattr light=1.0,1.0,0.1,1.0,1.0,1.0,0.1,1.0,0.8,0.8,0.2,1.0,50.0;/0光照(点光源)属性GLfloat position0=-2.0,3.0,8.0,1.0;GLfloat ambient0=0.1,0
10、.1,0.1,1.0;GLfloat diffuse0=1.0,1.0,0.8,1.0;GLfloat specular0=1.0,1.0,1.0,1.0;/1光照(聚光灯)属性GLfloat position1=-2.0,-2.0,8.0,1.0;GLfloat ambient1=0.1,0.1,0.1,1.0;GLfloat diffuse1=1.0,1.0,0.8,1.0;GLfloat specular1=1.0,1.0,1.0,1.0;GLfloat direction1=0.0,0.0,-1.0;/法向量GLfloat normals3=1.0,0.0,0.0,0.0,1.0,0.
11、0,0.0,-1.0,0.0,0.0,-1.0,0.0,0.0,0.0,-1.0,0.0,0.0,1.0;/全局光照参数设置(不使用默认的全局光)GLfloat global_ambient=0.5,0.5,0.5,1.0;/图片贴图数组GLubyte image443;GLUquadric *p;/=/=/赋予材质函数void evmat(matattr *mat)glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat->ambient);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat->diffus
12、e);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat->specular);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat->shininess);/创建房间void CreateWall()evmat(&wall);glNormal3fv(normals0);glBegin(GL_POLYGON);/前面glVertex3f(-5.0,-5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(-5
13、.0,-5.0,10.0);glEnd();glNormal3fv(normals1);glBegin(GL_POLYGON);/左边glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,0.0);glEnd();glNormal3fv(normals2);glBegin(GL_POLYGON);/右边glVertex3f(5.0,5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);g
14、lVertex3f(5.0,5.0,10.0);glEnd();glNormal3fv(normals3);glBegin(GL_POLYGON);/后面glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,5.0,0.0);glVertex3f(5.0,5.0,10.0);glVertex3f(5.0,-5.0,10.0);glEnd();void CreateCeiling()evmat(&ceiling); glNormal3fv(normals4);glBegin(GL_POLYGON);glVertex3f(-5.0,-5.0,10.0);glVer
15、tex3f(5.0,-5.0,10.0);glVertex3f(5.0,5.0,10.0);glVertex3f(-5.0,5.0,10.0);glEnd();void CreateGround()evmat(&ground); glNormal3fv(normals5);glBegin(GL_POLYGON);glTexCoord2f(0.0,0.0);glVertex3f(-5.0,-5.0,0.0);glTexCoord2f(0.0,15.0);glVertex3f(5.0,-5.0,0.0);glTexCoord2f(15.0,15.0);glVertex3f(5.0,5.0,
16、0.0);glTexCoord2f(0.0,15.0);glVertex3f(-5.0,5.0,0.0);glEnd();void CreateFurnishings()evmat(&cone);glPushMatrix();glTranslatef(-4.0,-2.0,0.0);glutSolidCone(1.0,2.0,80,50);evmat(&ball);glTranslatef(1.0,2.0,1.0);gluSphere(p,1.0,80,50);glPopMatrix();void CreateLightAndProxy(GLenum mode)glLightfv
17、(GL_LIGHT0,GL_POSITION,position0);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);glLightfv(GL_LIGHT1,GL_POSITION,position1);glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse1);glLightfv(GL_LIGHT1,GL_SPECULAR,specular1);glLightfv(GL_L
18、IGHT1,GL_AMBIENT,ambient1);glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,direction1);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,30);glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,1.0);evmat(&light);if(mode = GL_SELECT) glLoadName(1);/1是矩形,点光源glPushMatrix();glTranslatef(position00,position01,position02);glBegin(GL_POLYGON);
19、glVertex3f(0,-0.25,-0.25);glVertex3f(0,-0.25,0.25);glVertex3f(0,0.25,0.25);glVertex3f(0,0.25,-0.25);glEnd();glPopMatrix();if(mode = GL_SELECT) glLoadName(2);/2是三角形,聚光灯glPushMatrix();glTranslatef(position10,position11,position12);glBegin(GL_TRIANGLES);glVertex3f(0,-0.25,-0.25);glVertex3f(0,0.0,0.5);g
20、lVertex3f(0,0.25,-0.25);glEnd();glPopMatrix();void CreateWorld()CreateLightAndProxy(GL_RENDER);CreateWall();CreateCeiling();CreateGround();CreateFurnishings();/主display函数void display()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(80.0,1.
21、0,1.0,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0);CreateWorld();glutSwapBuffers();/鼠标移动回调void Motion(int x,int y)if (hits=1)if (selectBuf3=1)/矩形position01+=(x-hitx)/D;position02+=(hity-y)/D;/注意y是相反的,屏幕坐标和世界坐标原点位置不同else /三角形position11+=(x-hitx)/
22、D;position12+=(hity-y)/D;else if (hits=2)position01+=(x-hitx)/D;position02+=(hity-y)/D;position11+=(x-hitx)/D;position12+=(hity-y)/D;hitx=x;/拖动后新点作为击中点hity=y;glutPostRedisplay();/鼠标操作回调void mouse(int button, int state, int x, int y) if (button = GLUT_LEFT_BUTTON && state = GLUT_DOWN) /选择模式设置
23、,3像素精度 hitx=x; hity=y; glGetIntegerv (GL_VIEWPORT, viewport); glSelectBuffer (512, selectBuf); glRenderMode(GL_SELECT); glInitNames(); glPushName(0); glMatrixMode (GL_PROJECTION); glPushMatrix ();/利用流水线投影变换,取得鼠标点击形成的小视锥里面的图元 glLoadIdentity (); gluPickMatrix (GLdouble) x, (GLdouble) (viewport3 - y),
24、3.0, 3.0,viewport); gluPerspective(80.0,1.0,1.0,100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0); CreateLightAndProxy(GL_SELECT); glMatrixMode (GL_PROJECTION); glPopMatrix (); glutSwapBuffers(); hits = glRenderMode (GL_RENDER); glutPostRedisplay(
25、); /键盘回调,设置材质球参数void mykey (unsigned char key,int x, int y)switch(key)case 'w':ball.shininess=(ball.shininess>90)?100:(ball.shininess+10);break;case 'a':ball.ambient0=(ball.ambient0>0.95)?1:(ball.ambient0+0.05); ball.ambient1=(ball.ambient1>0.95)?1:(ball.ambient1+0.05); ball
26、.ambient2=(ball.ambient2>0.95)?1:(ball.ambient2+0.05); break;case 's':ball.specular0=(ball.specular0>0.95)?1:(ball.specular0+0.05); ball.specular1=(ball.specular1>0.95)?1:(ball.specular1+0.05); ball.specular2=(ball.specular2>0.95)?1:(ball.specular2+0.05); break;case 'd':b
27、all.diffuse0=(ball.diffuse0>0.95)?1:(ball.diffuse0+0.05); ball.diffuse1=(ball.diffuse1>0.95)?1:(ball.diffuse1+0.05); ball.diffuse2=(ball.diffuse2>0.95)?1:(ball.diffuse2+0.05); break;glutPostRedisplay();/菜单void mainmenu(int id)switch(id)case 1:glDisable(GL_LIGHT0);break;case 2:glEnable(GL_LI
28、GHT0);break;case 3:glDisable(GL_LIGHT1);break;case 4:glEnable(GL_LIGHT1);break; /复原case 5:glEnable(GL_LIGHT0);glEnable(GL_LIGHT1); position00=-2.0;position01=3.0;position02=8.0; position10=-2.0;position11=-2.0;position12=8.0; ball.ambient0=0.2;ball.ambient1=0.3;ball.ambient2=0.3; ball.diffuse0=0.3;b
29、all.diffuse1=0.3;ball.diffuse2=0.85; ball.specular0=0.5;ball.specular1=0.5;ball.specular2=0.81; ball.shininess=50;glutPostRedisplay();/初始化函数void init()int i,j,t;glEnable(GL_DEPTH_TEST);/选0号,1号光照glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);p=gluNewQuadric();gluQuadricDrawStyle(p, GLU
30、_FILL);/计算贴图数组for (i=0;i<4;i+)for (j=0;j<4;j+)t=0;if (i<2 &&j<2)|(i>=2 &&j>=2)t=255;imageij0=(GLubyte)t;imageij1=(GLubyte)t;imageij2=(GLubyte)t;/贴图参数设置glEnable(GL_TEXTURE_2D);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,image); glTexParameterf(G
31、L_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/可以给绘制每个图元时用glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);/设
32、置相应的纹理环境,这里使用默认的纹理环境:调制glLightModelfv(GL_LIGHT_MODEL_AMBIENT,global_ambient);/创建菜单glutCreateMenu(mainmenu);glutAddMenuEntry("关闭点光源",1);glutAddMenuEntry("开启点光源",2);glutAddMenuEntry("关闭聚光灯",3);glutAddMenuEntry("开启聚光灯",4);glutAddMenuEntry("复位",5);glutAt
33、tachMenu(GLUT_RIGHT_BUTTON);void main(int argc,char *argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow("201206007 ");glutDisplayFunc(display); glutMouseFunc (mouse); glutMotionFun
34、c(Motion);glutKeyboardFunc(mykey);init();glutMainLoop(); 2. 结果:初始效果图 移动点光源移动聚光灯只开聚光灯只开点光源关闭所有光源菜单展示按a增加材质球的ambient环境光参数复原、按s增加材质球的specular高光参数复原,按d增加材质球的diffuse漫反射参数按w增加材质球的辉度参数(镜面反射集中)仅使用环境光,按a设置环境光参数后,球有明显变化仅使用环境光,按d设置漫反射参数后,球没有明显变化3. 分析:完成了要求;可以看出聚光灯只在锥形区域发射光线;ambient和diffuse的改变对物体的颜色反应有明显作用;spec
35、ular对镜面反射有作用;shiness对物体光泽度调整有作用;只有环境光时diffuse对物体颜色没有作用;(二)绘制一个具有地板反光效果的房间1. 代码:#include<gl/glut.h>#include<stdio.h>#define W 500#define H 500/材质结构typedef struct matattrGLfloat ambient4;GLfloat diffuse4;GLfloat specular4;GLfloat shininess;matattr;/材质参数设置matattr ball=0.2,0.3,0.3,1.0,0.3,0.
36、3,0.85,1.0,0.5,0.5,0.81,1.0,50.0;matattr cone=0.3,0.0,0.0,1.0,0.6,0.0,0.0,1.0,0.8,0.6,0.6,1.0,50.0;matattr wall=0.2,0.5,0.5,1.0,0.2,0.5,0.5,1.0,0.9,0.9,0.9,1.0,100.0;matattr ceiling=0.5,0.5,0.7,1.0,0.5,0.5,0.9,1.0,0.9,0.9,0.9,1.0,100.0;matattr ground=1.0,1.0,1.0,0.5,/半透明1.0,1.0,1.0,0.5,1.0,1.0,1.0,0
37、.5,50.0;GLUquadric *p;/0光照属性GLfloat position0=-2.0,3.0,8.0,1.0;GLfloat position1=-2.0,3.0,-8.0,1.0;GLfloat ambient0=0.1,0.1,0.1,1.0;GLfloat diffuse0=1.0,1.0,0.8,1.0;GLfloat specular0=1.0,1.0,1.0,1.0;/法向GLfloat normals3=1.0,0.0,0.0,0.0,1.0,0.0,0.0,-1.0,0.0,0.0,-1.0,0.0,0.0,0.0,-1.0,0.0,0.0,1.0;/=/=/赋
38、材质函数void evmat(matattr *mat)glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat->ambient);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat->diffuse);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat->specular);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat->shininess);/创建房间void CreateWall()evmat(&am
39、p;wall);glNormal3fv(normals0);glBegin(GL_POLYGON);/前面glVertex3f(-5.0,-5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glEnd();glNormal3fv(normals1);glBegin(GL_POLYGON);/左边glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,-5.0,10.0);glVertex3f(-5.0,-5.0,10.0);glVertex3f(-
40、5.0,-5.0,0.0);glEnd();glNormal3fv(normals2);glBegin(GL_POLYGON);/右边glVertex3f(5.0,5.0,0.0);glVertex3f(-5.0,5.0,0.0);glVertex3f(-5.0,5.0,10.0);glVertex3f(5.0,5.0,10.0);glEnd();glNormal3fv(normals3);glBegin(GL_POLYGON);/后面glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,5.0,0.0);glVertex3f(5.0,5.0,10.0);glVert
41、ex3f(5.0,-5.0,10.0);glEnd();void CreateCeiling()evmat(&ceiling);glNormal3fv(normals4);glBegin(GL_POLYGON);glVertex3f(-5.0,-5.0,10.0);glVertex3f(5.0,-5.0,10.0);glVertex3f(5.0,5.0,10.0);glVertex3f(-5.0,5.0,10.0);glEnd();void CreateGround()evmat(&ground);glNormal3fv(normals5);glBegin(GL_POLYGON
42、);glVertex3f(-5.0,-5.0,0.0);glVertex3f(5.0,-5.0,0.0);glVertex3f(5.0,5.0,0.0);glVertex3f(-5.0,5.0,0.0);glEnd();void CreateFurnishings()evmat(&cone);glPushMatrix();glTranslatef(-4.0,-2.0,0.0);glutSolidCone(1.0,2.0,80,50);evmat(&ball);glTranslatef(1.0,2.0,1.0);gluSphere(p,1.0,80,50);glPopMatrix
43、();void CreateWorld()CreateWall();CreateCeiling();CreateFurnishings();void RenderScene() glPushMatrix(); glLightfv(GL_LIGHT0, GL_POSITION, position1); / 光源镜像移动到地板下,以照射这个“镜像”场景 glPushMatrix(); glScalef(1.0f, 1.0f, -1.0f);CreateWorld(); glPopMatrix();/由于最后绘制的是在正常光照下地板的反光效果,所以应先恢复光照,地板采取正常法向 glLightfv(
44、GL_LIGHT0, GL_POSITION, position0); /绘制一个半透明的地板 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glDepthMask(GL_FALSE);/关闭深度缓存写,保证混合效果 CreateGround();glDepthMask(GL_TRUE);/恢复深度缓存写 glDisable(GL_BLEND); CreateWorld(); glPopMatrix();void display()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国内销售代理合同范文
- 2025企业宣传音乐委约创作合同
- 2025二手客车买卖合同范本
- 机房维保标书
- 霍纳法则,计算hashcode
- 应对市场波动的仓库策略计划
- 代发工资合同样本
- 2025标准车辆买卖合同协议书
- 小班创意绘画教学计划
- 调动员工积极性的措施计划
- 第六章-GIS分析导论
- 轨道交通大数据应用研究
- 儿童成语故事凿壁偷光
- 【基于Django框架的网上商城设计(论文)6800字】
- 光伏电站安全生产管理制度
- 2024年中国斜交轮胎市场调查研究报告
- 高速公路服务区服务规范
- 300MW300MWh源网荷储一体化储能电站项目可行性研究报告模板-立项备案
- 外研版(三起点)小学英语三年级下册全册同步练习(含答案)
- 激光雷达产品商业计划书
- 2024-2030年吸附树脂行业市场发展分析及发展趋势与投资前景研究报告
评论
0/150
提交评论