..index

http://avs.chat.ru/avsbyallott.htm

Горд Аллот
Конструктивы частицы в AVS

Основы построения частицы

Частица по своей сути - это точка в пространстве, которая не имеет никакого размера, никакой массы, и у нее нет скорости. Это просто точка или, в противном случае, пустое пространство. Но, когда мы начинаем манипулировать частицей, прилагая правила к ней, могут случиться намного более впечатляющие вещи. Например, мы можем манипулировать частицей, используя правила гравитации. Частица тогда начнет "падать"; однако, тем не менее, есть основание говорить, что когда частица находит некоторую землю, то это ее остановит. Это будут другие правила, которые мы должны бы добавить к частице. Если вы продолжаете добавлять правила, то в конечном счете получите систему частицы (particle system), в которой частица является просто пешкой в вашем мире (я должен произносить это с дьявольским смехом, но у меня воспалено горло).
  Gord Allott
Particle Engines in AVS

Particle Basics

A particle in its most basic form is a point in space, it has no size, no mass and it has no speed. It is just a point in an otherwise empty space. It’s when we start to manipulate the particle by applying rules to it that more impressive things can start to happen. For example we can manipulate a particle by using the rules of gravity. The particle will then start to ‘fall’ down; there is however nothing to say that when the particle finds some ground, that it will stop. This would have to be another rule that we would have to add to the particle. If you keep adding rules you will eventually get a particle system, upon which the particle is merely a pawn in your world (I would do an evil laugh here but I have a sore throat).

Вы, тем не менее, придете к проблеме в некоторой части создания правил, полагая, например, что в вашей системе есть две частицы, частица A, которая представляет из себя пушечное ядро, и частица B, которая представляет из себя элластичный шар. Когда они достигнут земли, следует ожидать, что частица A остановится замертво, а частица B подпрыгнет, но когда мы смотрим на них, то не имеем никакого подхода, чтобы говорить отдельно о частице A и частице B. Дело в том, что пока у нас просто есть правила, которые этими частицами руководят, нам нужно иметь способ описывать абсолютно все частицы. Это может быть что-то от точного описывания их массы, до того, как они реагирует на сопротивление воздуха; Я сошлюсь потом на эти биты информации как на "атрибуты" (дополнительные сведения).   You will however come upon a problem at some part of creating these rules, suppose for example you have two particles in your system, Particle A which is supposed to represent a cannon ball and Particle B, which is supposed to represent an elastic band ball. When they hit the ground you would expect Particle A to stop dead and Particle B to bounce up, but when we look at it, we have no way of telling particle A and particle B apart. This is because so far we just have rules that these particles run by, we need to have a way of describing each and every particle. This can be anything from just describing its mass to how it reacts to air resistance; I will refer to these bits of information as ‘attributes’

Давайте посмотрим на некоторый псевдокод (Pseudo code) для частицы, - эта частица имеет пять атрибутов, значения x и y координат, скорость, которую она имеет в направлениях x и y, и атрибут, сообщающий, когда частица "оживает". Частица подчиняется несложным правилам, которые имитируют гравитацию. Гравитация в этой модели установлена на 0.2; если частица замирает, то она возвращается в позицию x=0 и y=0. Земля там, где расположена земная поверхность.   Let’s take a look at some Pseudo code for a particle, this particle has five attributes, its x and y values, the speed it has in the x and y directions and an attribute telling weather the particle is ‘alive’. The particle will follow a short rule that will simulate gravity. Gravity in this simulation is set to 0.2. if the particle dies then it is regenerated at x pos 0 and y pos 0. Ground is where the ground is situated.

Particle.x = 0
Particle.y = 0
Particle.xspeed = 0
Particle.yspeed = 0
Particle.State = Alive
Gravity = 0.2
Loop {	
	If Particle.State is Dead { 			//Checks state
		Particle.x = 0
		Particle.y = 0
	}

	Particle.yspeed = Particle.yspeed + Gravity 	//Speeds up the particle
	Particle.y = Particle.y + Particle.yspeed	//Moves the particle
	If Particle.y <= Ground {			//Checks if has hit ground
		Particle.State = Dead	
	}	
}

