9. 外观模型
除了空间属性之外,CityGML 的特征还有外观—要素表面的可观察属性。外观并不局限于视觉数据,而且可以 表达被称为主题的任意类别,如红外辐射、噪声污染或地震引起的结构应力。每个LOD可以为一个特定的主题定 义一个单独的表象。一个外观由每个表面几何对象的数据组成即表面数据。一个表面几何对象可以有多个主题的 表面数据。同样,表面数据也可以由多个表面几何对象共享(如道路铺装)。最后,表面数据值既可以在整个表 面上是恒定的,也可以随表面内的确切位置移动而变化。 CityGML 的外观模型是在扩展模块外观中定义的( 参见第 7 章)。外观模型UML图如图14所示,XML 模式定义见附件A.2。
CityGML的外观模型的UML图。前缀用来表示与模型元素相关联的 XML 命名空间,没有前缀的元 素名称是在 CityGML 外观模块中定义的
在CityGML的外观模型中,主题只用一个标识符来表达。一个城市模型的外观对于一个给定的主题来说,是由一 组引用这个主题的外观对象来定义的。因此,属于同一主题的外观对象组成了一个虚拟组。它们可以被包含 在CityGML数据集的不同位置。此外,一个CityGML数据集可能包含多个主题。一个外观对象收集了与特定主题 相关的表面数据,可以是单个要素,也可以是任何LOD中的整个城市模型。表面数据由类_SurfaceData及其子 类的对象来表达,每个对象都涵盖了表面几何对象的整个区域。表面数据和表面几何对象之间的关系由URI(统 一资源标识符)链接表示,从一个_SurfaceData 对象到一个类型为 gml: AbstractSurfaceType或类型gml: MultiSurface。
固定的表面属性被建模为材质,随表面位置变化的表面属性被建模为纹理。每个表面几何对象可以在每个主题和 侧面同时拥有一个材质和一个纹理。这允许同时提供一个恒定的近似值和一个复杂的表面属性测量值。一个应用 程序负责为其任务(如分析或渲染)选择合适的属性表示。具体的混合没有定义,因为这超出了CityGML的范 围。如果一个表面几何对象要接收多个纹理或材质,每个纹理或材质都需要一个单独的主题。主题的混合或其用 法在 CityGML 中没有定义,由应用程序自行决定。
XML命名空间
CityGML外观模块的XML命名空间由统一资源标识符(URI) http://www.opengis.net/citygml/appearance/ 2.0 定义。在外观模块的XML 模式定义中,这个URI也被用来标识默认的命名空间。
9.1. 外观、要素和几何图形之间的关系
尽管表面数据和表面之间有密切的关系,但表面数据是单独存储在要素中的,以保留原始的GML几何模型。表面 数据不是各自目标表面几何对象的属性,而是每个表面数据对象保持一组URI,指定目标面几何对象的gml:ids( 类型为gml: AbstractSurfaceType或gml: MultiSurface)。在复合或集合目标表面的情况下,表面数据对象被 分配给所有包含的表面。其他目标类型如要素、实体或gml: AbstractSurfacePatchType(包括gml: Triangle) 是无效的,尽管XML模式语言不能正式表达对URI目标类型的约束。对于表面数据值到表面补丁的确切映射功能 ,请参考各自的表面数据类型描述。
有效的目标类型限制为gml: AbstractSurfaceType和gml: MultiSurface,不包括基于GML几何模型和在CityGML 中使用的gml: AbstractSurfacePatchType。一般来说,GML的表面是用gml: AbstractSurfaceType的子类来表 示。这样的表面要求是连续的。一个gml: MultiSurface不需要满足这个要求,因此它不是gml: AbstractSurfaceType(参见8.1)。由于获得的真实世界的表面往往不能保证是连续的,CityGML允许gml: MultiSurface在不同的地方表示一个要素的边界,作为连续表面的替代。为了类似于gml: CompositeSurface来 处理这些表面,表面数据对象被允许链接到gml: MultiSurface对象。因此,一个gml: AbstractGMLType(它包 括gml: Triangle和gml: Rectangle)不能接收一个gml:id,也不能被引用。
每个表面几何对象的每个主题最多可以有一个有效的正面材料、一个有效的背面材料、一个有效的正面纹理和一 个有效的背面纹理。如果多个表面数据对象被分配到一个表面几何对象上,会选择一个激活。由于嵌套的表面定 义而产生的多个间接分配是通过覆盖来解决的,例如,一个gml:Polygon的正面材质是通过覆盖其父 代gml:CompositeSurface的正面材质而激活。多重直接分配即一个表面几何对象的gml:id在一个主题中,不允 许被多次引用,并通过在冲突的表面数据对象中选择一个来解决实现依赖的问题。因此,需要避免在一个主题中 进行多次直接分配。
每个_CityObject要素都可以存储表面数据。因此,表面数据排列在CityGML数据集的要素层次中。然后,表面 数据使用URI链接到其目标面。尽管这个链接机制允许在要素层次结构中链接到另一个要素表面,建议仍遵循局 部性的原则。表面数据的存储方式应使链接的表面只属于包含的城市对象要素及其子对象。“全局性的”表面数 据应该与城市模型一起存储。遵循定位原则还可以确保从WFS中检索的CityObjects包含相应的外观信息。
定位原则允许下面的算法找到所有相关的_SurfaceData对象,在一个给定的_CityObject中引用表面几何对象( 类型为gml: AbstractSurfaceType或gml: MultiSurface)。
清单1:找到所有相关的_SurfaceData对象的算法,这些对象是在一个给定的_CityObject中指定表面几何 对象(类型为gml: AbstractSurfaceType或gml: MultiSurface)。
对_SurfaceData对象的isFront属性的评估需要考虑到gml: OrientableSurfaces,因为它们可以翻转一个表面的 方向。假设一个gml: OrientableSurfaces os,它翻转了它的基本表面bs。一个以bs为目标的正面纹理t将出现 在bs的实际正面上。如果t的目标是os,它将出现在bs的背面。如果t同时以os和bs为目标,它就会出现在bs的 两边,因为它成为了正面和背面的纹理。
XLinks影响了伪代码中的层次结构遍历。一般来说,表面数据和几何对象的分离需要重新评估表面数据的分配, 因为每次出现几何对象的时候,都需要在相应的_CityObject的背景中进行评估。在算法中逐步提高(几何体 或_CityObject)的层次结构,即为了这个算法的目的,被引用的对象在概念上被复制到所指的XLink的位置。特 别是,这适用于隐式几何对象。如果一个隐式几何对象包含GML几何(在relativeGMLGeometry属性中),表 面数据的分配就需要在每个引用的_CityObject的背景中被重新评估。因此,一个给定的隐式几何对象的外观( 非相对几何图形)可能会在其出现的时候有所不同。如果所有需要的表面数据对象被放置在__外观_对象中,并 且后者被储存在外观对象中,则会产生一致的外观结果:
1. 在包含原始隐式几何的_CityObject中,用XLinks引用所有隐式几何中引用的_CityObject中的相同外观 对象,或
2. 在全局的CityModel中。
9.2. 外观和表面数据
特征类Appearance定义了一个表面数据对象的容器。它提供了所有包含的表面数据对象都与之相关的theme。 一个CityGML文件中所有具有相同主题的外观对象被认为是一个组。表面数据对象被存储 在surfaceDataMember属性中。它们可以作为远程属性同时在多个主题中使用。 特征类__SurfaceData是材 质和纹理的基类。它唯一的元素是布尔标志isFront,它决定了一个表面数据对象适用于哪一表面。请注意,外 观模型的所有类都支持CityGML的ADE机制(参见第6.12和10.13章)。应用特定扩展的钩子是由元 素"_GenericApplicationPropertyOf … "实现的。
AppearanceType, Appearance, AppearancePropertyType
appearanceMember, appearance
appearanceMember的定义允许在一个城市模型特征集合中任意排列_CityObject 特征和Appearance特征(参见第10.1章)。
为了在一个单一的_CityObject特征中存储外观信息,核心模块的相应抽象类_CityObject是由外观属性元素来扩 展的。这个额外的外观属性是使用CityGML的应用领域扩展机制扩展到_CityObject中的(参见第10.13章)。 通过这种方式,_CityObject的每个主题子类都继承了这个属性。因此,外观模块对每个定义_CityObject 的 主题子类的扩展模块都有影响。
AbstractSurfaceDataType, __SurfaceData, SurfaceDataPropertyType
9.3. 材质
材质定义的光反射属性对整个面几何对象来说是不变的。X3DMaterial类的定义来自X3D和COLLADA规范(参 考X3D、COLLADA规范)。diffuseColor定义了漫反射光的颜色。 specularColor定义了镜面反射的颜 色。emissiveColor是表面自身的颜色。所有的颜色都使用RGB值,红、绿、蓝的取值在0和1之间。透明度是使 用transparency元素单独定义的,其中0代表完全不透明,1代表完全透明。ambientIntensity定义了在不考虑光源的情况下,漫反射颜色的最小百分比。shininess控制镜面高光的锐度。0产生柔和的光亮,而1则产生鲜明 的高光。isSmooth给出了法线插值的提示。如果这个布尔标志被设置为 "true",顶点法线应该被用于着色 (Gouraud着色)。否则,法线在面补丁是不变的(平面着色)。
目标表面是由目标元素指定的。每个元素包含一个目标面几何对象的URI(类型为gml: AbstractSurfaceType 或gml: MultiSurface)。
X3DMaterialType, X3DMaterial
9.4. 纹理和纹理映射
纹理的抽象基类是_Texture。CityGML中的纹理总是基于栅格的2D纹理。栅格图像由imageURI使用URI指定, 可以是一个任意的图像数据资源,甚至是一个预先格式化的网络服务的请求。图像数据格式可以使用mimeType 元素中的标准MIME类型来定义。
纹理可以由textureType属性来限定。textureType区分了特定对象的(特定)纹理和该对象表面的典型(典型 )原型纹理。纹理也可以被分类为unknown。
纹理包装的规范是采用COLLADA标准。当访问底层图像栅格外部的纹理时,需要进行纹理包装。 wrapMode可 取以下五个值之一(图15说明了这些包装模式的效果)。
1. none - 产生的颜色是完全透明的
2. wrap - 纹理被重复
3. mirror - 纹理被重复并镜像化
4. clamp - 纹理被夹在其边缘上
5. border - 产生的颜色由borderColor元素指定(RGBA)
在包装模式的mirror中,纹理图像在水平和垂直方向上都是重复的,类似于包装模式的wrap填补纹理空间。 与wrap不同的是,每次重复的结果都是沿着重复的方向翻转前一个纹理部分。这种做法消除了包装纹理的边缘 的约束,并形成一个无缝的纹理。
一个纹理(a)使用不同的包装模式应用于一个外墙。(b)无,(c)包装,(d)镜像,(e)管 夹和(f)边界。边界颜色为红色。数字表示纹理坐标
AbstractTextureType, __Texture, WrapModeType, TextureTypeType
根据纹理参数化,即从表面上的一个位置到纹理图像中的一个位置的映射函数,_Texture被进一步专门化。City GML使用纹理空间的概念,纹理图像总是占据[0,1] 2 区域,而不考虑实际的图像大小或长宽比。图像的左下角 位于原点(有些图形API可能使用其他约定,需要进行纹理坐标转换)。必须知道每个面几何对象的映射函数, 才能接受纹理。
应用于地面和屋顶的地理参考纹理
GeoreferencedTexture类描述了一个使用平面投影的纹理。因此,使用GeoreferencedTexture对垂直表面设置 纹理是没有意义的。这样的纹理具有独特的映射功能,通常与图像文件一起提供(如地理参考的TIFF)或作为单 独的ESRI世界文件。外部地理参考的搜索顺序是由布尔标志preferWorldFile决定的。如果这个标志被设置为 "true"(其默认值),首先会寻找世界文件,只有在没有找到的情况下才会使用图像数据的地理参考。如 果preferWorldFile为“false”,那么只有在没有图像数据的地理参考的情况下才会使用世界文件。