三维标量场体可视化课件_第1页
三维标量场体可视化课件_第2页
三维标量场体可视化课件_第3页
三维标量场体可视化课件_第4页
三维标量场体可视化课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上一节课内容回顾第七讲 三维标量场等值面可视化7.1 Cuberille表示和显示方法7.2 Marching Cube算法7.3 有限元等值面7.4 VTK中三维标量场的等值面可视化等值面是指空间中的一张曲面,在该曲面上函数F(x,y,z)的值等于某一给定值准确地讲,是在一网格空间中,其中每一结点保存着连续三变量函数F(x,y,z)在网格单元(xi,yj,zk)上的采样值F(xi,yj,zk),对于某一给定值Ft,等值面是由所有点SFt(x,y,z):F(x,y,z) Ft 组成的一张曲面。7.1 Cuberille表示和显示方法Cuberille表示是一种适合于正交密集数据场的表示方法,主

2、要适用在医学图像、无损探伤等三维图像的等值面抽取该表示将三维图像中的每一象素看成是空间中的一个小立方体,在该小立方体内,数据场具有相同的值,整个空间及其对象就由这类小立方体组成这类小立方体被称作Cuberille表示中的体素。Cuberille表示和显示方法就是基于这种简单的体素表示。图7.1 Cuberille中的体素7.2 Marching Cube算法 Marching Cube算法是三维数据场等值面生成的经典算法,是体素单元内等值面抽取技术的代表。这一类算法所处理的数据一般是三维正交的数据场。Marching Cube算法中的立方体体素与Cuberille表示中的立方体体素不同,后者仅

3、以一个等值立方体表示一个体素值,等值面由体素的六个表面面元组成而在Marching Cube算法中,体素是一逻辑上的立方体,由相邻层上的各四个象素组成立方体上的八个顶点,如图7.2所示算法以扫描线方式逐个处理数据场中每一立方体体素,求出每一体素内包含的等值面,由此生成整个数据场的等值面图7.2 Marching Cube中的体素15种模式 :012345678910141312117.2.2二义性解决方法 Marching Cube算法提供了一种较精确的等值面生成方法,但在它所提出的15种体素内等值面连接模式中存在着许多二义性的连接,如图7.5所示图7.5二义性立方体 另一种消除二义性的方法是

4、将立方体剖分成四面体处理,在四面体中生成等值面就不存在二义性问题。 可假设在四面体边上数据场呈线性变化,对于每个四面体,等值面模式只有三种情况,如图7.11所示如果顶点数据值全大于或小于等值面值,等值面与单元无交,如一点大于另三点小于等值面值,则四面体中等值面是一三角片,如二点大于二点小于等值面值,则等值面是一四边形,可由两个三角片构造图7.11 四面体中的等值面7.3 有限元中的等值面 在有限元分析的后置处理中,等值面抽取和显示是一个主要手段,与前述的立方体体素相比较,尽管基本思路相同,但由于有限元数据的特点,有限元中的等值面生成又有其不同之处与正规化体素相比,有限元数据有以下特点: 1)单

5、元类型不一样,常见的有限元单元类型有4结点、6结点、8结点等,且每一单元比体素要大得多,单元边也往往非直线(见图7.12); 2)输入数据不一样,其几何连通性不是隐含的,而是显式说明的,数据中包含了每一单元每一顶点的几何数据图7.12常见的有限元单元类型 小结 等值面是三维标量场最基本的表示方法。 Cuberille表示将整个场空间划分成等值立方体体素,其中等值面由体素的外表面组成。 为了提高等值面生成的精度,体素被认为是由相邻层对应八个采样点组成。针对这种体素表示,出现了以Marching Cube算法为代表的单元内的等值面抽取方法。 两种二义性解决方法:基于线性插值假设下的渐近线交点判定方

