<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; 3d</title>
	<atom:link href="http://mabp.kiev.ua/tag/3d/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Куб с градиентом</title>
		<link>http://mabp.kiev.ua/2009/07/14/cube-with-a-gradient/</link>
		<comments>http://mabp.kiev.ua/2009/07/14/cube-with-a-gradient/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 21:12:22 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[cube]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1094</guid>
		<description><![CDATA[Поработал еще над кубом, теперь рисуются только те грани и ребра которые видны. Странно что при размере куба 10, грани перестают быть видимыми если общая сумма углов грани по оси Z равно 150. При изменении размера куба никаких пропорций найти не удалось :( Еще хотел натянуть на грани текстуры но у меня явно не тот [...]]]></description>
			<content:encoded><![CDATA[<p>Поработал еще над кубом, теперь рисуются только те грани и ребра которые видны. Странно что при размере куба 10, грани перестают быть видимыми если общая сумма углов грани по оси Z равно 150. При изменении размера куба никаких пропорций найти не удалось :(</p>

<p>Еще хотел натянуть на грани текстуры но у меня явно не тот подход к рисованию и я решил что лучше забить. Зато натянул на куб градиент:</p>
<span id="more-1094"></span>
<script type="text/javascript" src="/content/source/cube/cube-0.4.js"></script>
<div style="text-align:center;"><canvas  id="cube" width="500" height="500"/></div>

<p>Цацкайтесь на здоровье, пишите где мои проебы, как их поправить или просто пишите. Следующих версий ждать не стоит я скорее всего займусь чем-то на <a href="http://mabp.kiev.ua/category/programming/java/">Java</a>, или на YUI.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/07/14/cube-with-a-gradient/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Куб3</title>
		<link>http://mabp.kiev.ua/2009/07/13/cube3/</link>
		<comments>http://mabp.kiev.ua/2009/07/13/cube3/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 18:39:56 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[cube]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1092</guid>
		<description><![CDATA[Это третья версия кубика, на этот раз со стеклянными гранями, развлекайтесь: Из изменений: добавлина матрица граней, то есть порядок соединения вершин this.G = [ [0,1,2,3,4,5], [1,2,3,0,5,6], [2,6,7,4,1,2], [3,5,6,7,0,1], ] и новый цикл для обхода матрицы for(var i=0;i&#60;6;i++){ this.plot.beginPath(); this.plot.fillStyle = "rgba("+(i&#60;3?255:0)+","+((i&#60;1&#124;&#124;i&#62;3)?255:0)+","+(i&#62;2?255:0)+",0.5)"; this.plot.moveTo(this.V2d[0][this.G[0][i]],this.V2d[1][this.G[0][i]]); this.plot.lineTo(this.V2d[0][this.G[1][i]],this.V2d[1][this.G[1][i]]); this.plot.lineTo(this.V2d[0][this.G[2][i]],this.V2d[1][this.G[2][i]]); this.plot.lineTo(this.V2d[0][this.G[3][i]],this.V2d[1][this.G[3][i]]); this.plot.closePath(); this.plot.fill(); } PS Пользователи IE идут на хуй, потому [...]]]></description>
			<content:encoded><![CDATA[<p>Это третья версия кубика, на этот раз со стеклянными гранями, развлекайтесь:</p>
<span id="more-1092"></span>

<script type="text/javascript" src="/content/source/cube/cube-0.3.js"></script>
<div style="text-align:center;"><canvas  id="cube" width="500" height="500"/></div>

<p>Из изменений: добавлина матрица граней, то есть порядок соединения вершин </p>

<pre><code class="javascript">
this.G = [
	[0,1,2,3,4,5],
	[1,2,3,0,5,6],
	[2,6,7,4,1,2],
	[3,5,6,7,0,1],
]
</code></pre>
<p>и новый цикл для обхода матрицы</p>

<pre><code class="javascript">
for(var i=0;i&lt;6;i++){
	this.plot.beginPath();
	this.plot.fillStyle = "rgba("+(i&lt;3?255:0)+","+((i&lt;1||i&gt;3)?255:0)+","+(i&gt;2?255:0)+",0.5)";
	this.plot.moveTo(this.V2d[0][this.G[0][i]],this.V2d[1][this.G[0][i]]);
	this.plot.lineTo(this.V2d[0][this.G[1][i]],this.V2d[1][this.G[1][i]]);
	this.plot.lineTo(this.V2d[0][this.G[2][i]],this.V2d[1][this.G[2][i]]);
	this.plot.lineTo(this.V2d[0][this.G[3][i]],this.V2d[1][this.G[3][i]]);
	this.plot.closePath();
	this.plot.fill();
}
</code></pre>
<p>PS Пользователи <a href="http://mabp.kiev.ua/tag/ie/">IE</a> идут на хуй, потому что он не поддерживает полупрозрачности фона rgba(255,255,255,0.5)</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/07/13/cube3/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Кубик Маврика</title>
		<link>http://mabp.kiev.ua/2009/07/13/mabps-cube/</link>
		<comments>http://mabp.kiev.ua/2009/07/13/mabps-cube/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 09:33:58 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[cube]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1089</guid>
		<description><![CDATA[Вчера был на редкость плодотворный день, я таки дописал свой кубик. напомню что сначала я не мог даже квадрат на плоскости развернуть. Но терпение и труд все перетрут, наверное ;) Вторая редакция кубика не имеет ничего общего с первой. Все полностью переделано. Теперь вместо того чтобы высчитывать углы наклонов и поворотов рёбер от угла поворота [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера был на редкость плодотворный день, я таки дописал свой кубик. напомню что сначала я не мог даже <a href="http://mabp.kiev.ua/2009/07/10/square-mavrevicha/">квадрат</a> на плоскости развернуть. Но терпение и труд все перетрут, наверное ;)</p>
<span id="more-1089"></span>
<p>Вторая редакция кубика не имеет ничего общего с <a href="http://mabp.kiev.ua/2009/07/12/cube-mauritius/">первой</a>. Все полностью переделано.  Теперь вместо того чтобы высчитывать углы наклонов и поворотов рёбер от угла поворота куба, я решил сделать так, как делается в нормальнйо трехмерной графике. Нарисовать сцену, положить в координаты [0,0,0] центр куба, по векторам высчитать вершины и нарисовать между ними линии. Что собственно с успехом и реализовал.</p>

<script type="text/javascript" src="/content/source/cube/cube-0.2.js"></script>
<script type="text/javascript" src="/content/source/excanvas.js"></script>
<div style="text-align:center;"><canvas  id="cube" width="500" height="500"/></div>

<p>теперь как видите ничего нигде не точит и все прекрасно отображается. пришлось конешно пошаманить, прописать все углы, ребра и векторы но зато теперь все идеально. Куб можно изменять в размерах, отдалять и приближать "камеру", красить в произвольный цвет и все это при помощи настроек.</p>

<p>По просьбе Adw0rd'a выкладываю сырцы которые все это генерируют:</p>

<pre><code class="javascript">
Cube = function(options){
	this.init(options);
}

Cube.prototype = {
	
	color : "#000000", // цвет граней
	plot : null, // 2d context
	size : 10, // размер куба
	focalLens : 0, // расстояние от центра куба до камеры
	theta : [0,0], // углы поворотов по осям в радианах
	V2d : [[],[]], // вектора в двухмерной проекции
	
	T : [], // Translation vector
	E : [[],[]], // Edges
	R : [[],[],[]], // Rotation matrix
	V : [[],[],[]], // Vertices

	init : function(options){
		
		for (var i in options)
			this[i] = options[i];
			
		if(!this.focalLens)
			this.focalLens = this.plot.canvas.width;
			
		var self = this;
		document.onmousemove = function(event){
			self.theta = [event.clientX / 100, event.clientY / 100];
			self.draw();
		}			
			
		this.createScene();
		this.draw();
	},
	
	createScene : function (){
		var s = this.size;
		
		this.V = [
			[-s, s, s,-s,-s, s, s,-s],
			[-s,-s, s, s,-s,-s, s, s],
			[-s,-s,-s,-s, s, s, s, s],
		];
		
		this.E = [
			[0,1,2,3,4,5,6,7,0,1,2,3],
			[1,2,3,0,5,6,7,4,4,5,6,7],
		];
		
		this.R = [
			[1,0,0],
			[0,1,0],
			[0,0,1],
		];
		
		this.T = [0,0,0];
	},

	updVertices : function (){
		var x, y, z;
		
		for(var i=0;i&lt;8;i++){
			x=this.R[0][0]*this.V[0][i]+this.R[0][1]*this.V[1][i]+this.R[0][2]*this.V[2][i]+this.T[0];
			y=this.R[1][0]*this.V[0][i]+this.R[1][1]*this.V[1][i]+this.R[1][2]*this.V[2][i]+this.T[1];
			z=this.R[2][0]*this.V[0][i]+this.R[2][1]*this.V[1][i]+this.R[2][2]*this.V[2][i]+this.T[2];

			this.V2d[0][i]=this.plot.canvas.width/2+x*this.focalLens/z;
			this.V2d[1][i]=this.plot.canvas.height/2+y*this.focalLens/z;
		}
	},


	setTransformation : function (x, y, z, anglex, angley){
		var 
		sx = Math.sin(anglex),
		cx = Math.cos(anglex),
		sy = Math.sin(angley),
		cy = Math.cos(angley);
		
		this.R = [
			[ cx   , 0 ,  sx],
			[ sx*sy, cy, -cx*sy],
			[-sx*cy, sy,  cx*cy],
		];
		this.T = [x,y,z];
	},

	drawModel : function (){
		this.plot.beginPath();
		this.plot.strokeStyle=this.color;
		for(var i=0;i&lt;12;i++){
			this.plot.moveTo(this.V2d[0][this.E[0][i]],this.V2d[1][this.E[0][i]]);
			this.plot.lineTo(this.V2d[0][this.E[1][i]],this.V2d[1][this.E[1][i]]);
			this.plot.stroke();
		}
	},
	
	drawCells : function(){
		this.plot.fillStyle="black";
		for(var i=100,l=this.plot.canvas.width;i&lt;l;i+=100){
			this.plot.fillRect(0,i,l,1);
			this.plot.fillRect(i,0,1,l);
		}
	
	},

	draw : function (){
		var self = this;

		this.plot.clearRect(0,0,this.plot.canvas.width,this.plot.canvas.height);
		this.setTransformation(0.0, 0.0, 40.0, this.theta[0], this.theta[1]);
		this.updVertices();
		this.drawCells();
		this.drawModel();
	},
}


window.onload=function(){
	var plot = document.getElementById("cube").getContext("2d"),
	
	cube = new Cube({plot:plot,color:"#00FF00",size:10});
}
</code></pre>


<p>И еще три строчки HTML:</p>

<pre><code class="html">
&lt;script type="text/javascript" src="/content/source/cube-0.2.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="/content/source/excanvas.js"&gt;&lt;/script&gt;
&lt;div style="text-align:center;"&gt;&lt;canvas  id="cube" width="500" height="500"/&gt;&lt;/div&gt;
</code></pre>

<p>но это не конец, в следующей версии планируется натяжка текстур на грани и добавление света, или раскраска сторон с добавлением полупрозрачности, я еще не решил что буду делать.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/07/13/mabps-cube/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Куб Маврикия</title>
		<link>http://mabp.kiev.ua/2009/07/12/cube-mauritius/</link>
		<comments>http://mabp.kiev.ua/2009/07/12/cube-mauritius/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 13:56:20 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[cube]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1088</guid>
		<description><![CDATA[Название изначально задумывалось как "Кубик Маврика", на подобие с Кубиком Рубика, но Google перевел его как "cube mauritius", что означает "Куб Маврикия", так и оставил. После записи о вращении квадрата я немного полистал учебники по геометрии, и даже "основы учебного академического рисунка", и поднабрался знаний по поводу того что и как должно быть. И вот [...]]]></description>
			<content:encoded><![CDATA[<p>Название изначально задумывалось как "Кубик Маврика", на подобие с Кубиком Рубика, но <a href="http://mabp.kiev.ua/tag/google/">Google</a> перевел его как "cube mauritius", что означает "Куб Маврикия", так и оставил.</p>

<p>После записи о <a href="http://mabp.kiev.ua/2009/07/10/square-mavrevicha/">вращении квадрата</a> я немного полистал учебники по геометрии, и даже "основы учебного академического рисунка", и поднабрался знаний по поводу того что и как должно быть. И вот пришло время поделится этим с вами.</p>
<span id="more-1088"></span>

<p>Я решил что до того как рисовать красивые полупрозрачные грани неплохо было бы научится вращать вершины. Чем собственно и занялся. Четыре точки вращаются в трех плоскостях. Но там немного хитро по оси OX вращение происходит при передвижении мышки вперед назад, а по оси OY и/или OZ происходит при передвижении мышки из стороны в сторону и зависит от того на какой грани лежит куб.</p>

<p>Развлекаемся:</p>
<script type="text/javascript" src="/content/source/cube/cube-0.1.js"></script>
<script type="text/javascript" src="/content/source/excanvas.js"></script>
<div style="text-align:center;"><canvas  id="cube" width="500" height="500"/></div>

<p>Весь код показывать не буду, если захотите посмотрите, но главную функцию, которая рассчитывает позиции вершин обязательно надо показать.</p>

<pre><code class="javascript">
function(){
	var data = [],
	dim = this.dimension,
	o = this.theta;
	for (var x = -dim; x <= dim; x += 2 * dim)
		for (var y = -dim; y <= dim; y += 2 * dim)
			for (var z = -dim; z <= dim; z += 2 * dim){
				var 
				a = x * Math.cos(o.x) - y * Math.sin(o.x),
				b = x * Math.sin(o.x) + y * Math.cos(o.x),
				c = b * Math.cos(o.y) - z * Math.sin(o.y),
				d = b * Math.sin(o.y) + z * Math.cos(o.y);
				data.push({
					left : 250 + a * (d + 2) * 50,
					top  : 250 + c * (d + 2) * 50,
				});
			}
	return data;
}
</code></pre>

<p>Единственным недостатком такого способа расчета координат есть то, что если поставить куб так чтобы взгляд шел сразу по двум граням, то дальняя вершина, которая должна сливаться с передней (то есть взгляд должен идти по ребру) сильно выходит за рамки куба. Но я так понял что я не первый кто пользуется этим способом, так что думаю что ничего страшного.</p>
<p>В планах на ближайшее будущее новый куб у которого ничего никуда не вылазит.</p>

]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/07/12/cube-mauritius/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

