Страница была обновлена в феврале 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> |
На что смотрит пользователь? | <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 Планеты Земля:
Если виртуальная камера направлена на земную поверхность, а не в небо, рекомендуется использовать элемент <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. Полный порядок преобразований выглядит следующим образом:
- <altitude> – перемещение по оси Z на заданную высоту.
- <heading> – вращение вокруг оси Z.
- <tilt> – вращение вокруг оси X.
- <roll> – вращение вокруг оси Z (снова).
Обратите внимание на то, что при каждом вращении две оси камеры меняют ориентацию.