6、法和四面体剖分后插值及等值面构造。 本节课内容第八讲 三维标量场体可视化 体绘制与面绘制的比较 体光照模型 体光线跟踪法 体单元投影法 三维扫描变换 VTK中的体绘制技术81 体绘制与面绘制的比较 在自然环境和计算模型中,许多对象和现象只能用三维体数据场表示,和传统的计算机图形学相比,对象体不再是用几何曲面或曲线表示的三维实体,而是以体素(voxel)作为基本造型单元对于每一体素,不仅其表面而且其内部都包含了对象信息,这是仅用曲线或曲面等几何造型方法所无法表示的 体绘制的目的就在于提供一种基于体素的绘制技术,它有别于传统的基于面的绘制,能显示出对象体的丰富的内部细节 体绘制技术包括体数据的表示

7、、操作和绘制三部分内容 体数据的来源有两类:一类是通过采样设备,如CT,MR等仪器,获得的实验数据,如断层扫描数据集;另一类是通过计算模型获得的计算数据,得到的通常是有限元计算数据集. 两类数据集统称为三维体数据集 在前一类正规化断层扫描数据集中,体素一般表示为中心在网格点的单位立方体(如采用Cuberille表示),或各顶点在网格点的单位立方体(如Marching Cube算法) 在后一类有限元计算数据集中,体素一般指有限元单元且其网格空间是非正规化的采用三维扫描变换可以将非正规化的有限元单元数据集转换成正规化断层扫描数据集. 体素是指网格空间中的单位立方体,每一体素都有一个相应的数值表示某

8、些可测量的属性或独立变量(如颜色、不透明度、污染物浓度、密度、材料、比率、折射率、速度、强度、变形、时间等) 图81表示了体绘制的一个数据流过程,描述了体绘制和面绘制两种绘制方法的各自过程。虽然两种绘制方法都是对三维数据场的显示,但由于基本方法的不同,因而在绘制效果,算法时间,交互性能等多方面都存在着很大的差别图81 两种绘制方法的各自过程 体绘制的一个特点就在于放弃了传统图形学中体由面构造的这一约束,采用体绘制光照模型直接从三维数据场中绘制出各类物理量的分布情况 等值面、等势面等数据场的几何面表示方法,是研究者们为了适应图形显示,人为地提出的一种数据场表示形式体绘制的根本点就在于放弃了这一做

9、法,直接研究光线穿过三维体数据场时的变化,得到最终的绘制结果 体绘制由于直接研究光线通过体数据场时与体素的相互关系,无需构造中间面,体素中的许多细节信息得以保留,结果的保真性大为提高 从结果图像的质量上讲,体绘制要优于面绘制但从交互性能和算法效率上讲,至少在目前的硬件平台上,面绘制还是要优于体绘制的8.2 体光照模型 体光照模型是进行体绘制的基础当光线穿过体素与光线遇到一曲面时,会发生不同的光学现象前者如光线穿过云层会发生吸收、散射等现象,后者如光线射到桌面上,有漫射、反射、透射等现象不同的物理背景决定了体光照强度的计算与面光照强度的计算有着不同的模型和方法 体光照模型就是研究光线穿过体素时的

10、光强变化,将光线穿过体素时的物理现象用数学模型来描述在目前的体绘制中,采用得较多的有源-衰减模型、变密度发射模型和材料分类及组合模型821 源衰减模型 源衰减模型为体数据场中的每一体素分配一个源强度和一个衰减系数,每一体素作为一个质点光源,发出的光线在数据场中沿距离衰减后被投影到视平面上,形成结果图像822 变密度发射模型 变密度发射模型认为任一对象都是一个质点光源系统。整个对象空间中都充满着粒子云,每一粒子均可发光模型处理的是宏观的质点密度,而非质点粒子本身该模型认为质点足够小,以致可以认为质点是连续分布的823 材料分类及混合模型 材料分类及混合模型认为每一体素是由若干种材料组合而成,如在

11、CT图像中每一体素由骨路、软组织、脂肪和空气等组成,其中每种材料的组成由该种材料在体素中所占的百分比来描述每一体素中每种材料的百分比的确定采用的是概率分类而非二值分类对不同材料分别计算其密度分布以及光照强度和不透明度,在分类的基础上,再通过组合公式,将各种材料的光照强度和不透明度以所占的百分比为权混合成该体素的亮度和不透明度与前两种模型相比最根本的区别在于材料分类及混合模型是一种基于分割的光强组合计算方法,它着眼于分割,而非讨论体数据中的各类物理现象 83 体绘制方法分类和比较 体光照模型提供了体数据中各数据点光照强度的计算方法,体绘制方法提供的是二维结果图像的生成方法 首先根据数据点值对每一

