Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обработка столкновений (http://www.flasher.ru/forum/showthread.php?t=160411)

Castro 12.07.2011 16:49

Обработка столкновений
 
Вопрос по коду с http://www.emanueleferonato.com/2008...h-as3-version/
Так обрабатывается столкновение 2х шаров.
Не могу понять физику процесса
Код AS3:

private function solveBalls ( MCBallA:MovieClip, MCBallB:MovieClip ) : void
                {
                        var nX1:Number = MCBallA.x;
                        var nY1:Number = MCBallA.y;
                        var nDistX:Number = MCBallB.x - nX1;
                        var nDistY:Number = MCBallB.y - nY1;
 
                        var nDistance:Number = Math.sqrt ( nDistX * nDistX + nDistY * nDistY );
                        var nRadiusA:Number = MCBallA.width/2;
                        var nRadiusB:Number = MCBallB.width/2;
                        //var nRadius:Number = 10;
 
                        var nNormalX:Number = nDistX/nDistance;
                        var nNormalY:Number = nDistY/nDistance;
 
                        var nMidpointX:Number = ( nX1 + MCBallB.x )/2;
                        var nMidpointY:Number = ( nY1 + MCBallB.y )/2;
 
                        MCBallA.x = nMidpointX - nNormalX * nRadiusA;
                        MCBallA.y = nMidpointY - nNormalY * nRadiusA;
                        MCBallB.x = nMidpointX + nNormalX * nRadiusB;
                        MCBallB.y = nMidpointY + nNormalY * nRadiusB;
 
                        var nVector:Number = ( ( MCBallA.nSpeedX - MCBallB.nSpeedX ) * nNormalX )+ ( ( MCBallA.nSpeedY - MCBallB.nSpeedY ) * nNormalY );
                        var nVelX:Number = nVector * nNormalX;
                        var nVelY:Number = nVector * nNormalY;
 
                        MCBallA.nSpeedX -= nVelX;
                        MCBallA.nSpeedY -= nVelY;
                        MCBallB.nSpeedX += nVelX;
                        MCBallB.nSpeedY += nVelY;
                }

Зачем нужно nNormalX:Number, какой смысл в nMidpointX - nNormalX * nRadiusA
Я так понимаю тут весь прикол в вычислении векторов движения шаров.


Могли бы прокоментировать код и объяснить как это работает?

i.o. 12.07.2011 17:12

Код AS3:

// начальная позиция шара А
var nX1:Number = MCBallA.x; // Х
var nY1:Number = MCBallA.y; // Y
 
// вектор направления (от шара А к шару Б)
var nDistX:Number = MCBallB.x - nX1; // X
var nDistY:Number = MCBallB.y - nY1; // Y
 
// расстояния между шарами
var nDistance:Number = Math.sqrt ( nDistX * nDistX + nDistY * nDistY );
// радиус шара А
var nRadiusA:Number = MCBallA.width/2;
// радиус шара Б
var nRadiusB:Number = MCBallB.width/2;
 
// нормаль направления (от шара А к шару Б)
var nNormalX:Number = nDistX/nDistance; // Х
var nNormalY:Number = nDistY/nDistance; // Y
 
// средняя точка между шарами
var nMidpointX:Number = ( nX1 + MCBallB.x )/2; // Х
var nMidpointY:Number = ( nY1 + MCBallB.y )/2; // Y
 
// позиционируем шар А и Б так, чтобы они не пересекались.
// Средняя точка +/- нормаль*радиус
// Шар А
MCBallA.x = nMidpointX - nNormalX * nRadiusA;
MCBallA.y = nMidpointY - nNormalY * nRadiusA;
// Шар Б
MCBallB.x = nMidpointX + nNormalX * nRadiusB;
MCBallB.y = nMidpointY + nNormalY * nRadiusB;
 
// Скалярное произведение вектора разности скорости на нормаль направления (от шара А к шару Б)
// Т.е. вычисляется общая скорость сближения с учетом направлений движения шаров
var nVector:Number = ( ( MCBallA.nSpeedX - MCBallB.nSpeedX ) * nNormalX )+ ( ( MCBallA.nSpeedY - MCBallB.nSpeedY ) * nNormalY );
 
// Перевод скорости сближения в вектор
var nVelX:Number = nVector * nNormalX;
var nVelY:Number = nVector * nNormalY;
 
// Вычисление новых скоростей для шаров, после соударения
// Для шара А - вычитаем
MCBallA.nSpeedX -= nVelX;
MCBallA.nSpeedY -= nVelY;
// Для шара Б - прибавляем
MCBallB.nSpeedX += nVelX;
MCBallB.nSpeedY += nVelY;


Castro 12.07.2011 18:13

Окей

Цитата:

Нормализованный вектор - это вектор, длина которого равна единице.

Формула для нахождения нормализованного вектора следующая - все компоненты вектора необходимо разделить на его длин
-это более менее понятно

А MCBallA.x = nMidpointX - nNormalX * nRadiusA - это что за формула и как ее понимать?

i.o. 12.07.2011 18:15

Цитата:

А MCBallA.x = nMidpointX - nNormalX * nRadiusA - это что за формула и как ее понимать?
Что вам не понятно из:
Цитата:

// позиционируем шар А и Б так, чтобы они не пересекались.
// Средняя точка +/- нормаль*радиус
?
Если понятно, что такое nNormalX и nNormalY, тогда nMidpointX - nNormalX * nRadiusA должно быть понятно тем более.

Добавлено через 3 минуты
Хотя здесь нужно уточнить. Нормаль здесь не совсем нормаль. nNormalX и nNormalY - это единичный вектор направления от шара А к шару Б.

SvetozarPNZ 14.07.2011 14:30

Тригонометрически "нормали" - это косинусы и синусы, значение которых не более 1, а значит утверждение, что мы "позиционируем шар А и Б так, чтобы они не пересекались" не верно в общем случае. Наоборот, мы вычисляем их положение относительно друг друга в момент столкновения для последующего вычисления направления движений.


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

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