Домашни работи - лекция 5/medium (3т)
- Forums:
Вашата група = вашият факултетен номер MOD 3
За всички групи, задачата е да се реализира анимация. Понеже в момента рендера ни не е много бърз, можете леко да го ускорите по следните начини:
1) Включете оптимизациите на компилатора (за Visual Studio ползващите - компилирайте в Release, вместо в Debug)
2) Използвайте по-малък размер на кадъра: променете RESX и RESY от constants.h на (примерно) 320 и 240
3) Изключете anti-aliasing-а: от main.cpp сложете "wantAA = false"
Група 0:
Изберете си брой кадри, от които ще е съставена анимацията (например 30). Вкарайте renderScene() и displayVFB() във for-цикъл (който ще изцикля броя кадри). Във всеки кадър, освен тези две функции, вкарайте код, който взима Node-а със сферата (можете да го копирате в глобална променлива от generateScene()), и
1. Нулира трансформацията на Node-а (метода resetTransform() на Transform)
2. Задава ротация, в зависимост от текущия кадър (т.е. номера на кадъра трябва да се раздели на общия брой кадри, да се умножи по 2*PI, и да се зададе като yaw параметър на ротацията)
3. Транслира сферата с (125, 20, 96), т.е., където се очаква да бъде (копирайте кода от generateScene - т.е. той там вече не оказва влияние, тъй като ние изрично сменяме трансформацията на всеки кадър).
Крайният резултат трябва да е гладка анимация, в която кълбото със земята се върти и прави пълен оборот
Група 1:
Задачата е аналогична на група 0, само че, вместо да въртите сферата, ще движим една от подгеометриите на булевия обект. За целта
1. При създаването на едната сфера (тази, която ще участва във CsgInter - geometries[2]), копирайте указател към Sphere обекта някъде на удобно място
2. Анимацията ще представлява движение на тази сфера (което ще променя формата на булевия обект). В първия кадър, центъра на сферата да бъде в (0, 0, -22), а в последния кадър да е в (0, 0, +22), като междинните кадри представляват линейна интерполация между тези две позиции. Тъй като позицията на Sphere обекта е private, сложете метод setPos, който ви позволява да задавате позицията на центъра на сферата. Не е необходимо да пипате трансформацията на Node обекта, който държи CsgInter геометрията.
Крайният резултат трябва да е гладка анимация, при която булевият обект се "появява" от нищото и расте, след което постепенно изчезва откъм другата страна на невидимия куб. Можете да проверите и какъв ще е ефекта, като промените CsgInter на CsgDiff.
Група 2:
Задачата е аналогична на предните две, само че, вместо да движим някой от обектите, трансформираме UV координатите на пода (без да движим самият под). Добавете метод setRotation() на BitmapTexture, който приема double параметър от 0 до 2*PI. Този параметър ще задава ротация около точката (0.5, 0.4) с дадения ъгъл, в равнината на UV координатите. Самата ротация реализирайте, като във BitmapTexture::getColor() ротирате входните (info.u, info.v) координати с текущата ротация (вижте wikipedia относно ротационни матици). В generateScene() си копирайте първият BitmapTexture обект (текстурата за "пода") на някое удобно място. За всеки кадър
1. Извиквайте setRotation() метода на bitmap текстурата. Параметъра трябва да се движи от 0 (в първия кадър) до 2*PI (в последния кадър).
Добре е, вместо да смятате sin()/cos() на всяко извикване на getColor(), да си ги преизчислите в setRotation(). Освен това, на така преизчислените данни задайте подходящи стойности по подразбиране (във BitmapTexture конструктора), така, че ако не се вика setRotation() метода, ротацията да е нулева - т.е. текстурата върху сферата да не се променя при анимацията.
Крайният резултат трябва да е все едно "подът" се върти, с ос на въртене някъде изпод кълбото с планетата земя. Посоката на въртене не е от голямо значение.
Comments
Група 2: Извинявам се за
Група 2: Извинявам се за въпроса ,но немога да разбера кой е този даден ъгъл и как да го направя да ми задава ротация по определена точка
Ами има се предвид, че метода
Ами има се предвид, че метода setRotation() на BitmapTexture задава някакъв ъгъл на въртене - за него става въпрос. Самото извикване на setRotation() става в main(), в цикъла за анимацията. Според текущия кадър, се изчислява какъв да е ъгъглът. 0, за първия кадър, и 2*пи за последния.
какво стана с оценяването на
какво стана с оценяването на домашните?
пратил съм решение преди 2 дни :)
все още ни вест, ни кост :)
Patience, my young
Patience, my young padawn...
Иначе, гледам - в базата данни имаш 11 точки - какво повече искаш :)
Извинявай :) Просто помпах F5
Извинявай :)
Просто помпах F5 на gmail-a...
а между другото като проверя в базата ми пише все още
Домашно 5: 8 т.
май нещо не се е ъпдейтнало ...
Дай refresh на самата
Дай refresh на самата страница; и на мен ми се появяват такива дефекти, но refresh-а оправя нещата.