12、数据点赋以不透明度值和颜色值;再根据各数据点所在点的梯度及光照模型计算出各数据点的光照强度,然后将投射到图像平面中同一象素点的各数据点的半透明度和颜色值综合在一起,形成最终的结果图像 根据不同的绘制次序,体绘制方法目前主要分两类:以图像空间为序的体绘制算法以对象空间为序的体绘制方法(1)以图像空间为序的体绘制算法光线跟踪 以图像空间为序的绘制算法是从屏幕上的每一象素点出发,根据设定的视点方向,发出一条射线,这条射线穿过三维数据场的体素矩阵,沿这条射线选择K个等距采样点,由距离某一采样点最近的8个体素的颜色值及不透明度值做三维线性插值,求出该采样点的不透明度值及颜色值在求出该条射线上所有采样点的

13、颜色值及不透明度值以后,可以采用由后到前或由前到后的两种不同的方法将每一采样点的颜色及不透明度进行组合,从而计算出屏幕上该象素点处的颜色值 光线跟踪的主要步骤: For 每条光线 Do For 每个与光线相交的体素 Do 计算该体素对图像空间对应象素的贡献(2)以对象空间为序的体绘制算法单元投影法 该类算法首先根据每个数据点的函数值计算该点的不透明度及颜色值,然后根据给定的视平面和观察方向,将每个数据点的坐标由对象空间变换到图像空间再根据选定的光照模型,计算出每个数据点处的光照强度然后根据选定的重构核函数计算出从三维数据点光照强度到二维图像空间的映射关系,得出每个数据点所影响的二维象素的范围及

14、对其中每个象素点的光照强度的贡献最后将不同的数据点对同一象素点的贡献加以合成 单元投影法的主要步骤: For 每一体素或单元 Do For 该体素在视平面投影区域内的每一象素 Do 计算象素点获得的光照强度 两种方法各有特点,光线跟踪要将当前所有体数据放入内存,内存要求高而单元投影只需当前单元的体数据 从走样的情况分析,由于光线跟踪采用点采样,走样情况只有通过分布式光线跟踪才能消除相对地讲,单元投影可达到解析解的程度实质上,图象质量高低的关键在于所采用的重构核函数的精度高精度的再采样同样能较大地提高光线跟踪的质量 对象空间往往比图像空间要大得多,单元投影法的计算时间相对要大得多 光线跟踪难以并

15、行化,而单元投影的并行处理要相对容易得多.8.4体光线跟踪法 光线跟踪是三维场景绘制的一个很有效的方法,与传统的基于三维场景几何表示的光线跟踪相比,体绘制光线跟踪有其许多自身的特点:首先,对象空间的表示不同传统的对象空间是用造型技术建立起来的几何表示;而体绘制的对象空间是由被称为体素的单位立方体排列而成也可以看成是由一系列断层数据组合而成,称为体缓冲区其次,求交方式的不同传统的光线跟踪是与对象表中的对象求交,求出最近的相交点;而体绘制光线跟踪是遍历整个体缓冲区,求出第一个与光线相交的非透明的体素,由该体素中所存的数据值计算其光照强度第三,计算复杂度的不同,传统光线跟踪算法其计算时间随着对象的增

16、加,组成场景对象的复杂度增加而大大增加,主要是由于求交的开销影响着整个算法的效率;而体绘制免去了大量费时的求交计算,只需计算与立方体素的交和一个体素的遍历机制因而体绘制光线跟踪的复杂度与组成场景的对象数目和类型无关其复杂度主要和体缓冲区的分辨率有关在给定分辨率的情况下,体绘制光线跟踪的时间几乎是一常数 最后,任何与视点相关参数的改变,都会引起光线跟踪算法的完全重计算对传统光线跟踪而言,这些重计算包括纹理颜色的计算,光源可见性的检测,光照强度的计算等等;而对于体绘制而言,许多与视点相关的计算在三维离散采样生成体数据时已经存在于体数据中,如对象的纹理等,其绘制参数的改变主要是视点、光源和光照明模型

