Лекция 8::Задача 2
- Forums:
Центриране
В SVN има добавена една сцена, върху която ще е домашното ви. Сцената е axe_test.fmiray, която ползва axe_lo.obj файл (съдържащ модел на брадва). Ако отворите OBJ файла и му разгледате върховете, ще забележите, че не са центрирани около началото на координатната система (0, 0, 0), а целия обект е преместен някъде с -5 по X и с +20 по Z (т.е. самата триъгълна мрежа не е зададена в "каноничен" вид, а е вече транслирана нанякъде). За съжаление, такива случаи са често срещани, и ще трябва да се справяме с тях. А от транслацията произлизат много проблеми:
- Въпреки, че според трансформацията на брадвата (във fmiray файла) е указано да стои някъде близо отдясно до сърцето, тя е доста далеч отзад
- Генерира се огромна обхващаща сфера, с радиус поне 20, за обект, чиито радиус не надвишава 3 (и рендера е бавен в следствие на което)
- Ротирането не работи както човек очаква. Тъй като след скалирането, брадвата е вече на 70 единици разстояние от началото на координатната система, то ротирането (например сменете yaw ъгъла на axeNode от -0.1 на -0.7) дори с малки ъгли дава големи премествания на обекта (който се движи по кръг с радиус 70)
За да се справим с всички тези проблеми, ще центрираме обекта около (0, 0, 0) директно след като го прочетем от OBJ файла. За целта:
- Трябва да намерим центъра на триъгълната мрежа. Един начин, който не е много прецизен, но върши работа в повечето случаи е да сумираме всички върхове на обекта (vertices) и да разделим на броя им (като пропускаме dummy-то на индекс 0). Т.е. трябва да се намери средноаритметично на vertices масива.
- Обекта трябва да се транслира така, че центъра му да попадне в (0, 0, 0), т.е. от всички върхове трябва да се извади намерения център
В резултат трябва да получите нещо като това: пример. При правилно реализиран алгоритъм, при променяне на ротацията на axe node-а, обекта се върти около центъра си, а не се премества на никъде. Подобно и за скалирането.
Бонус (1т):
Подобно на бонуса за група 0, направете вашия алгоритъм да се пуска само ако укажем изрично във fmiray файла. Добавете bool флагче recenter към Mesh и го инциализирайте с
false в Mesh конструктора. След което го регистрирайте в Mesh::registerProperties(). След което, алгоритъма ви трябва да сработва само ако имаме ред "recenter true" във блока, дефиниращ axe Mesh-а.
Супер бонус:
Измислете по-интелигентен начин за намиране на центъра на обекта (вижте в wikipedia за център на тежестта).
Comments
Как да намерим броя на
Как да намерим броя на върховете смисъл нямаме length има някакво max_size но нещо не тръгва така пробвах и да ги попвам с (pop_back макар да не съм сигурна как точно работи) докато изпразня масивчето и така да намеря големината но пак нещо не стана .. :/
Сега видях че си има size() ,а какво ще рече това "като пропускаме dummy-то на индекс 0" и другото което щях да питам е този алгоритъм го реализираме след като сме отворили файла нали така смисал при loadFromOBJ функция..?
1) Да, ползвате size(). 2)
1) Да, ползвате size().
2) Под dummy разбираме фиктивния връх, който сме сложили в индекс 0. Той служи за да работи правилно индексирането на OBJ-файла, тъй като там индексите започват от 1. Сиреч, за нашите цели, връх #0 трябва да го пропускаме, и действителния брой на върхове е vertices.size() - 1.
3) Да, в края на loadFromOBJ трябва да е.
Супер мерси много вече всичко
Супер мерси много вече всичко е наред :)
За втория алгоритъм с центъра
За втория алгоритъм с центъра на тежеста ми трябва да намирам маси по какъв начин да стане това..?
То това е супер бонуса, който
То това е супер бонуса, който е незадължителен. Трябва сами да си го помислите как да стане. Можете да приемете, че обека е изграден от равномерно плътен материал.