Показать сообщение отдельно
Старый 04.02.2004, 22:17
opex вне форума Посмотреть профиль Отправить личное сообщение для opex Найти все сообщения от opex
  № 2  
opex
 
Аватар для opex

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