Столкновение шаров

Тема в разделе "Разработка игр и приложений к ним", создана пользователем areostar, 24 янв 2010.

  1. areostar

    areostar Гость

    Здраствуйте! Вообще-то моя прога на Action Script 3.0 (Flash). Но вопрос по сути алгоритме!!

    игра которую я разрабатываю чем-то схожа с билиардом! нашёл в сети функцию обработки сталкновения:

    Код (Text):
    private function collideBall(ballA:Ball,ballB:Ball):void
    {
    var plotnost = 0.95;

    /**
    * Находим точку столкномвения
    * (Центр отрезка между двумя центрами)
    **/
    var cx = (ballA.tx + ballB.tx)/2;
    var cy = (ballA.ty + ballB.ty)/2;

    /**
    * Находим Растояние между шарами
    * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
    **/
    var d = geom.distance(ballA.tx, ballA.ty, ballB.tx, ballB.ty)/2;

    /**
    * Сдвигаем шарики (отскок)
    * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
    **/
    ballA.tx = cx + (_ballRadius) * (ballA.tx - ballB.tx)/2/d;
    ballA.ty = cy + (_ballRadius) * (ballA.ty - ballB.ty)/2/d;

    ballB.tx = cx + (_ballRadius) * (ballB.tx - ballA.tx)/2/d;
    ballB.ty = cy + (_ballRadius) * (ballB.ty - ballA.ty)/2/d;


    /**
    * Сдвигаем шарики промежуточное положение
    * (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
    **/
    ballB.tx = ballB.tx - ballB.speedX/_delimiter;
    ballB.ty = ballB.ty - ballB.speedY/_delimiter;

    ballA.tx = ballA.tx - ballA.speedX/_delimiter;
    ballA.ty = ballA.ty - ballA.speedY/_delimiter;

    /**
    * Получаем скорости шаров
    **/
    var v1 = Math.sqrt(ballA.speedX * ballA.speedX + ballA.speedY * ballA.speedY);
    var v2 = Math.sqrt(ballB.speedX * ballB.speedX + ballB.speedY * ballB.speedY);

    /**
    * Получаем углы наклона скоростей к оси OX
    **/
    var fi1 = Math.atan2(ballA.speedY,ballA.speedX);
    var fi2 = Math.atan2(ballB.speedY,ballB.speedX);

    /**
    * Получаем углы наклона между линией соединяющей центры шаров и осью OX
    **/
    var lambda1 = Math.atan2(ballB.ty - ballA.ty, ballB.tx - ballA.tx);
    var lambda2 = Math.atan2(ballA.ty - ballB.ty, ballA.tx - ballB.tx);

    /**
    * Получаем проекции скоростей на соединяющую линию между шарами
    **/
    var pv1 = v1 * Math.cos(lambda1 - fi1)*plotnost;
    var pv2 = v2 * Math.cos(lambda2 - fi2)*plotnost;

    /**
    * Получаем новые скорости (векроты направления)
    **/
    ballA.speedX = ballA.speedX - pv1 * Math.cos(lambda1) + pv2 * Math.cos(lambda2);
    ballA.speedY = ballA.speedY - pv1 * Math.sin(lambda1) + pv2 * Math.sin(lambda2);

    ballB.speedX = ballB.speedX - pv2 * Math.cos(lambda2) + pv1 * Math.cos(lambda1);
    ballB.speedY = ballB.speedY - pv2 * Math.sin(lambda2) + pv1 * Math.sin(lambda1);
    }
    В принципе работает но...

    Одно из главных отличий от билиарда в том чтто один из игровых снорядов(продолжим называть их шарами) значительно больше остальных! В реале у большенства диаметр 3,5 а у большого 5!

    какие поправки в алгоритм мне надо внести с учётом этого! поподробнее если можно! подобную прогу пишу в первый раз!!!
     
  2. berserker

    berserker Гость

    Ну вообще, если по - простому рассуждать, то у этих шаров соответственно масса (5)^3 к (3,5)^3 следовательно нужно в параметре speedX и speedY учесть эту пропорцию . Если изучали физику, то вспомните закон сохранения импульса. Только надо это отношение отнести не к каждой проекции, а к т. н. вектору скорости, а потом разложить на проекции (эта процедура я думаю в алгоритме уже есть). Также можно заметить, что измениться угол скоростей по проекции Z на величину arctg ((R-r)/(2*sqrt(R*r)), поэтому скорость по проекциям X и Y опять таки уменьшиться. Для удобства советую нарисовать два шара и вектор скорости в 3-х пр-ве, и аккуратненько разложить все по проекциям...

    P/S Надеюсь я не поздно заметил данную тему)
     
Загрузка...
Похожие Темы - Столкновение шаров
  1. admin
    Ответов:
    4
    Просмотров:
    3.345

Поделиться этой страницей