镜头

2009年2月更新:添加了有关 <gx:altitudeMode>、<gx:TimeStamp> 和 <gx:TimeSpan> 的内容。

KML 2.2中引入了 <Camera>,该元素提供了另一种指定观察者视点和相关视图参数的方式。<Camera><LookAt> 相似,因为这两种元素都用于定义虚拟镜头查看地球时所处的位置和方向。区别在于,LookAt 会根据查看的景点来指定视图。相比之下,Camera 则会根据观察者的位置和方向来指定视图。

<LookAt><Camera> 都扩展自 <AbstractView> 元素,该元素是个基本抽象类型。<Camera><LookAt> 在 KML 文件中的用法相同,即用作一个派生自 <Feature>(Placemark、ScreenOverlay、GroundOverlay、PhotoOverlay、Folder、Document、NetworkLink)的任意元素的子元素,或用作 <NetworkLinkControl> 的子元素。您可以在某地图项内使用 <Camera><LookAt>,但不能同时使用这两个元素(即只有一个虚拟镜头可以指定当前视点)。

<Camera><LookAt> 之间的区别

新的 <Camera> 元素可以让您更加灵活地指定视图。最重要的是,您可以倾斜镜头视图,以便越过地平线观察星空。<Camera> 可以提供全面而自由的视角,以全景六度来控制视图,因此您可以在空间中定位镜头,然后将它绕着 X、Y 和 Z 轴旋转。如果未指定旋转值,则这两个元素的作用是相同的:

<Camera>       
  <longitude>-121</longitude>       
  <latitude>37</latitude>       
  <altitude>2000</altitude>
  <altitudeMode>clampToGround</altitudeMode>     
</Camera> 
<LookAt>
  <longitude>-121</longitude>
  <latitude>37</latitude>
  <altitude>2000</altitude>
  <altitudeMode>clampToGround</altitudeMode>
</LookAt>

以下部分对 <LookAt> 元素进行了简短回顾,以便您对比它和新的 <Camera> 元素各自的用法。

<LookAt> 回顾

<LookAt> 元素用于指定地球上正被查看的点、景点与视点间的距离以及视图的角度。该元素的语法如下:

<LookAt id="ID">
  <longitude></longitude>                       <!-- kml:angle180 -->   
  <latitude></latitude>                         <!-- kml:angle90 -->   
  <altitude>0</altitude>                        <!-- double -->    
  <range></range>                               <!-- double -->   
  <tilt>0</tilt>                                <!-- float -->   
  <heading>0</heading>                          <!-- float -->   
  <altitudeMode>clampToGround</altitudeMode>    
           <!--kml:altitudeModeEnum:clampToGround, relativeToGround, absolute --> 
           <!-- or, gx:altitudeMode can be substituted: clampToSeaFloor, relativeToSeaFloor -->
</LookAt>

下图展示了 <LookAt> 视点的构建方式:

显示 LookAt 元素参数的图表

<LookAt> 元素可指定以下问题的答案:

问题
<LookAt> 中的规范
当前在查看什么目标? <longitude>、<latitude>、<altitude>、<altitudeMode>
视点距景点有多远? <range>
视图方向是否是北面朝上? 如果是,则使用默认的 <heading> 值0。如果不是,请指定一个0(不含)到360°的 <heading> 旋转值
视图方向是否直指地球? 如果是,则使用默认的 <tilt> 值。如果不是,镜头将向上朝着地平线;请指定一个不大于90°的 <tilt> 旋转值。
90°表示直接沿着地平线看过去(如果您离地球表面很远,而且 <tilt> 值为90°,那么您可能看不到地球表面)。

示例

以下是一个 <Placemark> 示例,其中包含 <LookAt> 元素:

<Placemark>
<name>Machu Picchu, Peru</name>
<LookAt>
<longitude>-72.503364</longitude>
<latitude>-13.209676</latitude>
<altitude>0</altitude>
<range>14794.882995</range>
<tilt>66.768762</tilt>
<heading>71.131493</heading>
</LookAt>
<styleUrl>#msn_icon12</styleUrl>
<Point>
<coordinates>-72.516244,-13.162806,0</coordinates>
</Point>
</Placemark>

以下是 Google 地球中显示的地标:

Google 地球中马丘比丘地标的截图

如果您的查看方向与地球相交,请使用 <LookAt> 元素,因为指定该元素比指定 <Camera> 要稍微容易一些。

<Camera> 的子元素

<Camera> 元素可以在空间中的任意位置定位视点,并且可以沿任意方向旋转视图。该元素的语法如下:

<Camera id="ID">    
  <longitude>0</longitude>          <!-- kml:angle180 -->     
  <latitude>0</latitude>            <!-- kml:angle90 -->    
  <altitude>0</altitude>            <!-- double -->    
  <heading>0</heading>              <!-- kml:angle360 -->    
  <tilt>0</tilt>                    <!-- kml:anglepos180 -->    
  <roll>0</roll>                    <!-- kml:angle180 -->    
  <altitudeMode>clampToGround</altitudeMode>
       <!-- kml:altitudeModeEnum: relativeToGround, clampToGround, or absolute -->  
       <!-- or, gx:altitudeMode can be substituted: clampToSeaFloor, relativeToSeaFloor -->