Тем не менее, обратите внимание, что в этих механических моделях не приняты во внимание некоторые факторы, подобно сопротивления воздуха и кривизны земли, дело в том, что нам нужно сделать описание более компактным, чем это должно быть в действительности, и мы попытаемся получать только грубое моделирование силы тяжести, не отличающееся все же по сути. Если в завершении вашей основной реализации это будет вполне правдоподобно, значит нет никакой необходимости использовать в будущем что-то более сложное.   You will notice however that in this engine things like air resistance and curvature of the earth are not taken into account, this is because it would make the engine more complex than it needs to be, we are only trying to get a rough simulation of gravity, not a perfect one. If at the end of your basic implementation, it looks about right then there is no real need to incorporate complex futures.

Вы также могли обратить внимание, что если бы в этой системе были две частицы, то они не стали бы взаимодействовать друг с другом, и, более того, по сути, они должны просто проходить друг через друга без видимого сопротивления.   You might also notice that if there were two particles in this engine, they would not interact with each other, more to the point they would just pass through each other without batting an eyelid.


Создание механики частицы в Avs и МегаБуфер
"Это часть, где вам придется экспериментировать с AVS"

Существуют определенные проблемы с созданием механики частицы в SuperScopes; и наиболее существенно то, что нет способа хранить атрибуты каждой частицы, поскольку когда вы перемещаетесь в следующую точку области, вы перезаписываете переменные, которые использовали прежде. Это как раз тот случай, когда требуется "Миллион Пунктов МегаБуфера", в которые мы можем загрузить около миллиона пунктов информации, и далее я проведу вас через специфические особенности практического использования и конструирования механики частицы.

Есть две раздела использования МегаБуфера, - это извлечение данных и присвоение данных. Они выполняются с использованием двух операций;
  Creating particle engines in Avs and the Mega Buffer
“This is the part where you need AVS experience =)”

There arise certain problems with creating a particle engine in superscopes; most noticeably there is no way to store the attributes of each particle because when you move onto the next point on the scope you overwrite the variables you have previously used. This is where the ‘Million Item Megabuffer comes into use’, in here we can store around a million items of information and I’ll walk you through the uses and particle engines next.

There are two parts of using the Megabuffer; there is retrieving data and assigning data. These are performed by using two operations;

variable = megabuf(index); 
assign(megabuf(index), variable);

Обратите здесь внимание на переменную "index", дело в том, что МегаБуфер работает в индексной системе. Индекс может быть любым числом, даже десятичным. Но я все-же предпочитаю использовать целые числа.   You will notice the inclusion of ‘index’ here; this is because the Megabuffer works in an ‘index’ system. An ‘index’ can be any number, even a decimal. I prefer to use a whole number though.

Представьте себе МегаБуфер как (довольно большой) регистриратурный кабинет, когда изначально каждая из миллиона созданных секций не имеет на себе этикетки и не содержит ничего. Когда мы используем следующий код, в соответствии с которым индекс устанавливается в число 1, операцией assign(megabuf(1),10); мы надписываем этикетку на стороне произвольного кабинета и помещаем в этот кабинет число 10. Теперь всякий раз, когда нам нужно извлекать нечто в этом кабинете, мы просто используем индекс 1, и заходим непосредственно в тот самый кабинет.   Imagine the Megabuffer as a (rather large) filing cabinet, when it is first created each of the million drawers have no label on them and contain nothing. When we use the following code, of which index is set to the number 1, ‘assign(megabuf(1), 10);’ we write a label on the side of a random cabinet and put the number ’10’ into that cabinet. Now whenever we need to retrieve what’s in that cabinet we just use the index ‘1’ and go straight to that cabinet.

Что я предпочитаю делать для своих конструктивных моделей, так это назначать каждой из частиц максимум до 100 атрибутов, чтобы иметь возможность манипулировать ими. С этой целью я могу выделить определенные части МегаБуфера для каждой частицы. Например, скажем, что у меня конструкция с 10 частицами, частица 1 должна взять ячейки 0-99, частица 2 должна взять ячейки 100-199, и частица 3 должно взять ячейки 200-299, и так далее. Я сошлюсь на стартовую точку каждой из тех определенных секций указателем "pointer", например для particle1 указатель должен быть установлен на 0, для particle2 указатель должен быть установлен на 100, и так далее.   What I like to do for my engines is give each of my particles a maximum of 100 attributes to play with. That way I can designate parts of the Megabuffer to each particle. For example say I had an engine with 10 particles, particle1 would take 0-99, particle 2 would take 100-199, and particle3 would take 200-299, and so on. I refer to the start point of each of those designated parts with a ‘pointer’, for example on particle1 the pointer would be set to 0, on particle2 the pointer would be set to 100 and so on.

