PDA

Просмотр полной версии : Где взять объяснение эффекта Blob


nuran
08.12.2003, 07:17
Где? Как в файле. Смысл где можно прочитать?

opex
08.12.2003, 17:10
*** найдеш инфу скажеш тоже хочу узнать как это булькается

____________________________
список наград предыдущего оратора видишь ?

opex
08.12.2003, 17:14
хотя что похожее видел

на
http://home.onego.ru/~cleoaq/portfolio/labs/blobs1.html

opex
08.12.2003, 20:15
даже код есть вот

function init() {
grid = [];
big_array_base = [];
value_array_base = [];
gridXsize = gridYsize=13;
workWidth = 490;
workHeight = 490;
cellSize = workWidth/gridXsize;
for (gridX=0; gridX<gridXsize+2; gridX++) {
grid[gridX] = [];
big_array_base[gridX] = [];
value_array_base[gridX] = [];
for (gridY=0; gridY<gridYsize+2; gridY++) {
var cellX = cellSize*gridX;
var cellY = cellSize*gridY;
grid[gridX][gridY] = {x:cellX, y:cellY, factor:(cellX*cellX+cellY*cellY)};
big_array_base[gridX][gridY] = 0;
value_array_base[gridX][gridY] = 0;
}
}
reDraw();
}
function reDraw() {
_root.clear();
big_array = [];
value_array = [];
for (gridX=0; gridX<gridXsize+2; gridX++) {
big_array[gridX] = big_array_base[gridX].slice();
value_array[gridX] = value_array_base[gridX].slice();
}
for (var pCount = 0; pCount<pCircles.length; pCount++) {
pCircles[pCount].factor = pCircles[pCount].centerX*pCircles[pCount].centerX+pCircles[pCount].centerY*pCircles[pCount].centerY;
}
for (var pCount = 0; pCount<pCircles.length; pCount++) {
var tmpx = int(pCircles[pCount].centerx/cellSize);
var tmpy = int(pCircles[pCount].centery/cellSize);
getCell(tmpx, tmpy);
}
}
function getCell(cellX, cellY) {
if (big_array[cellX][cellY] == 0) {
big_array[cellX][cellY] = 1;
var diff = [[0, 0], [1, 0], [1, 1], [0, 1]];
corners = 0;
for (var i = 0; i<4; i++) {
var cellTmp = value_array[cellX+diff[i][0]][cellY+diff[i][1]];
if (cellTmp == 0) {
cellTmp = value_array[cellX+diff[i][0]][cellY+diff[i][1]]=getCellForce(cellX+diff[i][0], cellY+diff[i][1]);
}
if (cellTmp>1) {
//trace(cellTmp);
corners += Math.pow(2, i);
}
}
// drawing stuff
if (corners == 15) {
getCell(cellX, cellY-1);
} else {
linesArray = [[], [0, 3], [1, 0], [3, 1], [1, 2], [3, 0, 1, 2], [0, 2], [3, 2], [2, 3], [2, 0], [0, 1, 2, 3], [2, 1], [1, 3], [1, 0], [0, 3]];
var ourLines = linesArray[corners];
for (var l = 0; l<ourLines.length; l=l+2) {
if (ourLines[l] == 0) {
sx = grid[cellX][cellY].x+cellSize/(Math.abs(value_array[cellX+1][cellY]-1)/Math.abs(value_array[cellX][cellY]-1)+1);
sy = grid[cellX][cellY].y;
} else if (ourLines[l] == 1) {
sx = grid[cellX+1][cellY].x;
sy = grid[cellX+1][cellY].y+cellSize/(Math.abs(value_array[cellX+1][cellY+1]-1)/Math.abs(value_array[cellX+1][cellY]-1)+1);
} else if (ourLines[l] == 2) {
sx = grid[cellX+1][cellY+1].x-cellSize/(Math.abs(value_array[cellX][cellY+1]-1)/Math.abs(value_array[cellX+1][cellY+1]-1)+1);
sy = grid[cellX][cellY+1].y;
} else if (ourLines[l] == 3) {
sx = grid[cellX][cellY].x;
sy = grid[cellX][cellY+1].y-cellSize/(Math.abs(value_array[cellX][cellY]-1)/Math.abs(value_array[cellX][cellY+1]-1)+1);
}
// calc end of line
if (ourLines[l+1] == 0) {
ex = grid[cellX][cellY].x+cellSize/(Math.abs(value_array[cellX+1][cellY]-1)/Math.abs(value_array[cellX][cellY]-1)+1);
ey = grid[cellX][cellY].y;
} else if (ourLines[l+1] == 1) {
ex = grid[cellX+1][cellY].x;
ey = grid[cellX+1][cellY].y+cellSize/(Math.abs(value_array[cellX+1][cellY+1]-1)/Math.abs(value_array[cellX+1][cellY]-1)+1);
} else if (ourLines[l+1] == 2) {
ex = grid[cellX+1][cellY+1].x-cellSize/(Math.abs(value_array[cellX][cellY+1]-1)/Math.abs(value_array[cellX+1][cellY+1]-1)+1);
ey = grid[cellX][cellY+1].y;
} else if (ourLines[l+1] == 3) {
ex = grid[cellX][cellY].x;
ey = grid[cellX][cellY+1].y-cellSize/(Math.abs(value_array[cellX][cellY]-1)/Math.abs(value_array[cellX][cellY+1]-1)+1);
}
_root.lineStyle(6, 0x000080, 100);
subStep = 0;
_root.moveTo(sx+subStep, sy+subStep);
_root.lineTo(ex+subStep, ey+subStep);
_root.lineStyle(4, 0x8080FF, 100);
_root.moveTo(sx, sy);
_root.lineTo(ex, ey);
var diffCell = [[0, -1], [1, 0], [0, 1], [-1, 0]];
getCell(cellX+diffCell[ourLines[l]][0], cellY+diffCell[ourLines[l]][1]);
getCell(cellX+diffCell[ourLines[l+1]][0], cellY+diffCell[ourLines[l+1]][1]);
}
}
}
}
function getCellForce(parX, parY) {
var a = 0;
for (pCount=0; pCount<pCircles.length; pCount++) {
a += pCircles[pCount].radius*pCircles[pCount].radius/(grid[parX][parY].factor-2*grid[parX][parY].x*pCircles[pCount].centerX-2*grid[parX][parY].y*pCircles[pCount].centerY+pCircles[pCount].factor);
}
return a;
}
function rand(value) {
return (-1+2*(random(100)>50))*(3+random(value));
}
function addCircle() {
pCircles.push({dx:rand(10), dy:rand(10), centerX:workWidth/2, centerY:workWidth/2, radius:50});
}
pCircles = [];
init();
_root.onMouseDown = function() {
addCircle();
};
_root.onEnterFrame = function() {
for (var pCount = 0; pCount<pCircles.length; pCount++) {
pCircles[pCount].centerX += pCircles[pCount].dX+random(1);
pCircles[pCount].centerY += pCircles[pCount].dy-random(1);
if ((pCircles[pCount].centerX+pCircles[pCount].radius)>WorkWidth || (pCircles[pCount].centerX-pCircles[pCount].radius)<10) {
pCircles[pCount].dX *= -1;
pCircles[pCount].centerX += pCircles[pCount].dX;
}
if ((pCircles[pCount].centery+pCircles[pCount].radius)>WorkHeight || (pCircles[pCount].centery-pCircles[pCount].radius)<10) {
pCircles[pCount].dy *= -1;
pCircles[pCount].centerY += pCircles[pCount].dy;
}
}
reDraw();
};
для любителей чего подлинее

