Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Physical engine (http://www.flasher.ru/forum/showthread.php?t=66685)

F_Flash 12.08.2005 17:30

1.Хит тест для объектов не прокатывает т.к. он смотрит не по форме объекта а по боудинбоксу объектов. т.е. по прямоугольным рамкам грубо говоря которые описаны вокруг объектов.
2. ЧТоб решить эту проблему есть только один способ создавать для каждого объекта набор вершин замыкание которых обарзуют форму объекта. И столкновение проверять если хотябы одна из вершин оджного объекта принадлежит отбласти дркгого объекта то столкновение произошло. ОЧень верно было замечено что если набор вершин составляет выпуклую форму то это сильно упрощает расчет. Кроме того в HAVOK точно так же используется понятие боудинбокса, и просчет столкновения (коллижна) может проходить по нескольким параметрам
- ПО прямоугольнику
- ПО сетке натянутой на обхект , чтоб добиться выпуклой ыормы. т.е. игнорируются все впуклости.
- ПО непосредсвенно самой сетке.
- ПО спесиально созданному дополнительному объекту.

Кстати просчитать коллижн для объекта круглой формы это самый быстрый метод.

Для того чтобя из рисунка нарисовнного получить програмно набор точек, можно хиттестом создесть массив точек которые пиняджлежат объекту(т.к. getPixel до 8-й версии функция еще отсутсвует), т.е. создат бинарную карту с экрана, найти у этой карты описывающие точки и проаксимировать край. ПАрамер апроксимации можно создать разный, так же например для созданиф создение выпуклой описывающей формы.
3. ЧТоб объект не заскивал на другой объект, нужно при столкновении искать точку соприкосновения до столкновения, вычисляя дистанцию для обоих объектов по их пути до то чтоки соприкосновения. И в этом же кадре дать координату отхода.
4. ЧТоб объекты не проскаивали друг через друга на большой скорости.

- проверять пересекались ли их отрезки пути сзахватом на размер объхекта, здесь можно использовать окружность в качестве боудинг бокса.

А вообще самый правильный путь реализации движка физики для флеша.

Это использования примитивов описанных вокруг формы объекта.
- Окружность.
- Прямоугольник
- Многоугольник.

Но если например будет 10 многоугольников скажем по 10 вершин в каждом то это будет ж...а. т.к. флеш такая штука тормозная... Где на создании например переменной уходит куча времени. т.е. теаритически Full Phizic Enfine реализовать можно, но практически нет из за того что он интерпретируемый. Машин таких не придумали еще.




Интересный пример.
Вариант1

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dx=x2-x1;
dy=y2-y1;
dist=Math.sqrt(dx*dx+dy*dy);

Вариант2

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dist=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));


ка не странно, вариант 2 работает выстрее.

KidsKilla 12.08.2005 17:32

F_Flash,
ты эту мутотень написал от незнания, что есть:
mc.hitTest(_xmouse, _ymouse, true) ?

мя прост твой п.1 покарёжил.
я и читать дальше не стал

про 2 варианта ничего странного.
лишнее время на присвоение переменной.
+ одна особенность компилятора.
если условие взято в скобки и все переменные просчитаны, то компилятор будет условие в скобках принимать за "1 переменную", не просчитывать каждый раз.

iNils 12.08.2005 17:40

Цитата:

Интересный пример.
Вариант1

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dx=x2-x1;
dy=y2-y1;
dist=Math.sqrt(dx*dx+dy*dy);

Вариант2

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dist=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));


ка не странно, вариант 2 работает выстрее.
на основании чего ты сделал такой вывод?

iNils 12.08.2005 17:41

Цитата:

Сообщение от KidsKilla
про 2 варианта ничего странного.
лишнее время на присвоение переменной.
+ одна особенность компилятора.
если условие взято в скобки и все переменные просчитаны, то компилятор будет условие в скобках принимать за "1 переменную", не просчитывать каждый раз.

не заметил разницы

KidsKilla 12.08.2005 17:54

Цитата:

Сообщение от iNils
не заметил разницы

вот тут:
dx=x2-x1;
dy=y2-y1;

F_Flash 12.08.2005 17:55

Цитата:

Сообщение от KidsKilla
F_Flash,
ты эту мутотень написал от незнания, что есть:
mc.hitTest(_xmouse, _ymouse, true) ?

мя прост твой п.1 покарёжил.
я и читать дальше не стал

про 2 варианта ничего странного.
лишнее время на присвоение переменной.
+ одна особенность компилятора.
если условие взято в скобки и все переменные просчитаны, то компилятор будет условие в скобках принимать за "1 переменную", не просчитывать каждый раз.

Грамотей однако:)

1.mc.hitTest(_xmouse, _ymouse, true) это для точки и объека а не для двух объектов.
2. Не компилятора а итерпритатора.
3. И он так не считает а считает тупо и не анализирует что написано в скобках.

Пример.

Вариант 1
s=getTimer();
x1=50000;
x2=10000;
y1=50000;
y2=10000;
for(i=1;i<=100000;i++){
dist=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
trace(getTimer()-s);




Вариант 2
s=getTimer();

x1=50000;
x2=10000;
y1=50000;
y2=10000;
for(i=1;i<=100000;i++){
dist=Math.sqrt((x2-x1)*(x2-x1)+(x2-x1)*(x2-x1));
}
trace(getTimer()-s);


На эти варианты уходит одинаковое количество вермени хотя если по твоему методу то во втором сучае должна быть явная экономия на 1 операции вычитания.

F_Flash 12.08.2005 17:57

2KidsKilla

И еще прочитай внимательно, хиттест для точки и объхекта исполтьзуется в моем предложенном вариенте для получения описываемиого шейпа.

E-mail 12.08.2005 17:57

Цитата:

Интересный пример.
Вариант1

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dx=x2-x1;
dy=y2-y1;
dist=Math.sqrt(dx*dx+dy*dy);

Вариант2

x1=random(1000);
y1=random(1000);
x2=random(1000);
y2=random(1000);
dist=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));


ка не странно, вариант 2 работает выстрее.
Во втором варианте на целых две переменных меньше,если они не нужны лучше их не вводить и считать всё вместе.

KidsKilla 12.08.2005 17:58

1) понял.

2) ты чего бредишь?
я те про переменные dx и dy говорил. а ты написал 2 АБСОЛЮТНО ОДИНАКОВЫХ кода и удивляешься, что время одинаковое.
я имел в виду:
function(){
var x = Math.PI+2;
return x
}
работает дольше чем

function(){
var x = (Math.PI+2);
return x
}

KidsKilla 12.08.2005 18:02

Цитата:

Сообщение от E-mail
Во втором варианте на целых две переменных меньше,если они не нужны лучше их не вводить и считать всё вместе.

переменные нужны, когда однотипных вычислений море. но их иожно как раз просто в скобки поместить, будет тот же эффект.

но я дополнительные переменные использую примерно так:
var tmp = long.long.way.to.my.object.for["example"].xml
for(var i in tmp) trace(tmp[i])


Часовой пояс GMT +4, время: 21:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.