1. 概述
KML的一个重要的应用方向就是三维建模。三维建模的基础就是XML技术的推广。KML语言也是一种类似XML的语言,通过KML所建立的模型遵循COLLADA技术规范。打开KML模型文件的文件夹,会发现一个*.dae文件,这是一个XML格式的文件,里面包含了XML定义的有关二维/三维模型各个地理对象的ID、脚点的相对位置、比例、大小、颜色、引用的材质图片位置等信息,这些信息被XML描述,并被封装成一个DAE文件,最终被另一个KML脚本文件调用,并显示在Google Earth或者Google Maps界面上。
通常情况下,基于Google Earth或者Google Maps的建模,有以下n种方法:
手工编辑 KML脚本文件。
采用AutoCAD或者3ds max等建模工具。建模之后,再通过第三方转换工具转换成 KML/KMZ文件。
采用支持Google地图直接建模的工具建模,例如Google SketchUp等工具。
Google Earth上直接绘制。
2. 建模
我们即将介绍的这个例子就是利用 Google SketchUp 工具建模的,然后导出成为
KML/KMZ文件。选择使用 SketchUp的原因在于可以边建模,边在Google Earth上观看模型摆放的效果,而且操作也不是很难,容易上手。关于Google SketchUp的具体操作,我们在以后的段落中会详细介绍。
利用SketchUp建模的具体操作步骤如下。
首先要确定将构筑模型的长宽比例,最好在草稿上先用铅笔勾勒一个大致的三维透视图,并且确定一下你需要显示的长、宽、高。在 KML调用三维模型的时•候,可以通过如下代码:
< x> 1< / x>
< y> 1< / y>
< z > 1</ z>
< / Sca I e>
在以上KML代码中,用户可以通过<Scale>节来调整比例,但是如果需要构筑的模型不止一个,那么可以事先做好大致的一个图框。
然后需要做的就是将你头脑中的模型实施到 SketchUp上去。SketchUp 素有建筑草稿纸的称谓,熟练的用户几乎可以随心所欲地使用简单命令来构筑三维模型。SketchUp跟许多其他的主流三维建模软件不太一样的地方就是构图的主界面,像3ds max、Maya等著名建模软件的建模主窗口通常会有4个子窗口,其中3个子窗口表示三维构建模型的3个面 (表示模型的正视、侧视、俯视)。而Google SketchUp则提供了一个灵活的透视模拟窗口,更加接近人的观察效果,没有经过严格绘图训练的用户也能很快适应。
Google SketchUp还提供了一个很有用的功能——素材资料库。这个资料库是个在线的网络资料库,处于不断地更新之中,有各种KML/KMZ的模型文件,看到需要引用的模型时,可以直接单击后下载。
三维模型的资料窗口其实是一个Web浏览器页面,可以通过这个窗口连接到 Google的官方网站获取资源。
用户也可以采用 IE 浏览器的登录方式http:1/sketchup.google.com/3d warehouse/。
这个网点就有上面的资料窗口所引用的内容。
SketchUp提供了几个基本构件元素,例如方形、圆形、圆弧、线条。这些基本的元素是构成复杂图形的基础,按钮是SketchUp工具栏的一部分。
线条可以作为建筑物的基准线,方形可以作为建筑物的主体,圆形可以作为特殊装饰线甚至作为绘制复杂图形的辅助线。使用的基本原则与手工在草稿纸上绘图相同,运用这些基本元素需要用户具有一定的绘画技巧。至于基本图形元素工具的使用,这 不做详细介绍。 SketchUp 还有另一个比较实用的功能,就是拉伸工具。这个功能可以将平面图形拉伸成三维立体模型。例如楼梯的构造,就无须每层都绘制一个三维长方体,只需要绘制一个侧面,然后拉伸即可。
伸工具的使用非常方便。首先绘制一个基本平面形状。然后再使用拉伸工具针对这个形状拉伸。由于是三维空间,所以用户往上下两个方向拉伸都可以。拉伸相当于赋一个高度值给这个长方形,使得长方形成为长方体。
拉伸功能有自动锁定的功能,该功能会智能判断鼠标当前所处的立面,然后锁定目前的立面作为拉伸面,锁定后用户单击鼠标就可以了。有时候会发生错误锁定的情况,不一定能够确定所要的拉伸面。这时有个技巧,通过鼠标滚轮可以进行缩放,放大到自动锁定需要拉伸的面的状态。
另一个体现 SketchUp 三维透视功能的工具是旋转工具。通过旋转主画板窗口上会呈现不同角度的透视效果,通过旋转,可以看到不同的透视视角。
3. 构造房屋
前面介绍了SketchUp建模的优势,就是和Google Earth结合紧密,可以直接将模型部署到Google Earth卫星图片上,并且也可以以三维的方式展现出来。这一点极大地方便了城市规划、建筑设计等专业人员对建筑物设计规划的把握,建模无须传统的沙盘,直接在计算机上模拟即可。
首先构思一下三维建筑物是由几个基本几何图形构成的。因为对于Google SketchUp来说,所有的三维物体都可以用几个最基本的几何图形构成,点、线、面是技基本的要素,而体只是面的拉伸。在Google SketchUp 中首先要确定好三维物体的长、宽、高,这也是任何一个物体所应该具备的。
这是一座房子的基本模型,有门柱、门廊和屋顶。这些稍微复杂点的模型其实都是通过分解1茨不同的几个部分,然后用最基本的长方形、圆形拉伸后得到的。最后再拼接成一个完整的建筑物模型。
绘制屋顶的结构,就要先绘制一个方形,然后利用拉伸工具拉伸成长方体。通过绘制屋顶的巾脊梁线,产生一个支撑面,此时线条的重要性就凸显出来了。其作用是作为辅助线,然后通过构筑斜面,产生一个基本的屋顶形状。
“拆除”了屋顶覆盖面之后,就可以清楚地看到里面的原有结构了。同样,在门厅的屋顶和柱子也是这样画出来的。
删除了柱子之后,可以看到上下两个面都凹陷出了两个圆形的“j间”,这是因为柱子其实是圆形拉伸后的结果,然后在其上加上门廊屋顶和底座的。
门廊中的阶梯也是通过弧形和长方形拉伸后得到的,作为弧形和长方形,首先要规划和设计好摆放的位置和各自之间的距离关系,确定楼梯里面的高度,从正面拉伸就可以了。这种绘制的方法是正面拉伸法;绘制楼梯还有一种方法是从侧面进行拉伸,就是先绘制楼梯的侧视固,然后从侧面拉伸楼梯,最终获得类似楼梯的阶段上升的平面。
整体透视图反映了房子与人的位置关系和比例关系 (这里为了戳图需要特定放大了人,缩小了房子),其实拉伸后的“体”(例如长方体、圆柱体)是空心的。
在内部也可以放置子模型,甚至还可以在本例中的房子里放置家具。
在SketchUp和Google Earth 中都可以进入“体”的内部一探究竟。如图 3-56所示的这幅内部局部观察图,就很好地反映出内部结构的细节。
虽然作为“草稿纸”的SketchUp可能不关注内部的细节,但是作为设计时的参考依据,有时候也要考虑到内部的结构和效果的,可以进入建筑模型内部看看。
该建筑物模型的组成基本元素包括线条和面,例如直线条、阑弧线条、圆圈、正方形面、长方形面、不规则多边形面等。这些线条和面最终被XML描述,保存成*.dae文件。下面是一个典型的DAE文件代码片段:
( ?>= ml ver s i on= " 1 . 0 " encoding= " ut f - 8 " ? >
< COL LADA xm1ns = " ht tp = / / www . co I lad a . org / 2 0 0 5 / 1 1 / COL LAD A SChema " ver s ion= " 1 . 4 . 1 " >
< I ibrary-geomet ries>
< geomet ry id= " mesh 17 - geomet ry " name= " mesh 17 - geomet ry " >
< me sh>
< source id= "mesh 17 -geometry-position" >
< f loat-array id= "mesh 17 -geometry-posit ion-array '
35.360373 503.484049 8.500000 35.190002
502.189953 8.500000 35.859875 504.689953
8.500000 36.654468 505.725487 8.500000
8.500000 40.190002 507.189953 8.500000
41.484098 507.019582 8.500000 42.690002
506.520080 8.500000 43.725536 505.725487
< / f loat-array>
< technic Iue-common>
count= Ilt 0 5 " >
<acceSsor 章ource=llllmeshl7—geometry—position—array
cotlSt= " 3 5 " str ide=
3 .1>
< par am name= " X " type = " f loat " / >
<param name = "Y”type ="f:Loat"/>
< par am name= " Z " type= " f loa t " / >
< / acces sor >
< / techniq Lie-common>
< / soIr ce>
< vertices id= "mesh 17 -geometry-vertex " >
< input s emant i c = " p0S '. TION " source= " {} me sh 1 7 - geomet ry -pos i t i on " / >
< / ve r t i c e s >
<lines material=’,ForegroundColor,’ count =I’35,1>
<input semantic =”VER?'EX”source=”井mesh:L7 -geometry-vertex " offset ="0"/>
< p> 0 1 2 0 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14
16 上 51 工7 16 18 17 19 18 20 19 21 20 22 2 王 23 22 1 23 24 23 25 22 26 21 27 20 28 19 29 18
30 171 3 王 16 32 15 33 14 34 工3 </p>
< / lines>
< / mesh>
< / geomet ry>
</ library-vi sual-scenes >
< scene>
<instance一vistlal一scene url = "llSketchUpScene”/>
< / SCene>
< / COL LADA>
对 DAE 文件的解释显然已经超出了本书讨论的范围,这里就不再赞述了,请参考有关COLLADA协议的资料。
DAE模型文件对Google Earth的意义很重要,Google Earth的模型协议去执行的。模型建立好之后,需要通过 KML 脚本来加载。加载的是遵从 COLLADA式有许多种,有湿合多个模型的KML脚本,也有单个模型的KML脚本。以下是一个KML调用DAE文件的代码:
< ? xm1 ver s i on= " 1 . 0 " encodi ng= " UTF- 8 " ? >
<kml xmlns = "http://earth.google. c()m/kml/2.1“>
< F' o1der>
< name> SP review2< / name>
这段代码说明了模型是采用 SketchUp建立的:
<description><:[CDATA [Created with <a href-”http://sketchup. gOogle. com/ ">Goog:Le
SketchUp 6.0.5:L5</a>】1 ></description>
以下这段代码定义了观察的角度和位置:
< LOOk At >
< longi tude>- 10 5 . 2 828 1 03 7 2 9 04 5</ longi tude>
< latitude> 40 . 017119 3 47 6 9671</ lati tude>
< altitude> 0 . 0915423 16716 16 65 8< / a1titude>
< range> 4 5 . 2 7 6 9 0 52 8 17 4 5 7< / range>
< tilt> 89.' 88420000000001</ tilt>
< heading> 2 7 8 . 92 6< / heading>
< / L00]< At >
< Folder>
< longitude>- 10 5 . 2 828103 72 9 O4 5</ 10ngitude>
< latitude> 4 0 . 017119347 69 67 1</ latitude>
< altitude> 0 . 0915423167 1616 65 8< / a1titude>
< range> 4 5 . 2 7 6 9 0 52 8 17 4 57 < / range>
< ti1t> 89.88420000000001</ t ilt>
< heading> 2 7 8 . 9 2 6< / heading>
< / LOOk At>
< / Place mark>
< / Fo lder >
以下是调用模型的代码:
< Place mark>
< name>! ode I < / name>
<Style id=”defau:Lt“>
< / Sty I e>
<Model id= "model_3”>
< alt i tudeMode> relat iveTOGround< / alt i tudeMode>
< Locat ion>
< longi tude>- 105 . 2 8 3 </ longi tude>
< I at i tude> 4 0 . 0 17</ I at i tude>
< alt i tude> 0< / alt i tude>
< / Locat ion>
< Or ientat ion>
< heading> 0< / heading>
1 < tilt> 0</ tilt>
< ro1 I> 0< / ro11>
< / Orientjit ion>
< Scale>
< x> 1< / x>
< y> 1< / y>
< z> 1</ z>
< / Scale>
这里是调用在根目录files子目录下的SPreview2.dae模型文件
< Link>
< href> files/ SP review2 . dae< / href>
< / Link>
< / Mode 1>
:</Placemark>
用Google SketchUp建模的代码如下:
< Do curnent Sour ce > Sket chUp< / Document Source>
< / Fol1der>
.( / kn1>
然后利用“Get Current View”和“Place Model”这两个功能将模型“放置”到Google Earth的卫星图片上,然后就可以在Google Earth上配合地形和建筑物周边的地貌进行观察,并在不断地修改后进行部署。如此循环,直到得到一个满意的建筑模型为止。
SketchUp的这种智能部署三维模型的功能,其实原理是通过生成KML/KMZ文件,然后通过调用Google Earth加载的。
本例以一个三维的建筑物模型为例子,从构思到如何使用 Google SketchUp来建立模型都做了深入的探讨。通过建模工具结合KML语言调用,最终展示在Google Earth地图之上,完成了一个实用的建筑物建模规划的微型项目。