nuran
09.12.2003, 07:03
Оригинал написал(а) opex
хотя что похожее видел

на
http://home.onego.ru/~cleoaq/portfolio/labs/blobs1.html

совсем не то, я же не идиот, что бы просить мне описать этот эффект от Дениски, я говорю о нормальном эффекте blob, про его физику, а это вообще не капля. Капля при объединении увеличивается в объёме, растягивается, в общем нужна действительно настоящая физика.
У того же Дениски есть намного более продвинутая капля, что-то типа этого мне и нужно объяснение. Объяснение, а не код.

http://cleoag.com/labs/flashmx/011/

opex
09.12.2003, 09:10
ну извини такто и из кода можно понять о принципе

Пушистик
10.12.2003, 00:39
а у меня код с ошибками показывает....дайте нормальный:)

opex
10.12.2003, 00:49
вот те исходние

nuran
13.12.2003, 14:10
Я подумал маленько ... как я понял, этот эффект основан на
нахождении контура (выпуклой оболочки) от энного количества точек. Точки
соответственно задаются в виде шариков, при их определённом
удалении друг от друга происходит расщепление контура. В общем
по крайней мере так тоже можно реализовать этот эффект.
100% гарантирую. Но сложно ёпрст.
Вначале нужно написать процедурку для нахождения контура от
массива точек. Далее задать эти точки в виде, допусти двух шаров.
Шары будут у нас отражаться от боковых стенок (ну это как два пальца..),
При сближении, добусти на 1.5 радиуса точки будут объединяться
в один контур. И контур соответственно из двух шаров превратится
в одну каплю. При удалении шаров, допустим на расстояние 1.5 радиуса
и больше контур опять расщепляется на два шара. Вроде так.

Реализую в ближайший месяц этот эффект.

Nuran '2003 | All Rights Reserved.

opex
13.12.2003, 14:35
да да займись что очень кложно напишеш сообщи

opex
26.02.2004, 20:49
вот ище 2 исходника может подойдут

opex
26.02.2004, 20:53
и 2ой

nuran
01.03.2004, 12:32
Paul D. Bourke about Metaballs
http://astronomy.swin.edu.au/~pbourke/modelling/implicitsurf/

Читай, учи. Я понял.

opex
01.03.2004, 13:09
нет это выше моего понимания

opex
01.03.2004, 19:26
но если у тя есть исхрдник на ас я не против его глянуть (если не жалко)

nuran
12.04.2004, 08:31
http://www.flash.plux.ru/board/viewtopic.php?t=157
Качай оттуда файл, в нём есть маленькое объяснение. В общем очень легко, нужно только понять ...