Камеры

Страница была обновлена в феврале 2009 г (добавлено описание элементов <gx:altitudeMode>, <gx:TimeStamp> и <gx:TimeSpan>).

Элемент <Camera>, впервые представленный в KML 2.2, позволяет определить положение, точку обзора и другие подобные параметры. <Camera> во многом напоминает <LookAt>, поскольку оба элемента отвечают за размещение и ракурс виртуальной камеры в пространстве. Разница заключается в том, что <LookAt> определяет вид относительно просматриваемой достопримечательности, а <Camera> – на основе положения и ориентации камеры.

Как <LookAt>, так и <Camera> расширяют абстрактный элемент <AbstractView>. <Camera> и <LookAt> определяются в KML-файле одинаково – как дочерние элементы любых элементов, основанных на <Feature> (Placemark, ScreenOverlay, GroundOverlay, PhotoOverlay, Folder, Document, NetworkLink), или как дочерние элементы элемента <NetworkLinkControl>. И <Camera>, и <LookAt> могут использоваться внутри <Feature>, но только не одновременно, поскольку виртуальная камера может быть только одна.

Отличия между элементами <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 --> 
           <!-- можно также использовать на gx:altitudeMode: clampToSeaFloor, relativeToSeaFloor -->
</LookAt>

На рисунке ниже схематически показано, как формируется угол обзора, определяемый элементом <LookAt>.

Схематическое представление параметров элемента <LookAt>

В таблице ниже перечислены вопросы, на которые позволяют ответить разные параметры элемента <LookAt>.

Вопрос
Способы определения в <LookAt>
На что смотрит пользователь? <longitude>, <latitude>,<altitude>, <altitudeMode>
Каково расстояние между пользователем и просматриваемым объектом? <range>
Направлена ли виртуальная камера на север (т. е. истинный север находится строго вверху экрана)? Если да, оставьте значение <heading> по умолчанию – 0. Если нет, укажите для <heading> значение вращения от 0 до 360°.
Смотрит ли камера строго вниз? Если да, оставьте значение <tilt> по умолчанию. Если нет, укажите для поворота камеры значение <tilt>, не превышающее 90°.
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, absolute -->  
       <!-- можно также использовать gx:altitudeMode: clampToSeaFloor, relativeToSeaFloor -->
</Camera> 

В таблице ниже перечислены вопросы, на которые позволяют ответить параметры элемента <Camera>.

Вопрос
Способы определения в <Camera>
В какой точке пространства расположена виртуальная камера? Расположение камеры определяется элементами <longitude>, <latitude>, <altitude> и <altitudeMode>. С такими широкими возможностями вряд ли есть смысл помещать камеру на земную поверхность.
Направлена ли виртуальная камера на север (т. е. истинный север находится строго вверху экрана)? Если да, оставьте значение <heading> по умолчанию – 0. Если нет, укажите значение от 0 до 360° по компасу.
Смотрит ли камера строго вниз? Если да, оставьте значение <tilt> по умолчанию – 0. Если нет, укажите для поворота камеры вокруг оси x значение от 0 до 180°. (Значение может быть и отрицательным, но в этом случае изображение будет перевернуто.)
Расположена ли камера горизонтально? Если да, оставьте значение <roll> по умолчанию – 0. Обратите внимание на то, что когда <roll> используется как дочерний элемент <Camera>, его значение обычно равно нулю. Теоретически можно указать любое значение от -180 до +180°, но на практике это встречается крайне редко.

На следующей схеме показаны оси X, Y и Z, определяющие ориентацию виртуальной камеры.

  • Ось X направлена вправо относительно камеры и называется вектором вправо.
  • Ось Y определяет направление на верхнюю часть экрана и называется вектором вверх.
  • Ось Z направлена из центра экрана в точку обзора. Камера направлена вниз по оси -Z, которая называется вектором обзора.

Ниже показан пример кода для элемента <Camera>, определяющего начальную точку обзора.

<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> могут содержать временные данные, от которых зависит отображение исторических изображений, солнечного света и объектов с временными метками.В <AbstractView> используются элементы <gx:TimeSpan> и <gx:TimeStamp>, определенные в пространстве имен расширений Google. Подробные сведения приведены в разделе Временные данные в AbstractView главы Время и анимация.

Примеры

Ниже проиллюстрированы разные способы вращения виртуальной камеры с помощью элемента <Camera>.

Направление

В этом примере для элемента <Camera> задано значение <heading> 90° (камера направлена на восток) и значение <tilt> 90° (камера направлена на горизонт). Камера расположена на высоте 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>
<!-- на восток -->
<tilt>90</tilt>
<!-- горизонтально -->
<altitudeMode>absolute</altitudeMode>
</Camera>
</Placemark> </Document> </kml>

А так это выглядит в графическом интерфейсе Google Планеты Земля:

Наклон

В этом примере для элемента <Camera> задано значение <tilt> 90° (камера направлена на горизонт). Для элементов <heading>, <altitude>, <altitudeMode> и <roll> оставлены значения по умолчанию.

<Camera> содержит значение <gx:TimeStamp>, от которого зависит отображение исторических изображений, солнечного света и объектов с временными метками. На картинке ниже солнечный свет включен, а мост просматривается 1 января 2009 года в 15:29 UTC (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 по умолчанию – 0 (значение altitudeMode по умолчанию – clampToGround) -->   
        <!-- значение heading по умолчанию 0 (на север) -->    
        <tilt>90</tilt>   
        <!-- горизонтально -->   
        <!-- значение roll по умолчанию – 0 -->    
        <!-- значение altitudeMode по умолчанию – clampToGround -->  
      </Camera>
    </Placemark>
  </Document>
</kml>

А так это выглядит в графическом интерфейсе Google Планеты Земля:

Поворот

В этом примере для <roll> задано значение 45°, т. е. камера повернута влево.

<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>
        <!-- на восток -->
        <tilt>90</tilt>
        <!-- горизонтально -->
        <roll>45</roll>
        <altitudeMode>absolute</altitudeMode>
      </Camera>
    </Placemark>
  </Document>
</kml>

Порядок преобразований

Также имеет значение порядок применения параметров ориентации. По умолчанию виртуальная камера направлена точно вниз по оси -Z, в сторону Земли. Прежде чем применяются вращения, камера устанавливается на определенной высоте, заданной элементом <altitude>, по оси Z. Полный порядок преобразований выглядит следующим образом:

  1. <altitude> – перемещение по оси Z на заданную высоту.
  2. <heading> – вращение вокруг оси Z.
  3. <tilt> – вращение вокруг оси X.
  4. <roll> – вращение вокруг оси Z (снова).

Обратите внимание на то, что при каждом вращении две оси камеры меняют ориентацию.

Наверх