Главная » Silverlight » Перспективные преобразования

0

В Silverlight нет полнофункционального набора инструментов для трехмерного ри­сования, но есть средства перспективных преобразований, позволяющие имитировать трехмерные поверхности. Как и при обычном преобразовании, объект перспективного преобразования манипулирует внешним видом существующего двухмерного элемента, проецируя его на повернутую поверхность. В результате манипуляций элемент выгля­дит так, будто он находится на трехмерной поверхности.

весьма полезны, однако им далеко до реальных трехмерных моделей. Их главный, самый очевидный, недостаток состоит в том, что пре­образованию подвергается только одна фигура — плоский прямоугольник, на котором размещены элементы. Сравните: в действительно трехмерных моделях для построения сложных поверхностей используются крошечные совмещаемые треугольники. Для по­лучения их координат и освещенности применяются сложные математические форму­лы, требующие огромного объема вычислений. Мощные средства реального трехмерно­го моделирования есть в WPF.

Примечание. Если вам нужны всего лишь несколько трюков, чтобы имитировать простые трехмерные эффекты, не затрачивая слишком много труда, вам понравятся средства перспективного преобразования, встроенные в Silverlight. Они особенно полезны в сочетании с анимацией (см. главу 10). Однако если вам необходимы настоящие трехмерные модели, перспективного преобразования вам будет явно недостаточно.

В Silverlight определен абстрактный класс Transform, наследуемый всеми класса­ми двухмерных преобразований. Аналогично этому, все классы проецирования на­следуют абстрактный класс System.Windows .Media. Projection. В настоящий момент Silverlight поддерживает два класса проецирования: PlaneProjection, который рассма­тривается в данной главе, и намного более сложный Matrix3DProjection, в котором преобразования определяются с помощью трехмерных матриц. В данной книге класс Matrix3DProjection не рассматривается. Если хотите поэкспериментировать с ним, за­грузите со страниц www.tinyurl.com/m29v3q и www.tinyurl.com/laalp6 примеры кода, созданные Чарльзом Петцольдом (Charles Petzold).

Класс PlaneProjection

Класс PlaneProjection позволяет поворачивать и смещать плоское изображение в трехмерном пространстве. Трехмерную плоскость можно повернуть вокруг оси X, Y или Z. На рис. 9.13 показан поворот плоского изображения на 45° вокруг разных осей.

На рис. 9.13 элемент повернут вокруг своей центральной точки. С помощью свойств объекта PlaneProjection можно настроить параметры поворота.

• Свойство RotationX определяет угол поворота вокруг оси X. Свойство CenterO- fRotationX содержит координату X центра поворота в относительных единицах. При значении 0 центр находится в крайней левой точке, 1 — крайней правой, 0.5 — посредине (это значение установлено по умолчанию).

Рис. 9.13. Поворот изображения с помощью класса PlaneProjection

•       Свойство RotationY определяет угол поворота вокруг оси Y. Свойство CenterO- fRotationY содержит координату Y центра поворота в относительных единицах. При значении 0 центр находится в крайней верхней точке, 1 — крайней нижней, 0.5 — посредине (это значение установлено по умолчанию).

•       Свойство RotationZ определяет угол поворота вокруг оси Z. Свойство CenterO- fRotationZ содержит координату Z центра поворота в относительных единицах. При значении 0 центр находится посредине (это значение установлено по умол­чанию), при положительном значении центр находится перед элементом, а при отрицательном — за элементом.

Во многих случаях свойства поворота — единственное, что вам нужно будет изме­нить при использовании объекта PlaneProjection. Однако элемент, кроме этого, мож­но еще и сместить. Существует два способа смещения.

•       Свойства GlobalOff setx, GlobalOf fsetY и GlobalOf fsetz определяют перемеще­ние элемента в экранных координатах перед операцией проецирования.

•       Свойства LocalOffsetX, LocalOffsetY и LocalOffsetz определяют перемещение элемента в преобразованных координатах после операции проецирования.

Когда элемент еще не повернут, глобальные и локальные свойства имеют одинако­вые значения. Увеличение GlobalOffsetX или LocalOffsetX приведет к смещению эле­мента вправо. Предположим, объект был повернут вокруг оси Y с помощью свойства RotationY (рис. 9.14). Теперь увеличение GlobalOffsetX приведет к смещению отобра­женного содержимого вправо (как и в предыдущем случае, когда элемент не был повер­нут), однако увеличение LocalOffsetX приведет к смещению не точно вправо, а вдоль новой оси X, которая теперь указывает новое трехмерное направление. В результате, со­держимое будет смещено вправо и вверх.

Применение проецирования

Операцию проецирования можно применить почти к любому элементу Silverlight, по­тому что каждый класс, производный от UIElement, имеет необходимое для этого свой­ство Projection. Чтобы получить для элемента эффект перспективы, нужно создать объ­ект PlaneProjection и присвоить его свойству Projection в коде или разметке XAML.

Рис. 9.15. Поворот и смещение элемента в трехмерном пространстве

<TextBlock>BBeдите данные:</TextBlock> <TextBox></TextBox>

<Button Margin="0, 5" Content=-"OK"></Button> <Image Source="happyface.jpg" Stretch="None">< /Image> </StackPanel>

</Border>

Объект PlaneProjection можно настроить с помощью кода С#, однако в данном при­мере используется связывание данных {см. главу 2). Объект PlaneProjection не явля­ется элементом, поэтому применить в нем выражение связывания нельзя. Выражение связывания вставлено в элемент Slider. Для передачи углов обратно в объект прое­цирования, когда пользователь перетаскивает ползунок, используется двустороннее связывание. Ниже приведена разметка ползунка X.

CTextBlock Margin="5">Rotation></TextBlock>

<Slider Grid.Column="l" Minimum="-180" Maximum="180" Value="{Binding RotationX, Mode=TwoWay,

ElementName=projection}"></Slider>

Если повернуть элемент вокруг оси X или У на угол более 90°, можно увидеть его с обратной стороны. Надстройка Silverlight считает, что элементы имеют прозрачную подложку, поэтому с обратной стороны символы выглядят, как зеркально отраженные (такое поведение существенно отличается от поведения трехмерных моделей WPF, в ко­торых подложка по умолчанию считается пустой). В Silverlight интерактивные элемен­ты, повернутые обратной стороной, продолжают работать, как обычно: реагируют на щелчки мышью, получают фокус, принимают текст с клавиатуры и т.д.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии