Регистрация: Sep 2003
Адрес: Где-то рядом.
Сообщений: 686
|
 Код:
/* НА ОСНОВЕ исходника 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();
__________________
Бойтесь китайцев, компы приносящих!
|