ДР 2013/Л6/Група1

В .pdf-а на края на 5-та лекция, и в коментарите към средната ви задача от предходното домашно (пак 1-ва група) загатнахме, че при Model трансформация, в която участва скалиране, за нормалата може да се наложи да вземем специални мерки. A ако сте реализирали Model трансформация в предишното домашно, можете направо да го "довършите" с решаването и на тази задача.

Нека да видим за какво иде реч: използвайте този код за сцена; имаме елипсоид, зададен чрез разтеглена (80, 30, 30) сфера. Неравномерното мащабиране не прави проблеми с геометрията или позицията, но нормалите са напълно объркани!

Какво, всъщност, се случва? Нека опростим нещата и гледаме в 2D.
Имаме нормалнo кръгче:


(показаният нормал по-скоро е (√½, √½))

Какво прави скалирането? Нека скалираме (×2, ×1) - това просто ще умножи X координатите на всички елементи (точки, вектори...) по две. В резултат:

Нормалът сочи напълно погрешно. Реално, неговата x-компонента би следвало дори да намалее!

Изгответе формула за геометрически правилно трансформиране на нормали.
Модифицирайте Node, Node::intersect() (и/или Transform класа, както намерите за добре), за да вкарате поправката. В резултат трябва да се получи нещо такова.

Задачката предполага малко геометрична главоблъсканица и/или ресърч в нета. При наличие на интерес, ще постна подсказка идните дни.

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

Comments

А къде в класа трансформ се

А къде в класа трансформ се дефинира нормалния вектор, или ние трябва да си го напишем ?

Няма

В Transform няма нормален вектор. Трябва да работите върху нормалния вектор на IntersectionData - в Node::intersect().