Этим способом каждый из атрибутов частицы может быть выражен как указатель плюс вспомогательный номер атрибута (pointer + attribute_number). Например, мы могли бы указать для каждой частицы, что позиция "x" определяется как "pointer + 1", а позиция "y" как "pointer + 2". В предшествующем примере позиция "y" первой частицы должна быть зафиксирована в 002, для второй частицы в 102, и так далее. Нам просто нужно не забывать увеличивать указатель на 100 после каждой частицы. Давайте теперь взглянем на это в коде superscope.   This way each of the attributes of a particle can be expressed as ‘pointer + attribute_number’. For example we might say that in each particle that the x position is referred to as pointer + 1 and the y position as pointer + 2. in the previous example the y position of the first particle would be held in 02 and in the second particle it would be held in 102, and so on and so forth. We just need to remember to increase the pointer by 100 after every particle. Let’s take a look at this in superscope code.

Per frame:
	pointer = 0; 				//resets the pointer on each frame

Per Point:
	x=megabuf(pointer + 1);			//gets the x attribute
	y=megabuf(pointer + 2);			//gets the y attribute

	/* 
Physics (gravity rules n stuff) 
go here
	*/

	assign(megabuf(pointer + 1),x);		//assigns the x attribute
	assign(megabuf(pointer + 2),y);		//assigns the y attribute
	pointer=pointer+100;			//increases the pointer

В этом коде, ничего исключительного не происходит, мы просто прочитали величины x и y каждой частицы из Megabuffer и назначали те же величины в Megabuffer. Вы могли обратить внимание, как мы прочитали из Megabuffer прежде, чем назначили что-либо, и это вполне типично в avs, и эквивалентно ситуации с заполнениями секций кабинета безымянными сведениями, когда преставляется ничто и возвращается ничто (которое здесь представлено числом 0).

Это из-за этого, что нам нужно задать стартовые величины в первом фрейме.
  In this code nothing exciting happens, we merely read the x and y values of each particle from the Megabuffer and assign the same values back to the Megabuffer. You might notice that we read from the Megabuffer before we have assigned to it, this is perfectly fine in avs and equivalent to looking in a nameless filing cabinet drawer, seeing nothing and returning nothing (which is represented by the number 0).

It is because of this that we need to create the starting values on the first frame.

On init:
	first=2;

Per frame:
	first=max(first-1,0) 				//sets ‘first’ to 1 on frame 1
	pointer=0;

Per point:
	x=megabuf(pointer + 1);
	y=megabuf(pointer + 2);

	gen=first;					//sets ‘gen’ to 1 on first frame
	x=if(gen, 1, x);
	y=if(gen, 0, y);
	
	assign(megabuf(pointer + 1), x);
	assign(megabuf(pointer + 2), y);

В этом примере каждое значение x будет установлено на 1 в первом фрейме и значение y будет установлено на 0. Также вы могли бы установить gen на 1, если хотите восстанавливать положение частицы; и это должно автоматически возвращать её в стартовую позицию.   In this example each of the x values will be set to 1 on the first frame and the y values will be set to 0. Also you could set ‘gen’ to 1 if you wish to reset the particle; it would automatically go back to its starting position.

Используя эти базовые сведения вы можете создать вполне работоспособные конструктивы частицы, которые легко настраиваются, независимо от того какую физику вы относите к ним; единственная вещь, которая следует жестко отслеживать в avs относительно конструкций из частиц - это необходимость принуждать их взаимодействовать друг с другом, так как вы должны проверять все и каждую частицу, чтобы отслеживать, когда они уже столкнулись, или когда ожидается удар с большой скоростью.   Using these basics you can create full fledged particle engines that bend to whatever physics you apply to them, the only thing that is hard to do in avs regarding particle engines is have them interact with each other as you would have to check each and every other particle to see if they have hit or whatever which would be a large speed hit.

e-mail: gordallott@hotmail.co.uk
http://www.winamp.com/visualization/ped/145300
http://download.nullsoft.com/customize/component/2005/6/9/P/PED.exe

..index


Перевод: А.Панов.
http://avs.chat.ru

Panow©