Тема: Освещение
Показать сообщение отдельно
Старый 01.10.2006, 05:27
LiQuiDaToR вне форума Посмотреть профиль Отправить личное сообщение для LiQuiDaToR Найти все сообщения от LiQuiDaToR
  № 1  
Ответить с цитированием
LiQuiDaToR

Регистрация: Jan 2006
Сообщений: 27
Cool Освещение

Вот я решил сделать красивое освещение.
Должно получиться примерно так:

[IMG]http://img182.**************/img182/2743/21kp4.png[/IMG]

Пока всё, что получилось - вот

Не могу понять, как выбрать стороны по ктотрым рисовать тень.

Вот, собственно, код:

Код:
import flash.geom.Point;
var lights = new Array();
var objs = new Array();
var rad = Math.PI/180;
lights.push(new Point(Stage.width/2, Stage.height/2));
objs.push({pos:new Point(0, 0), size:50, r:0});
_root.createEmptyMovieClip("render", 0);
function drawRBox(coners) {
	render.lineStyle(2, 0x000080, 50);
	render.moveTo(corners[0].x, corners[0].y);
	render.lineTo(corners[1].x, corners[1].y);
	render.lineTo(corners[2].x, corners[2].y);
	render.lineTo(corners[3].x, corners[3].y);
	render.lineTo(corners[0].x, corners[0].y);
}
function getRBoxCorners(pos, size, rot) {
	return new Array(new Point(pos.x+Math.cos(rot-45*rad)*size, pos.y+Math.sin(rot-45*rad)*size), new Point(pos.x+Math.cos(rot+45*rad)*size, pos.y+Math.sin(rot+45*rad)*size), new Point(pos.x+Math.cos(rot+135*rad)*size, pos.y+Math.sin(rot+135*rad)*size), new Point(pos.x+Math.cos(rot+225*rad)*size, pos.y+Math.sin(rot+225*rad)*size));
}
function calcCorners(corners) {
	corners2 = new Array();
	for (i=0; i<4; i++) {
		v = corners[i].subtract(lights[0]);
		corners2[i] = {vec:v.add(lights[0]), len:v.length};
	}
	corners2.sortOn("len", 16); // TODO разобраться с сортировкой
}
function drawShadow() {
	render.lineStyle(2, 0x800000, 50);
	render.beginFill(0x800000, 25);
	v = corners2[0].vec;
	render.moveTo(v.x, v.y);
	v2 = v.subtract(lights[0]);
	v2.normalize(400);
	v2 = v2.add(lights[0]);
	v2.subtract(v);
	render.lineTo(v2.x, v2.y);
	v = corners2[1].vec;
	render.moveTo(v.x, v.y);
	v2 = v.subtract(lights[0]);
	v2.normalize(400);
	v2 = v2.add(lights[0]);
	v2.subtract(v);
	render.lineTo(v2.x, v2.y);
	v = corners2[2].vec;
	render.moveTo(v.x, v.y);
	v2 = v.subtract(lights[0]);
	v2.normalize(400);
	v2 = v2.add(lights[0]);
	v2.subtract(v);
	render.lineTo(v2.x, v2.y);
	v = corners2[3].vec;
	render.moveTo(v.x, v.y);
	v2 = v.subtract(lights[0]);
	v2.normalize(400);
	v2 = v2.add(lights[0]);
	v2.subtract(v);
	render.lineTo(v2.x, v2.y);
	render.endFill();
}
Point.prototype.toCursorSmooth = function() {
	this.x += (_xmouse-this.x)/20;
	this.y += (_ymouse-this.y)/20;
};
function drawCross(pos) {
	render.lineStyle(2, 0x008000, 50);
	render.moveTo(pos.x-5, pos.y-5);
	render.lineTo(pos.x+5, pos.y+5);
	render.moveTo(pos.x+5, pos.y-5);
	render.lineTo(pos.x-5, pos.y+5);
}
function drawLine(from, to) {
	render.moveTo(from.x, from.y);
	render.lineTo(to.x, to.y);
}
onEnterFrame = function () {
	render.clear();
	objs[0].r += Math.PI/180;
	objs[0].pos.toCursorSmooth();
	corners = getRBoxCorners(objs[0].pos, objs[0].size, objs[0].r);
	drawRBox(corners);
	calcCorners(corners);
	drawShadow();
	drawCross(lights[0]);
};