Directcomposition трансформация и анимация

В последната статия (msdn.microsoft.com/magazine/dn759437) Аз показа как може да се използва DirectComposition API заедно с Direct2D, за да получите най-доброто от двата свята - спаси графики режим (задържана режим) и директен режим (непосредствен режим). Примерен проект, който е включен в статия, илюстрирана тази концепция с просто приложение, което ви позволява да създадете един кръг, като ги движите прозореца и лесно да управлявате своя Z-ред. В тази статия искам да покажа колко лесно е да се добавят няколко впечатляващи ефекти с помощта на трансформация и анимация. На първо място, трябва да се разбере, че DirectComposition осигурява натоварените версии на много скаларни свойства. Вероятно сте забелязали, че ако ме последва през последните няколко месеца, когато проучвахме този API. Например, изместването на визуалното може да бъде настроен с използване на методите и SetOffsetX SetOffsetY:

Но интерфейса IDCompositionVisual, от която наследява IDCompositionVisual2, също така осигурява претоварване от тези методи, които вземат анимация обект, а не като стойност с плаваща точка. Този обект анимация материализира като интерфейс IDCompositionAnimation. Например, аз може да зададете отместването на визуални средства за един или два обекта в анимацията, в зависимост от това дали имам нужда анимация в една ос, или и двете:

Но механизмът на състава има много по-голям капацитет в анимацията. Визуализации поддържат и дву- и триизмерни трансформация. SetTransform визуален метод може да се използва за нанасяне на двумерен трансформира за дадена стойност скаларна:

Има DirectComposition всъщност разчита на матрица 3 × 2 са определени в Direct2D API. С него можете да извършвате различни операции, като например завъртане, превод, мащабиране и накланяне на визуалното. Това се отразява на координатната пространство, което се очаква на визуалното съдържание, но се ограничава до двумерен графика с оси X и Y. на

Естествено, IDCompositionVisual интерфейс осигурява претоварен метод версия SetTransform, но тя не приема анимация обект директно. Виждате ли, анимация обектът е отговорен за анимацията само една стойност за известно време. Matrix по дефиниция се състои от набор от ценности. Може би искате да анимирате на определен брой от своите членове, в зависимост от желания ефект. Затова е претоварена версия отнема SetTransform трансформира обект:

Това трансформиране на обекта, или по-скоро на различни интерфейси получени от IDCompositionTransform, осигурява натоварените методи, които вземат или скаларна стойност или обект анимация. По този начин, може да се определи матрица с анимационен ъгъл на завъртане на въртене, но с фиксирана точка и оси център. Какво точно искаш да анимирате, разбира се, да си най-лошото. Ето един прост пример:

Интерфейсът наследява от IDCompositionRotateTransform IDCompositionTransform и представлява двуизмерна трансформира, което засяга визуалната въртене около оста Z. Тук централна точка, аз зададете фиксирана стойност въз основа на определени стойности на ширина и височина, както и използването анимация обект за ъгъл контрол.

Това е основната шаблона. Описах само двуизмерен трансформация, но триизмерна трансформация до голяма степен работят по същия начин. Сега нека да се илюстрира практически пример показва как да използвате проекта от последния ми статия, и конвертиране на анимацията по различни начини с помощта на ръководителя Direct2D и Windows Animation.

След това, в метода SampleWindow CreateFactoryAndGeometry Ще взема Direct2D-фабрика за създаване на геометрията на правоъгълника вместо геометрия елипса:

Това е всичко. Останалата част от приложението просто използва черпене на геометрията да се изобразява и проверка на проникването, както преди. Резултатът е показан на фиг. 1.

Directcomposition трансформация и анимация

Фиг. 1. Илюстрация на трансформация и анимация се използва вместо кръгове квадрати

На следващо място, аз отивам да добавите прост манипулатор, за да се отговори на WM_KEYDOWN на съобщението. Методът на MessageHandler SampleWindow се обръщам към този израз, ако:

Фиг. 2. Аз съм обвързване устройство за възстановяване от загуба

В този момент, аз съм готов да експериментира с трансформации и анимации. Нека започнем с основен двумерен трансформира въртене. На първо място, трябва да се определи точката на центъра, който ще представлява Z-ос или точката, около която ще се проведе на въртенето. От DirectComposition очаква физически пиксел координати, мога да просто се обадете тук GetClientRect функция:

Тогава ние се извлече точка на клиентската област на прозореца център:

Освен това е възможно да се разчита на подкрепата на матрица функция Direct2D при проектирането на матриците, описващи трансформацията на двуизмерен въртене от 30 градуса:

И тогава просто попитайте трансформира имуществото на визуален и преминават промяна в дървото на визуални обекти. За простота ще използвам тази промяна до корена на визуално:

Разбира се, можете да използвате произволен брой промени в произволен брой визуални и състав механизъм се грижи за координацията на тези промени. Резултатите от този прост двуизмерен трансформация е показана на фиг. 3. Може би сте забелязали някои назъбванията (псевдоними). Въпреки Direct2D по подразбиране, извършва изглаждане (анти-псевдоними), тя приема, че изображението ще се появи в координатната пространство, което извършва постановяването му. Механизмът на състава не знае нищо за геометрия, използвайки се направи представяне на повърхността на състава, така че не е възможно да се коригира това. Във всеки случай, след като сместа се добавя към анимацията, псевдоними ще се види в изключително кратко време, и по този начин почти невидим.

