![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2006
Сообщений: 27
|
Вот я решил сделать красивое освещение.
Должно получиться примерно так: [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]);
};
|
|
|||||
|
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
2 LiQuiDaToR:
Не совсем понятно... 1. Тень от какого обьекта? 2. На какой обьект должна падать тень от первого обьекта?
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Вероятно это куб, а крестик — источник света.
|
|
|||||
|
Регистрация: Sep 2006
Сообщений: 256
|
Цитата:
Есть два случая: 1) источник вне области квадрата; 2) источник в этой области; //тень от всех граней Если источник вне области, занимаемой квадратом, то все просто: стороны(в случае квадрата их может быть две), расстояние до центров которых минимально, не будут отбрасывать тени. Нужно найти набор расстояний(предельный чтоли) при котором источник находится внутри области квадрата. (как это сделать мне неизвестно, к сожалению) + p.s.Не претендую на абсолютную истину и проч. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|