![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2010
Сообщений: 57
|
Хочу сделать, для начала, псевдо освещение: имеется массив фейсов/полигонов/треугольников, все отсортированы и отобраны (culling негативный естессно). Так вот, как расчитать цвет заливки (типа тень) для каждого полигона, в зависимости как он повернут к обозревателю?
(для проецирования и рисования использую projectVectors и GraphicsTrianglePath). Последний раз редактировалось deamoK; 23.10.2010 в 16:09. |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
через dotProduct от нормали фэйса и вектора от фэйса к источнику света.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 57
|
поподробнее бы:
как находится нормаль фейса и вектор к источнику =\ |
|
|||||
|
Lorem ipsum
|
Нормаль треугольника ABC — это векторное произведение векторов AB и BC (или BC и CA, или CA и AB — главное соблюдать порядок вершин, иначе это будет нормаль к "затылку" треугольника).
Читаем про векторное произведение и, среди прочего, находим формулу: Так ты находишь нормаль. Следующая операция — найти косинус угла между нормалью и лучом света, падающим на треугольник. Для этого мы строим некий вектор L от любой из точек треугольника (у нас простая задача без интерполяций и без нахождения середины треугольника) до источника света (именно в этом направлении). Итак у нас есть два вектора: N = [ AB ] x [ BC ] и L. Для нас будет показательным косинус угла между ними (нам нужна четная функция) А косинус равен скалярному произведению векторов N и L деленному на произведение их длин: var Nd:Number = Math.sqrt( Nx*Nx + Ny*Ny + Nz*Nz ); var Ld:Number = Math.sqrt( Lx*Lx + Ly*Ly + Lz*Lz ); var NL:Number = Nx*Lx + Ny*Ly + Nz*Lz; var COSINUS:Number = NL / Nd / Ld; А уже косинус (точнее только его положительное значение) можно прямо использовать как степень освещенности треугольника. Хотя и отрицательное значение можно использовать для некоего фейка в плане ambient ligth =)
__________________
Поймай яблоко 2! |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|