Directcomposition трансформация и анимация

Фиг. 3. А просто двуизмерен трансформира

За добавяне на анимация на тази трансформация, е необходимо да се премахне структурата на матрицата за превръщане на състава. Ще замени D2D1_POINT_2F структура и D2D1_MATRIX_3X2_F трансформация въртене. Първо трябва да се създаде тази трансформация, като се използва устройство на състава:

(Имайте предвид, че дори такива привидно прости предмети трябва да бъдат премахнати, когато и ако устройството е изгубен и пресъздава.) Тогава настрои централната точка и ъгъл, като се използват методите на интерфейса вместо матрица структура на Direct2D:

И компилатор избира подходящата претоварен версия за процеса за преобразуване на състава:

За изпълнението на този код има същия ефект като на фиг. 3. Тъй като аз все още не са добавени анимацията. Създаване на анимация обект е достатъчно проста:

След това можете да използвате тази анимация обект вместо постоянни стойности за определяне на ъгъла:

Нещата стават малко по-интересни, когато се опитвате да се създаде анимацията. Обикновено анимация е сравнително прост. Както каза, анимацията, описан от кубически функции и задължително вълни. Този ъгъл може да бъде анимационен използва линеен преход, където се увеличава стойност от 0 до 360 секунди всеки, чрез добавяне на кубичен функция:

Третият параметър определя метод AddCubic съотношение линейно увеличение, така че да има смисъл. Ако бях оставил всичко по такъв начин, визуалното завинаги да се завърта на 360 градуса. Анимацията може да бъде спряно веднага след като ъгълът става равна на 360 градуса:

Първият параметър на Енд показва отместването от началото на анимацията, независимо от функцията за анимация. Вторият вариант - това е крайната стойност на анимацията. Имайте това предвид, както и анимация ще "прескочи" до тази стойност, когато е правилно избран стъпка, която ще доведе до визуален ефект на пробив.

В такива линейни анимации сравнително лесни за разбиране, но по-сложни анимации могат да бъдат прекалено сложни. Тук влиза в действие Windows Animation Manager. Вместо да предизвика различни методи IDCompositionAnimation, за да добавите синусоидалните сегменти кубически полином повтаряне сегменти, и така нататък. Г. сториборд анимация може да се строи с помощта на управителя на Windows Animation и библиотеки богати преходи (преходи). Получената анимация променлива се използва за запълване на анимация състава. Това изисква писмено малко повече код, но предимството - много повече възможности и контрол върху анимацията в заявлението. За да започнете, трябва да се създаде сам анимация мениджър:

Да, Windows Animation мениджър разчита на COM-активиране, така че не забравяйте да се обадите или CoInitializeEx RoInitialize да се инициализира издръжливостта й. Освен това, необходимостта от създаване на библиотека от преходи:

Като правило, приложението ще запази двата обекта по време на целия жизнен цикъл, тъй като те са необходими за непрекъсната анимация и най-вече за синхронизация (скорост съвпадение) скорост. След това трябва да създадете сториборд анимация (анимация сториборд):

Сториборд - какво свързва преходи с променлива анимация, и определя техните относителни графици за известно време. Сториборд в състояние да се сумират различни преходи, които се прилагат към различни променливи анимация; тя осигурява тяхната синхронизация и планирано като цяло. (Разбира се, можете да създадете множество сценарии за планиране на независими анимации.) Сега аз трябва да питате мениджъра да се създаде променлива анимация анимация:

След като сценария е планирано, Анимация мениджър е отговорен за поддържане на значимостта на дадена променлива, така че приложението може да задава въпроси към текущата стойност в момента. В този случай, аз просто използвате променливата анимация за запълване анимация състав сегмент, а след това да ги изтриете. Сега можете да използвате мощен преходи библиотеката, за да се създаде интересен ефект на преход за променливата анимация:

Преходът ще доведе до ускоряване на променлива анимация, и след това се забавя за предварително определен интервал, докато анимацията, е завършен с крайната си стойност. Приложна проценти влияят върху степента, в която сравнително бързо променлива ще ускори и след това да се забави. Имайте предвид, че комбинация от фактори, не може да надвишава 1. Подгответе преход променлива анимация, не мога да ги добавите към сценария:

Сега сториборд готов за планиране:

Единственият параметър на График докладва на планировчика текущото време на анимацията. Тя е по-полезно да се координират анимацията и синхронизирането му с честотата на опресняване, използван от състава на двигателя, но ще дойде по-удобно в момента. В този момент, анимацията "заредена" променлива, и мога да я помоли да попълните кривите анимация на състава:

В този случай тя е еквивалентна на, като че ли съм го направил тази анимация състав:

Там със сигурност изисква много по-малко код, отколкото с Windows Animation мениджър, но разбирам, че не е лесно в цялата тази математика. Windows Animation мениджър също така ви позволява да се координира и изпълнява плавно прехода между анимации, което е изключително трудно да се направи на ръка.