Home > 梅原 > Cubes

Cubes

20090805
Category:梅原 /Tags:

Cubes3年以上前に作ったもの。なんとなくそれっぽい面の明るさや陰面消去をやり始めた頃。

今見ると内部の計算の仕方がかなり半端だけど、出来上がった絵柄自体は気に入っている。
AS3版に作り直そうとしたけど、半端な実装がかえっていい味なので、挫折。

umhr_cubes1

AS3版を作ろうとしたら結局、先日のQbicQubeになった。

▼ActionScript AS1(FP6):ステージサイズ800*600でタイムラインの1フレーム目に書く。

Stage.scaleMode = "noScale";
vp = 500;
ar_data = new Array([0, 0, 0], [160, 0, 0], [100, 0, 0]);
ar_rxyz = new Array(0, 1, 2, 3, 4, 5);
ar_n = new Array([1, 1, 1], [-1, 1, 1], [-1, -1, 1], [1, -1, 1], [1, 1, -1], [-1, 1, -1], [-1, -1, -1], [1, -1, -1]);
ar_m = new Array([1, 1, 1], [1, -1, -1], [-1, -1, 1], [-1, 1, -1], [-1, -1, 1], [-1, 1, -1], [1, 1, 1], [1, -1, -1]);
function fc_render() {
	ar_position = new Array([0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]);
	n = new Number();
	n = Math.sqrt(ar_data[2][0]*ar_data[2][0]+ar_data[2][1]*ar_data[2][1]+ar_data[2][2]*ar_data[2][2]);
	if (n == 0) {
		n = 0.1;
	}
	m = new Number();
	m = Math.sqrt(ar_data[1][0]*ar_data[1][0]+ar_data[1][1]*ar_data[1][1]+ar_data[1][2]*ar_data[1][2]);
	if (m == 0) {
		m = 0.1;
	}
	for (var j = 0; j<8; j++) {
		ar_rxyz[0] = m*ar_n[j][0];
		ar_rxyz[1] = m*ar_n[j][1];
		ar_rxyz[2] = m*ar_n[j][2];
		ar_rxyz[3] = rotate_x1;
		ar_rxyz[4] = rotate_y1;
		ar_rxyz[5] = rotate_z1;
		fc_remap(ar_rxyz[0], ar_rxyz[1], ar_rxyz[2], ar_rxyz[3], ar_rxyz[4], ar_rxyz[5]);
		var n_remapx = ar_remap[0];
		var n_remapy = ar_remap[1];
		var n_remapz = ar_remap[2];
		for (var i = 0; i<8; i++) {
			k = j*8+i;
			ar_rxyz[0] = n*ar_n[i][0];
			ar_rxyz[1] = n*ar_n[i][1];
			ar_rxyz[2] = n*ar_n[i][2];
			ar_rxyz[3] = rotate_x2*ar_m[j][0];
			//+rotate_x1;
			ar_rxyz[4] = rotate_y2*ar_m[j][1];
			//+rotate_y1;
			ar_rxyz[5] = rotate_z2*ar_m[j][2];
			//+rotate_z1;
			fc_remap(ar_rxyz[0], ar_rxyz[1], ar_rxyz[2], ar_rxyz[3], ar_rxyz[4], ar_rxyz[5]);
			ar_position[k][0] = ar_data[0][0]+n_remapx+ar_remap[0];
			ar_position[k][1] = ar_data[0][1]+n_remapy+ar_remap[1];
			ar_position[k][2] = ar_data[0][2]+n_remapz+ar_remap[2];
		}
	}
	for (var i = 0; i<ar_position.length; i++) {
		fc_pertrans(ar_position[i][0], ar_position[i][1], ar_position[i][2]);
		ar_position[i][0] = ar_pertrans[0];
		ar_position[i][1] = ar_pertrans[1];
		ar_position[i][2] = ar_pertrans[2];
	}
	ar_sq = new Array();
	for (var j = 0; j<8; j++) {
		for (var i = 0; i<6; i++) {
			var k = j*8;
			var kk = j*6;
			var n_xx = (ar_position[ar_sqd[i][0]+k][0]+ar_position[ar_sqd[i][1]+k][0]+ar_position[ar_sqd[i][2]+k][0]+ar_position[ar_sqd[i][3]+k][0])/4;
			var n_yy = (ar_position[ar_sqd[i][0]+k][1]+ar_position[ar_sqd[i][1]+k][1]+ar_position[ar_sqd[i][2]+k][1]+ar_position[ar_sqd[i][3]+k][1])/4;
			var n_zz = (ar_position[ar_sqd[i][0]+k][2]+ar_position[ar_sqd[i][1]+k][2]+ar_position[ar_sqd[i][2]+k][2]+ar_position[ar_sqd[i][3]+k][2])/4;
			var n_xxyyzz = Math.sqrt(n_xx*n_xx+n_yy*n_yy+(vp*5-n_zz)*(vp*5-n_zz));
			n_xxyyzz = 10000000-n_xxyyzz*1000;
			var n_cx = (ar_position[ar_sqd[i][0]+k][1]-ar_position[ar_sqd[i][3]+k][1])*(ar_position[ar_sqd[i][1]+k][2]-ar_position[ar_sqd[i][0]+k][2])-(ar_position[ar_sqd[i][0]+k][2]-ar_position[ar_sqd[i][3]+k][2])*(ar_position[ar_sqd[i][1]+k][1]-ar_position[ar_sqd[i][0]+k][1]);
			var n_cy = (ar_position[ar_sqd[i][0]+k][2]-ar_position[ar_sqd[i][3]+k][2])*(ar_position[ar_sqd[i][1]+k][0]-ar_position[ar_sqd[i][0]+k][0])-(ar_position[ar_sqd[i][0]+k][0]-ar_position[ar_sqd[i][3]+k][0])*(ar_position[ar_sqd[i][1]+k][2]-ar_position[ar_sqd[i][0]+k][2]);
			var n_cz = (ar_position[ar_sqd[i][0]+k][0]-ar_position[ar_sqd[i][3]+k][0])*(ar_position[ar_sqd[i][1]+k][1]-ar_position[ar_sqd[i][0]+k][1])-(ar_position[ar_sqd[i][0]+k][1]-ar_position[ar_sqd[i][3]+k][1])*(ar_position[ar_sqd[i][1]+k][0]-ar_position[ar_sqd[i][0]+k][0]);
			n_c = Math.acos(n_cy/Math.sqrt(n_cx*n_cx+n_cy*n_cy+n_cz*n_cz))/Math.PI;
			n_c = Math.round(Math.abs(n_c-0.5)*500);
			n_c = n_c*256*256+n_c*256+n_c;
			ar_sqmini[i] = [ar_position[ar_sqd[i][0]+k], ar_position[ar_sqd[i][1]+k], ar_position[ar_sqd[i][2]+k], ar_position[ar_sqd[i][3]+k], n_xxyyzz, n_c];
		}
		ar_sqmini.sortOn([4]);
		ar_sqmini.shift();
		ar_sqmini.shift();
		ar_sqmini.shift();
		ar_sq = ar_sq.concat(ar_sqmini);
	}
	ar_sq.sortOn([4]);
	ar_sq.reverse();
	for (var k = 0; k<24; k++) {
		this.createEmptyMovieClip("sq_mc"+k, 100-k);
		str = eval("sq_mc"+k);
		with (str) {
			beginFill(ar_sq[k][5], 100);
			moveTo(ar_sq[k][3][0]+400, ar_sq[k][3][1]+300);
			for (var ii = 0; ii<4; ii++) {
				lineTo(ar_sq[k][ii][0]+400, ar_sq[k][ii][1]+300);
			}
			endFill();
		}
	}
}
rotate_x1 = 0;
rotate_x2 = 0;
rotate_tox1 = 0;
rotate_tox2 = 0;
rotate_y1 = 0;
rotate_y2 = 0;
rotate_toy1 = 0;
rotate_toy2 = 0;
rotate_z1 = 0;
rotate_z2 = 0;
rotate_toz1 = 0;
rotate_toz2 = 0;
function fc_animator() {
	if (Math.abs(_root._xmouse-400)>Math.abs(_root._ymouse-300)) {
		rotate_y1 += (_root._xmouse-400)/5000;
		rotate_y2 += (_root._xmouse-400)/5000;
	} else if (Math.abs(_root._xmouse-400)<Math.abs(_root._ymouse-300)) {
		rotate_x1 += (_root._ymouse-300)/5000;
		rotate_x2 += (_root._ymouse-300)/5000;
	}
	fc_render();
}
ar_sqmini = new Array([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0]]);
ar_sq = new Array();
ar_sqd = new Array([0, 1, 2, 3], [4, 5, 6, 7], [0, 1, 5, 4], [2, 3, 7, 6], [1, 2, 6, 5], [0, 3, 7, 4]);
var interval = setInterval(fc_animator, 30);
////
ar_remap = new Array();
function fc_remap(x, y, z, rx, ry, rz) {
	n_cx = Math.cos(rx);
	n_sx = Math.sin(rx);
	n_cy = Math.cos(ry);
	n_sy = Math.sin(ry);
	n_cz = Math.cos(rz);
	n_sz = Math.sin(rz);
	n_x = x*(n_cz*n_cy+n_sy*n_sx*n_sz)+y*(-n_sz*n_cy+n_sy*n_sx*n_cz)+z*(n_sy*n_cx)+n_dx;
	n_y = x*(n_cx*n_sz)+y*n_cx*n_cz-z*(n_sx)+n_dy;
	n_z = x*(-n_sy*n_cz+n_cy*n_sx*n_sz)+y*(n_sy*n_sz+n_cy*n_sx*n_cz)+z*(n_cy*n_cx)+n_dz;
	ar_remap = [n_x, n_y, n_z];
	return ar_remap;
}
ar_pertrans = new Array();
function fc_pertrans(x, y, z) {
	if (vp+z != 0) {
		per = vp/(vp+z);
	}
	x = x*per;
	y = y*per;
	scale = per*100;
	ar_pertrans = [x, y, scale];
	return ar_pertrans;
}
stop();

関連記事:

Comments are closed.