![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2001
Сообщений: 4
|
кто-нить работал с фзикой во флэш? Как получить правильное отражение объекта от поверхности. В частности, когда круг сталкивается с плоскостью, и когда круг сталкивается с кругом.
|
|
|||||
|
Отражение круг-круг оказалось сделать сложнее чем я думал
. Пришлось пол-часика повспоминать планиметрию (кстати вопрос не совсем по физике, я бы сказал даже совсем не по физике). Вообщем у меня на Флэшер сорцы не закидываются поэтому придется все тута.(все делалется под Flash 5) 1)Создаем в новый мувик 400x400. 2)В нем делаем 3 пустых кейфрейма. 3) AS для 1-ого keyframe: bx = [];
by = [];
n = 3;
for (a=1; a<=n; a++) {
bx[a] = 0;
by[a] = 0;
_root.attachMovie( "ball","ball"+a, a);
_root["ball"+a]._x = random(400);
_root["ball"+a]._y = random(400);
}
bx[1] = (ball2._x-ball1._x+random(11)-5)/20;
by[1] = (ball2._y-ball1._y+random(11)-5)/20;
function calc_reflection (aa, bb) {
x1 = bx[aa];
y1 = by[aa];
x2 = bx[bb];
y2 = by[bb];
x3 = _root["ball"+aa]. _x-_root["ball"+bb]. _x;
y3 = _root["ball"+aa]. _y-_root["ball"+bb]. _y;
s = 1/(x3*x3+y3*y3);
a = (x1*x3+y1*y3)*s;
x4 = x3*a;
y4 = y3*a;
x1 = x1-x4;
y1 = y1-y4;
a = (x2*x3+y2*y3)*s;
x5 = x3*a;
y5 = y3*a;
x2 = x2-x5;
y2 = y2-y5;
bx[aa] = x1+x5;
by[aa] = y1+y5;
bx[bb] = x2+x4;
by[bb] = y2+y4;
}
function calc_collision (aa, bb) {
x1 = _root["ball"+aa]. _x;
y1 = _root["ball"+aa]. _y;
x2 = x1+bx[aa];
y2 = y1+by[aa];
x3 = _root["ball"+bb]._x;
y3 = _root["ball"+bb]._y;
r = 25;
i = bx[aa];
j = by[aa];
k = x1-x3;
l = y1-y3;
a = i*i+j*j;
if (a == 0) {
return 1;
}
b = 2*(i*k+j*l);
c = k*k+l*l-r*r;
d = b*b-4*a*c;
if (d<0) {
return 1;
}
t = (-b-Math.sqrt(d))*0.5/a;
if ((t<0) or (t>1)) {
return 1;
}
x4 = i*t+x1;
y4 = j*t+y1;
_root["ball"+aa]._x = x4;
_root["ball"+aa]._y = y4;
calc_reflection(aa, bb);
return 0;
}
f = 0;
for (aa=1; aa<=n; aa++) {
for (bb=1; bb<=n; bb++) {
if (bb != aa) {
if (calc_collision(aa, bb)==0) {
f = 1;
}
}
}
if (f==0) {
x = _root["ball"+aa]._x;
y = _root["ball"+aa]._y;
if (x<=0 or x>=400) {
bx[aa] = -bx[aa];
}
if (y<=0 or y>=400) {
by[aa] = -by[aa];
}
_root["ball"+aa]._x += bx[aa];
_root["ball"+aa]._y += by[aa];
}
}
4) Создаем в библиотеке пустой мувик и рисуем в нем круг размером 25х25. 5) Ставим у мувика в Linkage имя Ball. 6) Запускаем. если че не работает - пиши
__________________
Все что не делается - все к лучшему Все что к лучшему - то не делается Последний раз редактировалось руль; 05.08.2002 в 21:10. |
|
|||||
|
енто линейной алгеброй или аналитической геометрией в пространстве зовется
|
|
|||||
|
некрофил
Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
|
2руль и все-все-все
Слишком много кода. Задается векторное пространство с базовым набором функций(из котрых самая сложная - разложить вектор на составляющие) и потом на этом пространстве все работает.
__________________
...убивать людей не удовольствия ради, но для еды. |
|
|||||
|
Цитата:
|
|
|||||
|
некрофил
Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
|
Плюс, минус, умножить, задать абсолютный угол поворота, повернуть на определенный угол, получить проекцию на заданный вектор, получить перпендикуляный вектор.
__________________
...убивать людей не удовольствия ради, но для еды. |
|
|||||
|
2DeliMIter
Может приведешь свой кусочек кода где это реализуется (столкновения 2-ух окружностей) ?.Просто интересно. зы: причем тут геометрия в пространстве? Мы ведь про 2D случай говорим на плоскости тобишь...или нет ?
__________________
Все что не делается - все к лучшему Все что к лучшему - то не делается |
|
|||||
|
Регистрация: Aug 2001
Адрес: vg
Сообщений: 352
|
|
|
|||||
|
я про столконвение окружностей говорил
__________________
Все что не делается - все к лучшему Все что к лучшему - то не делается |
|
|||||
|
Регистрация: Aug 2001
Адрес: vg
Сообщений: 352
|
гы: а там чё кубики сталкиваются, кому то требуется переустановка глазки.sys
|
![]() |
Часовой пояс GMT +4, время: 02:02. |
|
|
« Предыдущая тема | Следующая тема » |
|
|