Свет флеш граней.


Рассчитать угол между гранью и нормалью.

Раньше мне казальсь, что освещенность грани может зависеть от координаты z грани, и это может быть так, если источник света находится близко к объекту, получается такой прикольный мультяшный свет эффект, однако солнышко так далеко от нас но грани все равно имеют различные оттенки, поэтому свет грани зависит от угла на который повернута грань относительно источника света, проведя серию небольших экспериментов и почитав форум flasher.ru и старую книгу по си Виктор Порев "Компьютерная графика", получились более менее скоростные результаты. Для расчета потребуется нормаль. Для расчета нормали к грани необходимы любые три точки находящиеся на поверхности грани.

Расчет нормали.

	var normal:Vector3D = new Vector3D(
		(_v2.y - _v1.y) * (_v3.z - _v1.z) - (_v3.y - _v1.y) * (_v2.z - _v1.z),
		(_v2.x - _v1.x) * (_v3.z - _v1.z) - (_v3.x - _v1.x) * (_v2.z - _v1.z),
		(_v2.x - _v1.x) * (_v3.y - _v1.y) - (_v3.x - _v1.x) * (_v2.y - _v1.y));

Расчет угла между нормалью и источником света.

Источником света служит солнце, которое в миллиардах километрах от земли, те. свет без силы, но с направление по оси Z
normal.normalize();
ang = Math.abs(norm.dotProduct(new Vector3D(0,0,-1)));

Расчет цвета грани по коэффициенту освещенности.

В общем имеем цвет maxColor, у которогу будем уменьшать цветовые составляющие в зависимости от угла поворота грани _k
var rMax:uint = maxColor >> 16 & 0xFF;
var gMax:uint = maxColor >> 8 & 0xFF;
var bMax:uint = maxColor & 0xFF;
var r:uint;
var g:uint;
var b:uint;
r = rMax * _k;
b = bMax * _k;
g = gMax * _k;
var color:uint = ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);
Что-бы быстро нарисовать трехмерную флеш фигуру, совсем не нужно рисовать грани, которые не видно, в случае с кубом, номер проходит на ура, для этого нужно в проекции грани определить среднюю точку спроектированного рисунка грани и сфоткать один писксель в битмап дата уже нарисованные грани рисунка, если битмап дата будет пустой, то рисуем грань. Конечно грани перед этим нужно отсортировать по координате z.
Да немного мутновато, но начало верное. Архив, содержит проект расчета освещенности граней (FlashDevelop).