PDA

Просмотр полной версии : Физика "отскока" от препятсвия


Генч
27.09.2002, 23:43
Вот призадумался, смогём ли реализовать отскок от припятсвия неизвесной формы?.. . :confused: :eek:

хм..

Скажем есть мяч(_root.ball)
есть препятсвие (_root.smth)

чур я начну :cool:

onClipEvent (enterFrame) {

_x+=xSpeed;
_y+=ySpeed;

if(_root.ball.hitTest(_x,_y,1)
{
...

кто продолжит ? :p :D

Генч
28.09.2002, 00:07
...чудиться мне что это не есть реально =\

Генч
28.09.2002, 00:24
...хм. ради експеремента пихнул

xSpeed*=-1;
ySpeed*=-1;
}

- работает можно сказать. глючновато

Генч
28.09.2002, 01:26
эхохо... сам шучу и сам смеюсь

маленький апгрэйт

if(_root.bort.hitTest(_x,_y,1))
{
if(_root.bort.hitTest(_x+_width*2,_y,1)||_root.bort.hitTest(_x-_width*2,_y,1)){
xSpeed*=-1;_x=x0;
}
if(_root.bort.hitTest(_x,_y+_height*2,1)||_root.bort.hitTest(_x,_y-_height*2,1)){
ySpeed*=-1;_y=y0;
}

TTS
28.09.2002, 20:16
Я бы на твоём месте создал бы клип размером с точку, прохиттестил бы препятствие и оно перестало бы быть "перпятствием неизвестной формы". :)
Хотя на самом деле я бы придумал более оптимальный алгоритм прощупывания ;)

Генч
28.09.2002, 22:06
я придумал более оригигинальный способ, но не получилось довисти до ума...
что то было типа


for(i=0;i<=360;i+=20){
ii=i*(Math.PI/180);
if(_root.ball.hitTest(_x+Math.sin(ii)*maxspeed){
_x+=Speed*Math.sin(ii);
}
_root.ball.hitTest(_y+Math.cos(ii)*maxspeed){_y+=Speed*Math.cos(ii);
}
}
этот код 99.99% не работает. это так чтоб идею передать.
мож каво наведет на мысли?

TTS
30.09.2002, 02:23
Я тут поэкспериментировал... Всё не так просто. Реальный хит будет только тогда, когда
(bort.hitTest(x,y,1) && ball.hitTest(x,y,1))==true
причем именно x,y, а не _x,_y. Так что if(ball.hitTest(bort)) надо прощупывать каким местом ball какое место bortа зацепил (если зацепил, конечно). :rolleyes:

Wolodia
30.09.2002, 10:32
Возможность FlashMX



onClipEvent (enterFrame) {
if (_root.started && _root._currentframe==1) {
with (_root.square) {
//
// keyboard controls
if (Key.isDown(Key.DOWN)) {
_y += 1;
}
if (Key.isDown(Key.UP)) {
_y -= 1;
}
if (Key.isDown(Key.LEFT)) {
_x -= 1;
}
if (Key.isDown(Key.RIGHT)) {
_x += 1;
}
//
// detect if edges of the player square are colliding with the maze walls
if (walls.hitTest(getBounds(_root).xMax, _y, true)) {
_x -= 1;
}
if (walls.hitTest(getBounds(_root).xMin, _y, true)) {
_x += 1;
}
if (walls.hitTest(_x, getBounds(_root).yMax, true)) {
_y -= 1;
}
if (walls.hitTest(_x, getBounds(_root).yMin, true)) {
_y += 1;
}
//
// detect if maze is finished
if (_root.goal.hitTest(_x, getBounds(_root).yMax, true)) {
_root.gotoandstop(3);
}
}
}
}

TTS
30.09.2002, 12:48
Ха!.. getBounds... Шарик у нас, ШАРИК. И препятствие НЕИЗВЕСТНОЙ формы. :p

Генч
30.09.2002, 19:33
2tss:
хм.. чёта я уже не соображаю ничо %\\
вощм мысль упиралась в то что - используеца максСпид,
по этму сразу везде вокруд хиттест оказаца не может, а может скажем только сверху, тода от 190 скажем до 350 градусов - будит Хит, оттуда и вычислица. т.е. это и получаеца - каким местом зацепил

Генч
30.09.2002, 19:37
т.е. на области более 180 градусов. хит быть не может

Nox Noctis
30.09.2002, 21:05
геныч, чего тебе надо, а ? :)
ту хочешь отскок от неизвестной формы кривой ?

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

всего делов-то... :))))

TTS
30.09.2002, 23:00
2Nox Noctis: Во! Профессионалы пришли... :)
2Генч: может, если максспид>=диаметра шарика.
А что дальше? Поймали мы хиттест в каком-то диапазоне углов. Впаялся этот предмет в наш шарик. Но ведь нам надо посчитать производную от самого края этого объекта. То есть после того, как мы поймали хит, нам надо двигаться пошагово назад так же проверяя хиттестом тот диапазон углов, а он по идее должен сужаться. И так мы найдём крайнюю точку. Вернее, их нам нужно две, если мы считаем производную. Короче, как только диапазон хиттеста сузится до какого-то предопределённого значения, скажем, 1-2 градуса, берём крайние точки этого диапазона и считаем производную.
Тааак. Пусть x1,y1 и x2,y2 - координаты этих точек (допустим, они располагаются в порядке увеличения углов). Производная pr=(x2-x1)/(y2-y1) - тангенс угла накона касательной. Тангенс угла направления скорости шарика ySpeed/xSpeed. Угол между двумя прямыми atan(pr)-atan(ySpeed/xSpeed). Его надо прибавить к atan(pr). Получается угол отскока angle=2*atan(pr)-atan(ySpeed/xSpeed)... Надо бы проверить, не напутал ли чего...
Ладно, потом проверю, времени нет, пойду делами займусь...

Nox Noctis
30.09.2002, 23:50
есть такая вещь - линейная интерполяция...
вот без нее здесь никак, имхо :)
вопрос только как это рациональней придумать...

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


...в общем виде, универсально, это не решить, мне кажется