![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2004
Сообщений: 7
|
Вопрос - Каким образом можно решить такую проблему.
Есть цвет, заданный в 16-ричной форме (вынимается их XML, неважно откуда он взялся). Нужно средствами AS нарисовать парралелипипед, чтобы одна видимая сторона была заполнена заданным цветом, а две другие - тем же цветом, но с другой яркостью - немного темнее. (Другими словами - нужен эффект тени, как можно задать 2 новых цвета, - чуть темнее основного). |
|
|||||
|
[+1.3 05.04.09]
|
/* НА ОСНОВЕ исходника 3D CUBE ((C) 2002 Grigory A. Ryabov | http://www.flash.plux.ru) */ /* ULTRAFLASHER */ // ------------------------------------------------------------------------- // // // ## ## ## ########## ###### ###### TM // ## ## ## ## ## ## ## ## // ## ## ## ## ## ## ## ## // ## ## ## ## ####### ######## // ###### ###### ## ## ## ## ## // // В этом примере куб рисуется на самом деле всего из трёх граней. // Задние грани просто не рисуются, потому что они не видны. // А можно рисовать все 6 граней и сортировать их по средней Z координате // каждой грани. Но это уже другая история. Сначала пойми этот код. // _root.onLoad = function() { // координаты центра клипа cnx = 250; cny = 250; // дистанция от точки просмотра до центра мировых координат (0, 0, 0) dist = 200; // размеры куба var sx = 30; var sy = 30; var sz = 30; // коэффициент перевода радиан в градусы и обратно rad = Math.PI/180; // объявляем массив вершин v = new Array(); // инициализируем вершины v[0] = {x:sx, y:-sy, z:sz}; v[1] = {x:sx, y:sy, z:sz}; v[2] = {x:sx, y:sy, z:-sz}; v[3] = {x:sx, y:-sy, z:-sz}; v[4] = {x:-sx, y:-sy, z:-sz}; v[5] = {x:-sx, y:sy, z:-sz}; v[6] = {x:-sx, y:sy, z:sz}; v[7] = {x:-sx, y:-sy, z:sz}; // задаём количество вершин amount = v.length-1; }; _root.onEnterFrame = function() { // вычисляем углы поворота var xa = (cnx-_ymouse)*0.0005; var ya = (cny-_xmouse)*0.0005; // вычисляем косинусы и синусы углов, что бы не делать одно и тоже в цикле var sinY = Math.sin(xa); var cosY = Math.cos(xa); var sinX = Math.sin(ya); var cosX = Math.cos(ya); // цикл перебора всех вершин и вращения их вокруг осей x и y for (var i = 0; i<=amount; i++) { // вращение yp = v[i].y*cosY-v[i].z*sinY; zp = v[i].y*sinY+v[i].z*cosY; xp = v[i].x*cosX+zp*sinX; zp = -v[i].x*sinX+zp*cosX; // запоминаем получившиеся координаты v[i].x = xp; v[i].y = yp; v[i].z = zp; // преобразование перспективы perRatio = 1/(v[i].z/dist+1); v[i].rx = cnx+v[i].x*perRatio; v[i].ry = cny-v[i].y*perRatio; } // удаляем ранее нарисованные объекты _root.clear(); // ------------------------------------------------------------------------- // -- заливка грани #00 // ------------------------------------------------------------------------- // массив очередной грани a = [3, 2, 1, 0]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } // ------------------------------------------------------------------------- // -- заливка грани #01 // ------------------------------------------------------------------------- // массив очередной грани a = [2, 3, 4, 5]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } // ------------------------------------------------------------------------- // -- заливка грани #02 // ------------------------------------------------------------------------- // массив очередной грани a = [7, 6, 5, 4]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } // ------------------------------------------------------------------------- // -- заливка грани #03 // ------------------------------------------------------------------------- // массив очередной грани a = [0, 1, 6, 7]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } // ------------------------------------------------------------------------- // -- заливка грани #04 // ------------------------------------------------------------------------- // массив очередной грани a = [7, 4, 3, 0]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } // ------------------------------------------------------------------------- // -- заливка грани #05 // ------------------------------------------------------------------------- // массив очередной грани a = [1, 2, 5, 6]; // размерность массива d = a.length-1; // если грань видна, то.. if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) { // обнуляем теневую переменную shadow = 0; // цикл вычисления цвета тени for (var i = 0; i<=d; i++) { shadow += (v[a[i]].rx-v[a[i]].ry); } // делим на колличество точек в грани shadow = 140+shadow/(d+2); // стиль линии _root.lineStyle(0, 0x000000, 100); // стиль заливки _root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100); // начальная точка _root.moveTo(v[a[0]].rx, v[a[0]].ry); // перебор всех точек грани for (var i = 1; i<=d; i++) { _root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry); } // конец заливки _root.endFill(); } }; stop();
__________________
Бойтесь китайцев, компы приносящих! |
|
|||||
|
[+1.3 05.04.09]
|
а если по легче то так но работает только для таких цветов как 0x000000,0xcccccc,0x333333 ну и для простых тоже будет рабоать только shadow не должна быть больше меньшего из
r g b да и цвет придется передовать в трех переменных но это тое можно решить r = 0xFF;
g = 0xFF;
b = 0xFF;
_root.createEmptyMovieClip("muv1", 1);
with (_root.muv1) {
lineStyle(0, 0x000000, 100);
beginFill(r << 16 | g << 8 | b << 0, 100);
moveTo(0, 0);
lineTo(100, 0);
lineTo(100, 100);
lineTo(0, 100);
lineTo(0, 0);
endFill();
}
// shadow насколько зделать темнее
shadow = 0x12;
r1 = r-shadow;
g1 = g-shadow;
b1 = b-shadow;
_root.createEmptyMovieClip("muv2", 2);
with (_root.muv2) {
lineStyle(0, 0x000000, 100);
beginFill(r1 << 16 | g1 << 8 | b1 << 0, 100);
moveTo(100, 0);
lineTo(200, 0);
lineTo(200, 100);
lineTo(100, 100);
lineTo(100, 0);
endFill();
}
__________________
Бойтесь китайцев, компы приносящих! |
|
|||||
|
Регистрация: Feb 2004
Сообщений: 7
|
2 орех: Отлично, получил. что хотел. Большое спасибо.
|
![]() |
Часовой пояс GMT +4, время: 02:01. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|