已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 场景的节点与数据结构如果将场景比作房间,那么场景的节点就是房间里的床、桌、灯、柜等设施。著名的3D软件开发工具Open Inventor将应用程序抽象成“a scene graph plus a set of actions”,所有的图形对象、属性、事件响应全由场景的节点来处理,十分适合于图形的交互式绘制。Intra3D 2.0借鉴了Open Inventor的节点设计。本章讲述Intra3D 2.0的节点基类、形体节点、相机节点、光源节点和组节点的设计与实现。4.1 场景图与节点的概念从数据结构角度讲,场景是一个有向无环图,称为Scene Graph。场景的交互式绘制就是对Scene Graph各个节点的遍历绘制。节点可分为组节点与叶子节点两大类,Scene Graph的根节点总是组节点。以下“伪代码”用于创建图4.1所示的Scene Graph :图4.1 Scene Graph 的组节点与叶子节点GroupNode *node1 = new GroupNode ;GroupNode *node2 = new GroupNode ;GroupNode *node4 = new GroupNode ;GroupNode *node7 = new GroupNode ;LeafNode *node3 = new LeafNode ;LeafNode *node5 = new LeafNode ;LeafNode *node6 = new LeafNode ;LeafNode *node8 = new LeafNode ;LeafNode *node9 = new LeafNode ;LeafNode *node10 = new LeafNode ;node1-AddChild(node2);node1-AddChild(node6);node1-AddChild(node7);node1-AddChild(node9);node1-AddChild(node10);node2-AddChild(node3);node2-AddChild(node4);node4-AddChild(node5);node7-AddChild(node8);如果用深度优先的方法遍历图4.1的Scene Graph,则节点的遍历顺序是1、2、3、4、5、6、7、8、9与10。Scene Grpah 中的叶子节点可以被多个组节点引用,如图4.2所示。当Scene Grpah比较复杂时,节点之间的引用关系也变得复杂,因此Scene Grpah需要用“对象引用计数”方法来管理节点的内存(见2.5节)。节点可以显式使用new来创建,但不可显式使用delete删除节点,应该用节点的Release函数。图4.2 叶子节点可以被多个组节点引用Intra3D 将Scene Graph节点分为组节点(GroupNode),形体节点(ShapeNode),光源节点(DirLightNode、PointLightNode、SpotLightNode)和相机节点(CameraNode)。所有上述节点均从基类节点SceneNode派生。SceneNode节点中定义了坐标系与丰富的3D交互功能。由于C+类支持数据(Data)和代码(Implementation)的继承,SceneNode节点功能可以被派生类节点继承。但是COM对象仅支持接口继承(本质上是继承虚函数的声明),不支持数据和代码的继承。只能在派生节点中包容ISceneNode并将ISceneNode的函数重新封装为当前节点的函数。COM库中的节点程序要比C+类库的复杂,4.3节将以ShapeNode为例分别论述类与COM对象的程序设计。相机是否该成为一种节点是值得商讨的话题。直观地讲,相机等同于观察者的眼睛,的确不是场景的组成部分。如果应用程序不涉及相机的交互,那么只需调用OpenGL的几个投影函数就可以实现图形学概念中的相机变换(请参考 Intra3D 的Window3D程序)。如果应用程序涉及复杂的相机交互,例如多个相机的切换,场景的漫游;此时将相机作为节点插入Scene Graph中,可以享用到在SceneNode定义的交互功能(请参考 Intra3D 的SceneView程序)。使用了相机节点的SceneView程序要比不使用相机节点的 Window3D程序复杂。4.2 场 景 节 点 的 基 类C+类库中的SceneNode程序见Intra3D-DLLIncludeLayer3SceneNode.h和Intra3D-DLLLayer3SceneNode.cpp。COM库的程序见Intra3D-COMLayer3SceneNode.h和SceneNode.cpp。本节主要论述类SceneNode的设计。SceneNode为场景的交互式绘制提供了两大功能:一是坐标系统的定义与图形变换;二是节点的拾取与绘制。类SceneNode是Container的公有派生类,其数据结构并不复杂,但运算函数较多。其主要数据成员如下:protected:SceneNode *m_pParent ; char m_strNodeName32 ;VECTOR m_position, m_oldPosition ;ROTATION m_rotation, m_oldRotation ;VECTOR m_scale, m_oldScale ;Trackball m_trackball ;/ 跟踪球BOOL m_bSelected ;/ 当前节点被拾取的标志4.2.1 坐标系统的定义与图形变换每个节点都有标定自己的坐标系,称为对象坐标系(Object Coordinate System)。在2.1节已经论述了可用旋转结构(ROTATION)、平移矢量、比例矢量来确定图形变换的状态与过程。m_position、m_rotation与m_scale三个量分别表示该节点在父节点坐标系中的位置量、旋转量与比例量,执行节点的图形变换函数将改变上述量。m_oldPosition、 m_odlRotation与m_oldScale用于记录原始状态,便于恢复。节点的相互连接构成了Scene Graph,为了有统一的参照系,把Scene Graph的根节点的坐标系称为世界坐标系(World Coordinate System)。场景最后投影到窗口中,即执行了相机变换。观察者用鼠标对场景节点直接拖动、旋转等操作,实质是执行了相机坐标系(Camera Coordinate System)的图形变换。因此场景的3D交互包含了节点在对象坐标系与相机坐标系的图形变换。用于定义坐标系统与图形变换的主要函数有:public:/ 定义坐标系统的函数 void SetPosition(float x, float y, float z);void SetRotation(float angle, float nx, float ny, float nz);void SetScale(float sx, float sy, float sz);/ 对象坐标系的图形变换函数void Translate(VECTOR trans);void Rotate(float angle, VECTOR axis);void Scale(float sx, float sy, float sz);virtual void ResetTransform(void);/ 相机坐标系的图形变换函数void TranslateInCamera(VECTOR trans);void RotateInCamera(float angle, VECTOR axis);void MouseTrackStart(int iViewportWidth, int iViewportHeight, int mx, int my);void MouseTracking(int dx, int dy); protected:/ FWTO : From World Coordinate To Object Coordinate/ FOTW : From Object Coordinate To World Coordinate/ FCTO : From Camera To Coordinate Object Coordinate/ FOTC : From Object Coordinate To Camera Coordinate/ 对象坐标系、世界坐标系、相机坐标系之间的顶点换算void VertexTransform_FWTO(float *x, float *y, float *z);void VertexTransform_FOTW(float *x, float *y, float *z);void VertexTransform_FCTO(float *x, float *y, float *z); void VertexTransform_FOTC(float *x, float *y, float *z);/ 对象坐标系、世界坐标系、相机坐标系之间的矢量换算void VectorTransform_FWTO(VECTOR *V);void VectorTransform_FOTW(VECTOR *V);void VectorTransform_FCTO(VECTOR *V);void VectorTransform_FOTC(VECTOR *V);函数SetPosition、SetRotation与SetScale用于设置该节点在父节点坐标系中的位置量、旋转量与比例量。void SceneNode:SetPosition(float x, float y, float z)m_position.x=x;m_position.y=y;m_position.z=z;m_oldPosition=m_position;/ 记录原始状态void SceneNode:SetRotation(float angle, float nx, float ny, float nz)m_rotation.angle=angle;m_rotation.axis.x=nx;m_rotation.axis.y=ny;m_rotation.axis.z=nz;VectorNormalize(&m_rotation.axis);m_oldRotation=m_rotation;/ 记录原始状态void SceneNode:SetScale(float sx, float sy, float sz)m_scale.x=sx;m_scale.y=sy;m_scale.z=sz;m_oldScale=m_scale;/ 记录原始状态函数Translate、Rotate与Scale用于实现对象坐标系中的平移变换、旋转变换与比例变换。ResetTransform函数用于恢复原始状态。void SceneNode:Translate(VECTOR trans)/ 注意理解为什么要用 VectorTransformtrans=VectorTransform(trans, m_rotation); / 见Rotation.hm_position.x += trans.x;m_position.y += trans.y;m_position.z += trans.z;void SceneNode:Rotate(float angle, VECTOR axis)ROTATION R(axis, angle); VectorNormalize(&R.axis);/ 注意理解为什么要用 VectorTransformR.axis=VectorTransform(R.axis, m_rotation); m_rotation=m_rotation*R;/ 见Rotation.hvoid SceneNode:Scale(float sx, float sy, float sz)m_scale.x *= sx;m_scale.y *= sy;m_scale.z *= sz;void SceneNode:ResetTransform(void)/ 恢复初始状态m_position= m_oldPosition;m_rotation= m_oldRotation;m_scale= m_oldScale;TranslateInCamera与RotateInCamera是相机坐标系的平移变换与旋转变换函数。MouseTrackStart 与MouseTracking用于鼠标跟踪球交互。void SceneNode:TranslateInCamera(VECTOR trans)if(GetType() != CAMERA_NODE)VectorTransform_FCTO(&trans);Translate(trans);void SceneNode:RotateInCamera(float angle, VECTOR axis)if(GetType() != CAMERA_NODE)VectorTransform_FCTO(&axis);Rotate(angle, axis);void SceneNode:MouseTrackStart(int width, int height, int mx, int my)/ 计算旋转中心在窗口中的坐标float cx=0, cy=0, cz=0;if(GetType() = CAMERA_NODE) cx=width/2.0;cy=height/2.0;elseVertexTransform_ObjectToWindow(&cx, &cy, &cz);cy=height-cy;/ OpenGL Window 与 MFC Window 在Y方向反向m_trackball.SetTrackWindow(width, height, int(cx), int(cy);m_trackball.Start(mx, my);void SceneNode:MouseTracking(int dx, int dy)VECTOR axis;float angle;m_trackball.Tracking(dx, dy, &axis, &angle);RotateInCamera(angle, axis);4.2.2 节点的拾取与绘制用于拾取与绘制节点的主要函数有:public:virtual SceneNode *Search(char *name)return NULL;virtual void Selected(void)m_bSelected=TRUE; virtual void Unselected(void)m_bSelected=FALSE; virtual void Draw(void);virtual void DrawForMouseSelect(void); void LoadMatrix(void);/ 在Draw, DrawForMouseSelect 之前调用一般情况下,节点用Draw函数绘制。当场景的节点处于拾取状态时,OpenGL的绘制模式为GL_SELECT,此时要用DrawForMouseSelect函数绘制节点。在执行Draw或DrawForMouseSelect函数前,应调用LoadMatrix函数。Search、Selected、Unselected、Draw与DrawForMouseSelect均为虚函数,具体行为由派生类定义。void SceneNode:LoadMatrix(void)glTranslatef(m_position.x, m_position.y, m_position.z);glRotatef(m_rotation.angle,m_rotation.axis.x, m_rotation.axis.y, m_rotation.axis.z);glScalef(m_scale.x, m_scale.y, m_scale.z); COM接口ISceneNode定义如下:interface ISceneNode : IDispatchHRESULT SetName(BSTR strName);HRESULT GetName(BSTR *strName);HRESULT SetPosition(float x, float y, float z);HRESULT GetPosition(out float *x, out float *y, out float *z);HRESULT SetRotation(float angle, float nx, float ny, float nz);HRESULT GetRotation(out float *angle, out float *nx, out float *ny, out float *nz);HRESULT SetScale(float sx, float sy, float sz);HRESULT GetScale(out float *sx, out float *sy, out float *sz);HRESULT SetRotateStep(float fRotateStep);HRESULT GetRotateStep(out,retval float *step);HRESULT GetTranslateStep(out,retval float *step);HRESULT SetTranslateStep(float fTransStep);HRESULT SetScaleStep(float fScaleStep);HRESULT GetScaleStep(out,retval float *step);HRESULT ResetTransform();HRESULT Scale(float sx, float sy, float sz);HRESULT Translate(float dx, float dy, float dz);HRESULT Rotate(float angle, float nx, float ny, float nz);HRESULT TranslateInCamera(float dx, float dy, float dz);HRESULT RotateInCamera(float angle, float nx, float ny, float nz);HRESULT MouseTrackStart(int iViewportWidth, int iViewportHeight, int mx, int my);HRESULT MouseTracking(int dx, int dy);HRESULT LoadMatrix();HRESULT LoadInverseMatrix();HRESULT LoadMatrix_FWTO();HRESULT LoadMatrix_FOTW();HRESULT VertexTransform_FWTO(in,out float *x, in,out float *y, in,out float *z);HRESULT VertexTransform_FOTW(in,out float *x, in,out float *y, in,out float *z);HRESULT VertexTransform_FCTO(in,out float *x, in,out float *y, in,out float *z);HRESULT VertexTransform_FOTC(in,out float *x, in,out float *y, in,out float *z);HRESULT SetParent(ISceneNode *node);HRESULT GetParent(out,retval ISceneNode *node);HRESULT GetType(out,retval EnumNodeType *type);HRESULT Search(BSTR name, out, retval ISceneNode *node);HRESULT Draw();HRESULT DrawForMouseSelect();HRESULT Selected();HRESULT Unselected();HRESULT IsSelected(out,retval BOOL *bFlag);4.3 形 体 节 点形体节点可以引用图形对象,3D交互由节点提供,绘制则由所引用的图形对象实现。这样设计可使形体节点既简单又通用。C+类库中的ShapeNode程序见Intra3D-DLL IncludeLayer3ShapeNode.h和Intra3D-DLLLayer3ShapeNode.cpp。COM库中的程序见Intra3D-COMLayer3ShapeNode.h和ShapeNode.cpp。类ShapeNode的声明如下:class ShapeNode : public SceneNodepublic:void SetBoundColor(float red, float green, float blue);void ShowBoundBox(void);void HideBoundBox(void);void SetGraphicalObject(GraphicalObject *object);virtual void Draw(void);virtual void DrawForMouseSelect(void);.protected:virtual void FinalRelease(void);/ Container.hprotected:GraphicalObject *m_pGraphicalObject;float m_fBoundColor3;BOOL m_bShowBoundBox;SetBoundColor、ShowBoundBox与HideBoundBox函数用于处理图形对象的包围盒:/ 设置包围体(盒、球)的颜色void ShapeNode:SetBoundColor(float red, float green, float blue)m_fBoundColor0=red;m_fBoundColor1=green;m_fBoundColor2=blue;/ 在节点被拾取时,显示包围盒void ShapeNode:ShowBoundBox(void)m_bShowBoundBox=TRUE;/ 在节点被拾取时,隐藏包围盒void ShapeNode:HideBoundBox(void) m_bShowBoundBox=FALSE;函数SetGraphicalObject引用外部定义的图形对象。当形体节点在删除自身时,应先消除对图形对象的引用,此工作由FinalRelease函数完成。void ShapeNode:SetGraphicalObject(GraphicalObject *object)if(m_pGraphicalObject != NULL)m_pGraphicalObject-Release();m_pGraphicalObject=object;if(object != NULL)m_pGraphicalObject-AddRef();void ShapeNode:FinalRelease(void)if(m_pGraphicalObject!=NULL)m_pGraphicalObject-Release();形体节点的绘制由被引用的图形对象的Draw函数实现。当节点被拾取时,应给图形对象加上包围盒,以区别于其它节点。DrawForMouseSelect函数仅用于鼠标的拾取判断,并不将图形在窗口中显示出来,因此无需绘制包围盒。void ShapeNode:Draw(void)if(m_pGraphicalObject = NULL)return;glPushMatrix();LoadMatrix();/ SceneNode.h/ Draw Bounding Boxif(IsSelected() & m_bShowBoundBox)glColor3fv(m_fBoundColor);int flag;glGetIntegerv(GL_LIGHTING, &flag);if(flag) glDisable(GL_LIGHTING);float x, y, z, cx, cy, cz;m_pGraphicalObject-GetBoundBox(&x, &y, &z, &cx, &cy, &cz);if( x!=0 & y!=0 & z!=0 )DrawWireBox(x, y, z, cx, cy, cz);if(flag) glEnable(GL_LIGHTING);m_pGraphicalObject-Draw();glPopMatrix();void ShapeNode:DrawForMouseSelect(void)if(m_pGraphicalObject = NULL) return;LoadNameForMouseSelect(m_strNodeName);/ MouseSelect.hglPushMatrix();LoadMatrix();/ SceneNode.hm_pGraphicalObject-Draw();glPopMatrix();COM对象的程序要比对应的C+类复杂,这是因为COM对象仅支持接口继承而不支持数据和代码的继承。COM对象ShapeNode提供接口IShapeNode和ISceneNode。尽管接口ISceneNode的具体功能已经在COM对象SceneNode中实现,但是ShapeNode只能用包容ISceneNode的方法将ISceneNode的函数重新封装。interface IShapeNode : IDispatchHRESULT SetGraphicalObject(IGraphicalObject *object);HRESULT GetGraphicalObject(out,retval IGraphicalObject *object);HRESULT SetBoundColor(float red, float green, float blue);HRESULT GetBoundColor(out float *red, out float *green, out float *blue);HRESULT ShowBoundBox();HRESULT HideBoundBox();class CShapeNode : public CComObjectRootEx,public CComCoClass,public IDispatchImpl,public IDispatchImplpublic:CShapeNode();CShapeNode();virtual void FinalRelease(void);/ CComObjectRootExDECLARE_REGISTRY_RESOURCEID(IDR_SHAPENODE)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CShapeNode)COM_INTERFACE_ENTRY(IShapeNode)COM_INTERFACE_ENTRY2(IDispatch, IShapeNode)COM_INTERFACE_ENTRY(ISceneNode)END_COM_MAP()public:/- 接口IShapeNode 的函数 -STDMETHOD(HideBoundBox)();STDMETHOD(ShowBoundBox)();STDMETHOD(GetBoundColor)(float *red, float *green, float *blue);STDMETHOD(SetBoundColor)(float red, float green, float blue);STDMETHOD(GetGraphicalObject)(IGraphicalObject *object);STDMETHOD(SetGraphicalObject)(IGraphicalObject *object);/- 接口ISceneNode 的函数 -.STDMETHOD(Draw)();STDMETHOD(DrawForMouseSelect)();protected:ISceneNode *m_pNode;IGraphicalObject *m_pGraphicalObject;floatm_fBoundColor3;BOOLm_bShowBoundBox;对于ISceneNode的函数,除了Draw与DrawForMouseSelect需要重新定义外,其它函数均可以通过简单的再封装实现,如下面程序所示:STDMETHODIMP CShapeNode:SetPosition(float x, float y, float z)AFX_MANAGE_STATE(AfxGetStaticModuleState()m_pNode-SetPosition(x, y, z);/ 简单的再封装return S_OK;STDMETHODIMP CShapeNode:Translate(float dx, float dy, float dz)AFX_MANAGE_STATE(AfxGetStaticModuleState()m_pNode- Translate (dx, dy, dz);/ 简单的再封装return S_OK;要注意的是 m_pNode的内存管理。m_pNode不能用new操作符来创建,而要用COM提供的CoCreateInstance函数。释放m_pNode时不能用delete操作符,而要用COM接口的Release函数。如下面程序所示:CShapeNode:CShapeNode(void)m_pGraphicalObject=NULL;HRESULT hr = CoCreateInstance(CLSID_SceneNode, NULL, CLSCTX_INPROC_SERVER, IID_ISceneNode, (void*)&m_pNode);CShapeNode:CShapeNode(void)if(m_pNode!=NULL)m_pNode-Release();void CShapeNode:FinalRelease(void)if(m_pGraphicalObject!=NULL)m_pGraphicalObject-Release();4.4 相 机 节 点将相机作为一种节点是为了支持多个相机切换、虚拟漫游等复杂的3D交互。相机节点已经超出了图形学中投影变换的概念。Intra3D 的多重采样消锯齿技术(见第五章SceneView程序),实际上是依靠抖动相机节点多次绘制场景而实现的。由于相机节点不象形体节点、光源节点那么直观,使得用户不易掌握。Intra3D的SceneView程序很好地封装了对相机节点的交互,用户只需了解如何设置相机节点即可。相机节点的常用函数如下:void Active(void);BOOL IsActive(void);void SetProjectionMode(int mode);int GetProjectionMode(void);void SetViewVolume(float viewAngle, float nearZ, float farZ, float orthoZ);void GetViewVolume(float *aspect, float *viewAngle, float *nearZ, float *farZ, float *orthoZ);场景中至少要有一个相机节点,否则SceneView将不知道如何在窗口中绘制场景。如果场景有多个相机节点,则每次绘制场景时只能有一个相机节点激活。函数Active用于激活相机,Active函数是排它性的。函数IsActive用于查询相机节点是否被激活。相机节点的投影模式有两种:透视投影(宏定义为PERSPECTIVE)与平行投影(宏定义为ORTHO)。函数SetProjectionMode用于设置投影模式。相机节点的位置与朝向由SceneNode的函数SetPosition与SetRotation设置。用函数SetViewVolume同时设置透视投影与平行投影的视见体参数需要一些技巧。其原理如下:记参数 nearZ, farZ分别为视点到近平面与远平面的距离;aspect为窗口宽与高的比。对于透视投影,用三个参数viewAngle, nearZ, farZ可以确定视见体。对于平行投影,用四个参数width, height, nearZ, farZ可以确定视见体。但viewAngle,width,height在概念上难以统一。引入参数orthoZ,令:height = 2.0 * orthoZ * tan(viewAngle/2.0) width = height * aspect则可以用四个参数viewAngle, nearZ, farZ, orthoZ同时设置透视投影与平行投影的视见体。C+类库中的CameraNode程序见Intra3D-DLLIncludeLayer3CameraNode.h和Intra3D-DLLLayer3CameraNode.cpp。COM库中的程序见Intra3D-COMLayer3 CameraNode.h和CameraNode.cpp。COM对象提供两个接口:ICameraNode 与ISceneNode。有关CameraNode函数详细的说明请参见Intra3D 2.0的库函数手册。4.5 光 源 节 点OpenGL有完备的光照明函数,但是没有对光源进行交互的函数。Intra3D将光源作为节点,目的是为了享用SceneNode提供的3D交互功能。光源节点分为平行光源节点(DirLightNode)、点光源节点(PointLightNode)与锥光源节点(SpotLightNode)。图4.3 平行光源、点光源与锥光源的形状图4.4 编辑平行光源的颜色为了形象地表示光源节点,让每个光源节点都具有“形状”,如图4.3所示。有了可视的“形状”,就可用鼠标直接操作光源节点,并且可以编辑光源的颜色,如图4.4所示。DirLightNode、PointLightNode与SpotLightNode的函数很相似。类DirLightNode的主要公有函数声明如下:/- 用于设置光源参数的函数 -voidTurnOn(void)voidTurnOff(void)voidShowShape(void)voidHideShape(void)BOOLIsShowShape(void)voidSetColor(float r, float g, float b)voidGetColor(float *r, float *g, float *b)voidSetDiffuseIntensity(float intensity)floatGetDiffuseIntensity(void)voidSetAmbientIntensity(float intensity)floatGetAmbientIntensity(void)voidSetSpecularIntensity(float intensity)floatGetSpecularIntensity(void)/- SceneNode 中的虚函数 -virtual int GetType(void) return DIR_LIGHT_NODE; virtual void Draw(void);virtual void DrawForMouseSelect(void);virtual void Selected(void);virtual void Unselected(void);类PointLightNode要比类DirLightNode多一对函数:voidSetAttenuation(float a0, float a1, float a2);voidGetAttenuation(float *a0, float *a1, float *a2);类SpotLightNode则又比类PointLightNode多两对函数:voidSetDirection(float nx, float ny, float nz);voidGetDirection(float *nx, float *ny, float *nz);voidSetCutoffAngle(float angle);floatGetCutoffAngle(void);C+类库中DirLightNode的程序见Intra3D-DLLIncludeLayer3DirLightNode.h和Intra3D-DLLLayer3DirLightNode.cpp。PointLightNode的程序见Intra3D-DLLInclude Layer3PointLightNode.h以及Intra3D-DLLLayer3PointLightNode.cpp。SpotLightNode节点的程序见Intra3D-DLLIncludeLayer3SpotLightNode.h以及Intra3D-DLLLayer3 SpotLightNode.cpp。COM库中DirLightNode的程序见Intra3D-COMLayer3DirLightNode.h和DirLightNode.cpp。PointLightNode的程序见Intra3D-COMLayer3PointLightNode.h和PointLightNode.cpp。SpotLightNode节点的程序见Intra3D-COMLayer3SpotLightNode.h和SpotLightNode.cpp。COM对象DirLightNode提供接口IDirLightNode和ISceneNod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度版权质押合同:某出版社版权质押协议(04版)
- 《日常生活视角下马拉松运动的体验式研究》
- 2024年度网络安全合同
- 《蔡邕思想研究》
- 《基于GRADE系统对中医外治法治疗急性痛风性关节炎的网状Meta分析》
- 《甲磺酸奥希替尼治疗EGFR基因突变型非小细胞肺癌脑转移的预后因素分析》
- 《网球专项大学生对截击球落点的预判优势特征》
- 2024年快餐连锁羊肉供应商合同
- 《Ⅰ、Ⅱ期肺癌患者不同术式对比及对患者术后近期生活质量影响的临床分析研究》
- 2024房屋重建施工协议条款
- 2024-2025学年二年级上学期数学期中模拟试卷(苏教版)(含答案解析)
- 入团志愿书(2016版本)(可编辑打印标准A4) (1)
- (完整版)六年级下册体育教学计划与教案
- 北京地铁受电弓的维护与故障检修-毕业设计说明书
- 幼儿园教育和家庭教育的有效结合研究
- 集团公司两金管理评价办法
- 电影的声音分析PPT课件
- “三措一案”实施规范标准
- 【全面解读《国有建设用地使用权出让地价评估技术规范【2018】4号文》
- 案件移交清单模板
- 等差数列及其通项公式
评论
0/150
提交评论