</Camera> 

<Camera> 元素可指定以下问题的答案:

问题
<Camera> 中的规范
镜头位于空间中的什么位置? 将镜头放置在由 <longitude>、<latitude>、<altitude> 和 <altitudeMode> 指定的点处。通常情况下,将镜头放置在地面上不是明智的做法。
镜头的朝向能否确保视图是北面朝上? 如果是,则使用默认的 <heading> 值0。如果不是,请参照罗盘的点旋转镜头,旋转值范围为0(不含)到360°。
镜头方向是否直指地球? 如果是,则使用默认的 <tilt> 值0。如果不是,请旋转镜头(旋转值范围为0到180°),来指定绕 X 轴旋转的角度(<tilt> 值可以为负值,但这会导致视图上下颠倒)。
通过镜头观看景物时,镜头是否水平? 如果是,则使用默认的 <roll> 值0。请注意:<roll> 用作 <Camera> 的子元素时,其值通常为0。您可以指定一个介于−180到+180°之间的值,但这种用法很少见。

下图显示了附加到虚拟镜头的 X、Y 和 Z 轴。

  • X 轴指向镜头右侧,称为“向右矢量”。
  • Y 轴定义相对于屏幕的“向上”方向,称为“向上矢量”。
  • Z 轴从屏幕的中心指向视点(镜头沿着 −Z 轴方向俯瞰),称为“查看矢量”。

以下示例将 <Camera> 设置为 <Document> 内的起始视点:

<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Golden Gate tour</name>
<open>1</open>
<Camera>
<longitude>-122.4790</longitude>
<latitude>37.8110</latitude>
<altitude>127</altitude>
<heading>18.0</heading>
<tilt>85</tilt>
<altitudeMode>absolute</altitudeMode>
</Camera> </Document> </kml>

该视点在 Google 地球中显示为:

AbstractView 中的时间

<Camera><LookAt> 均可包含时间信息,时间信息会对历史图像、光照以及标有时间的所有对象产生影响。<gx:TimeSpan><gx:TimeStamp> 可在 AbstractView 中使用,并包含在 Google 扩展元素命名空间中。有关详情,请参见时间和动画一章中的使用 AbstractView 指定时间部分。

示例

以下示例展示了不同的 <Camera> 旋转角度。

方位

本示例显示了一个方位为90度(向东)并倾斜90度(向地平线)的 <Camera>。该镜头位于海拔100米的位置。

<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Placemark>
<name>100m looking east</name>
<Camera>
<longitude>-122.4783</longitude>
<latitude>37.8120</latitude>
<altitude>100</altitude>
<heading>90</heading>
<!-- east -->
<tilt>90</tilt>
<!-- level -->
<altitudeMode>absolute</altitudeMode>
</Camera>
</Placemark> </Document> </kml>

在 Google 地球中的结果为:

倾斜

以下示例使用向地平线倾斜90度的 <Camera>。该示例中,<heading><altitude><altitudeMode><roll> 均采用默认值。

<Camera> 包含 <gx:TimeStamp> 值;该值会对历史图像、光照以及标有时间的所有对象的显示产生影响。下图启用了光照效果,并且 <Camera> 查看该地点的时间为世界协调时间2009年1月1日下午3:29(当地时间为上午7:30)。

<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">
  <Document>
    <Placemark>
      <name>At ground level</name>
      <Camera>
        <gx:TimeStamp><
          when>2009-01-01T15:29:27Z</when>
        </gx:TimeStamp>
        <longitude>-122.4783</longitude>
        <latitude>37.8120</latitude> 
        <!-- altitude default is 0 (default altitudeMode is clampToGround) -->   
        <!-- heading default is 0 (north) -->    
        <tilt>90</tilt>   
        <!-- level -->   
        <!-- roll default is 0 -->    
        <!-- altitudeMode default is clampToGround -->  
      </Camera>
    </Placemark>
  </Document>
</kml>

该视点在 Google 地球中显示为:

滚动

本示例使用值为45度的 <roll> 元素,这会使镜头转向左侧。

<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">
  <Document>
    <Placemark>
      <name>Roll left</name>
      <Camera>
        <gx:TimeStamp><
          when>2009-01-01T15:29:27Z</when>
        </gx:TimeStamp>
        <longitude>-122.4783</longitude>
        <latitude>37.8120</latitude>
        <altitude>100</altitude>
        <heading>90</heading>
        <!-- east -->
        <tilt>90</tilt>
        <!-- level -->
        <roll>45</roll>
        <altitudeMode>absolute</altitudeMode>
      </Camera>
    </Placemark>
  </Document>
</kml>

转换顺序

旋转的顺序很重要。默认情况下,镜头沿 −Z 轴垂直俯瞰地球。在执行旋转之前,镜头会沿 Z 轴转换到 <altitude>转换顺序如下:

  1. <altitude> - 沿 Z 轴转换到 <altitude>
  2. <heading> - 绕 Z 轴旋转。
  3. <tilt> - 绕 X 轴旋转。
  4. <roll> -(再次)绕 Z 轴旋转。

请注意,每次进行旋转时,两条镜头轴都会改变方向。

返回页首