ДР/2011/Л6/Зад. 0
- Forums:
В началото на лекция 6 (на презентациите е в края на 5.pdf) загатнахме, че при Model трансформация, в която участва скалиране, за нормалата може да се наложи да вземем специални мерки. Нека да видим за какво иде реч: използвайте този код за сцена; имаме елипсоид, зададен чрез разтеглена (80, 30, 30) сфера. Неравномерното мащабиране не прави проблеми с геометрията или позицията, но нормалите са напълно объркани!
Какво, всъщност, се случва? Нека опростим нещата и гледаме в 2D.
Имаме нормалнo кръгче:
(показаният нормал по-скоро е (√½, √½))
Какво прави скалирането? Нека скалираме (×2, ×1) - това просто ще умножи X координатите на всички елементи (точки, вектори...) по две. В резултат:
Нормалът сочи напълно погрешно. Реално, неговата x-компонента би следвало дори да намалее!
Изгответе формула за геометрически правилно трансформиране на нормали.
Модифицирайте Node, Node::intersect() (и/или Transform класа, както намерите за добре), за да вкарате поправката. В резултат трябва да се получи нещо такова.
Задачката предполага малко геометрична главоблъсканица и/или ресърч в нета. При наличие на интерес, ще постна подсказка идните дни.
Тествайте дали решението ви работи за общия случай. Добавете към трансформацията на сферата друго скалиране, ротации, или (примерно) комбинация от скалиране-ротация-скалиране-ротация. Вашето решение трябва да се справя с всички възможни случаи.