17、,相对而言。计算量要小一些841 三维对象的直接二维显示 该算法从屏幕向对象空间发射光线,假设屏幕上的每一点都是一光源,该光源以重直于屏幕的方向发射平行光对于屏幕上的每一点,首先计算出对象空间中与该点光线相交的第一点,然后再根据交点处的信息计算屏幕点最终的颜色值图811 计算光线与对象边界的交点图812 算法对象框架当对象空间是离散数据场时,用对象边界计算光线与对象的第一交点,如图811所示,交点必定位于沿光线两点I1和I2之间,其中I1和I2满足: 1)沿光线从屏幕到I1每点都位于对象之外; 2) I2位于对象之内 为方便算法的叙述,对算法作下列假设: 1)对象放入一矩形盒中,由若干断层组成

18、; 2)给定一点,能确定该点位于哪一断层上; 3)屏幕是一正方形或矩形,被分割成象素,每一象素由一点表示; 4)屏幕垂直于光线方向,光线方向由连接屏幕中心点和包围盒的直线确定 采用离散方式计算交点位置选择一足够小的步长d,对屏幕上每一点P,沿光线找出满足条件的一点Q,如图813所示,Q点可以通过以d为步长沿光线采样测试条件来寻找如果步长d太大,可能会丢失一些对象的交点,如图814所示,但如果d太小,采样过密,速度会很慢 图813 沿光线求交点图814 步长d太大丢失交点三维对象直接二维显示算法的主要过程: For il to L Do PE十(i一1)U; For i1 to L Do 计算K

19、0和K1KK0十1QP十KtWhile(Q在对象外)and(K K1) Do KK十1QQ十1End WhileIF Q在对象内 Then计算第一个交点I与P点的距离计算I点法向量;计算P点颜色值;Else 置P点为背景值 End IfEnd ForPPVEnd For8.4.2 光线投射法 光线投射的体绘制算法是目前使用最广泛的一种体绘制方法,如图815所示,对于图像平面上的每一象素,从视点投射出一穿过该象素的视线,该视线穿过体数据空间,算法直接利用该视线上的采样值计算该象素的光强 整个算法分为光线生成、光强计算与组合、图像显示三部分。图815 光线投射法设体数据中每一位于(i,j,k)的体

