Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Освещение (http://www.flasher.ru/forum/showthread.php?t=85818)

LiQuiDaToR 01.10.2006 05: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]);
};


Хемуль 01.10.2006 05:59

2 LiQuiDaToR:
Не совсем понятно...
1. Тень от какого обьекта?
2. На какой обьект должна падать тень от первого обьекта?

etc 01.10.2006 12:44

Вероятно это куб, а крестик — источник света.

LiQuiDaToR 03.10.2006 05:26

2 Хемуль:
Есть такая игра, Gish называется. Вот там именно такое освещение.
вот

D12 03.10.2006 21:31

Цитата:

Есть такая игра, Gish называется. Вот там именно такое освещение.
всю прошел =)

lowka 03.10.2006 22:53

Цитата:

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

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

Можно посчитать расстояния от источника до центров сторон квадрата.
Есть два случая:
1) источник вне области квадрата;
2) источник в этой области; //тень от всех граней

Если источник вне области, занимаемой квадратом, то все просто:
стороны(в случае квадрата их может быть две), расстояние до центров которых минимально, не будут отбрасывать тени.

Нужно найти набор расстояний(предельный чтоли) при котором источник находится внутри области квадрата. (как это сделать мне неизвестно, к сожалению)
+
p.s.Не претендую на абсолютную истину и проч.


Часовой пояс GMT +4, время: 10:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.