20、素值为f(x)(x=(i,j,k),位于视平面(u,v)处象素的光线为R(u,v),其强度值为C(u,v) 首先由f(x),根据光照明模型计算出对应的光强值C(x)和不透明度值a(x)沿光线R,进入图像空间与体数据包围盒相交,在两相交点之间设置一系列采样点S1,S2,Sm。根据C(x)和a(x) ,通过再采样计算出对应的C(Si)和a(Si),将C(Si)和a(Si)沿光线组合在一起就是当前象素点处的光强度值,如图816所示过程图816 光线投射流程根据光线的方向,组合可分为从后到前和从前到后两种组合方式。设光线穿过体素前颜色和不透明度为Cin和Ain,穿过体素后为Cout和Aout (见图8

21、17),光线从后到前的组合为: CoutCin(1-Ain) + C(Si)* A(Si)光线从前到后的组合为: CoutCin+C(Si) (1-Ain)两种组合前者直接计算,后者要计算Aout,但后者可利用Aout优化累加过程,故一般还是多采用后者 图817 光线组合方式光线投射体绘制算法:C(R)0a(R)0X1First(R) 求出在对象空间中光线进入和离开的位置X2Last(R)UlImage(X1)转换到图像空间中的位置U2Image(X2) 对所有在该对象空间的采样点SFor SU1 to U2 DoSx=Object(S) 转换到对象空间他置 求出Sx处的不透明度值a(Sx)

22、If a(Sx)0 Then C(Sx)采样点处的颜色(c*a) C(R)C(R)十C(Sx)(1 - a(R) a(R)a(R)十a(Sx)(1-a(R) End IfEnd For85 体单元投影法 体单元投影法是以对象空间为序的一种体绘制方法,它从对象空间的三维数据场出发,依次计算每个数据点对屏幕上各象素点的贡献,将同一平面和不同平面上各数据点对各象素点光亮度的贡献合成起来得到最后的图像,其过程如图820所示图820 体单元投影851 V-Buffer算法 该算法是基于正交网格点上计算单元的投影绘制方法算法扫描整个对象空间,依次逐个处理每一单元,由视点和单元的相对位置来决定单元的扫描次序

23、,为每一单元定义一个包围盒,用扫描线裁剪生成单元投影贡献的象素区域对每条扫描线上的象素点计算出光照强度和不透明度,然后进行累加,可见性由不透明度所决定该方法类似于消隐中的Z-Buffer算法,故称为V-Buffer算法。(1) 扫描次序的决定 由于在VBuffer中保存的是每一象素不透明度的累加值,后续单元对该象素的贡献受该累加不透明度的影响,因而单元扫描次序的决定是决定算法正确组合的基础 单元的处理,由接近视点的平面开始,逐个平面处理,直至最远的平面在每个平面内的单元处理次序是根据单元与视点距离,从最近的单元开始,然后处理相邻单元,这样就形成了一个类似同心圆式的扫描过程 由于是正交网格单元,

24、单元之间不会相互重叠,从而保证了上述处理次序的正确性,同时该算法也更易实现并行 图821显示了算法单元的处理次序,在同一平面内由l9决定了扫描次序,同一次序号的单元可并行处理 (2)单元的处理 在逐个单元的处理中,首先为每一单元决定一个包围盒由该包围盒在图像平面上的投影,决定该单元投影的扫描线范围对于包围盒内的每条扫描线,计算由扫描线所确定的扫描平面与单元的交多边形,该交多边形是一凸多边形,投影到扫描线上形成至多五段区间(见图822)(3)光亮度贡献的累加 对于与单元有交多边形的各条扫描线上的每一象素,要计算单元对它的光亮度贡献和不透明度的贡献,其中各象素点不透明度的值作为V-Buffer的内

25、容保留在V-Buffer中光亮度和不透明度的计算在每个象素的四个顶点上进行首先求出当前象素上的投影线与交多边形的交点,如图8.22中P点的投影线与交多边形有两个交点A和B,由交点可求出交线长,由交线长可计算出当前单元对该象素的贡献,再将贡献累加到图像平面上.图82l 单元扫描次序图822 单元的投影823 象素顶点的累加由四个象素顶点形成一四边形,所有空间函数如不透明度、光照强度和纹理在单元内都作为三次变量函数,插值可采用三维线性插值 当前象素的四个顶点的累加光亮度和不透明度(见图823) Cacc(1Oacc)C十Cacc Oacc(1Oacc)O十Oacc这是一种从前到后的累加,累加过程在

26、 1)单元处理完; 2)对应象素的V-Buffer中的值Oacc到达1;会停止对应象素点的光亮度累加当所有象素都停止累加,则整个算法停止运行,完成绘制过程852 Footprint算法 Footprint算法的过程和纹理映射的过程是一对相反的过程纹理映射是要计算出图像平面上每一象素在纹理空间中的取值范围,将该范围内值加权求和作为象素的纹理值而Footprint算法的过程是对每一数据采样点计算出它在图像平面内的影响的象素范围(Footprint范围),通过把各采样点的能量扩展到图像空间,逐步重构原始信号该算法要计算的是每一采样点对最终图像的贡献和每一采样点对每一象素的重构核心图824比较了这两者

27、的各自过程。图824 纹理映射与Footprint计算过程 整个Footprint算法由四步组成:变换、光强计算、重构和可见性组合.页是通过数据空间平行于图像平面的一个平面, Footprint算法是对页内的所有体素同时进行的 首先将页内采样点从数据空间(i,j,k)变换到屏幕图像空间(x,y,z)应用光照模型计算出光照强度(x,y,z,r,g,b,a). 然后选用Footprint函数计算采样贡献所能影响的图像空间的范围,将其贡献累加到图像空间的页累加器中,其中Footprint函数的决定、函数的采样和采样贡献的扩展,被形象地称为Splatting过程比喻为确定一滴水从对象空间落到图像平面上

28、溅开的范围 当一个页内的采样处理完后,用一组合操作将页累加器内的值组合到工作图像中; 当所有采样处理都完成后,工作图像将成为最后的图像86 三维扫描变换 以有限元计算数据为代表的非正规化网格空间的数据集无法直接使用前几节介绍的体绘制方法,必须通过三维扫描变换将其转换成正规化网格空间数据集 所谓将面数据转换成体数据,也就是把多边形表示的几何形体转换成体素表示,这一过程被称为体素化(voxelization)通过体素化把三维空间中表示连续曲面的几何数据转化为三维空间中表示对象的离散体素,这实际上就是一个三维扫描变换过程87 VTK中的体绘制技术:1 体元道具:vtkVolume -几何表面可视化中

29、vtkActorvolume = vtkVolume()volume.SetMapper(volumeMapper)volume.SetProperty(volumeProperty)2 体元特性:vtkVolumeProperty (颜色和透明度)灰度: SetColor (vtkPiecewiseFunction )彩色: SetColor (vtkColorTransferFunction)标量的透明度:SetScalarOpacity (vtkPiecewiseFunction )梯度的透明度: SetGradientOpacity (vtkPiecewiseFunction )vol

30、umeProperty = vtkVolumeProperty()volumeProperty.SetColor(colorTransferFunction)volumeProperty.SetScalarOpacity(opacityTransferFunction)opacityTransferFunction = vtkPiecewiseFunction()opacityTransferFunction.AddPoint(20,0.0)opacityTransferFunction.AddPoint(255,0.2)3 体元Mapper: vtkVolumeMappervtkVolume

31、RayCastMapper:设置射线合成函数: SetVolumeRayCastFunction(vtkVolumeRayCastFunction)设置梯度计算函数: SetGradientEstimator(vtkEncodedGradientEstimator)volumeMapper = vtkVolumeRayCastMapper()compositeFunction = vtkVolumeRayCastCompositeFunction()volumeMapper.SetVolumeRayCastFunction(compositeFunction)volumeMapper.SetI

32、nput(reader.GetOutput()(2) vtkVolumeProMapper用于VolumePro卡(3) vtkVolumeTextureMapper2D colorTransferFunction = vtkColorTransferFunction()colorTransferFunction.AddRGBPoint(0.0,0.0,0.0,0.0)colorTransferFunction.AddRGBPoint(64.0,1.0,0.0,0.0)colorTransferFunction.AddRGBPoint(128.0,0.0,0.0,1.0)colorTransf

33、erFunction.AddRGBPoint(192.0,0.0,1.0,0.0)colorTransferFunction.AddRGBPoint(255.0,0.0,0.2,0.0)reader = vtkStructuredPointsReader()reader.SetFileName(./ironProt.vtk)# Create transfer mapping scalar value to opacityopacityTransferFunction = vtkPiecewiseFunction()opacityTransferFunction.AddPoint(20,0.0)

34、opacityTransferFunction.AddPoint(255,0.2)# Create transfer mapping scalar value to colorcolorTransferFunction = vtkColorTransferFunction()colorTransferFunction.AddRGBPoint(0.0,0.0,0.0,0.0)colorTransferFunction.AddRGBPoint(64.0,1.0,0.0,0.0)colorTransferFunction.AddRGBPoint(128.0,0.0,0.0,1.0)colorTran

35、sferFunction.AddRGBPoint(192.0,0.0,1.0,0.0)colorTransferFunction.AddRGBPoint(255.0,0.0,0.2,0.0)# The property describes how the data will lookvolumeProperty = vtkVolumeProperty()volumeProperty.SetColor(colorTransferFunction)volumeProperty.SetScalarOpacity(opacityTransferFunction)# The mapper / ray cast function know how to render the dat

温馨提示

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

评论

0/150

提交评论