![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2009
Сообщений: 68
|
Вопрос по коду с http://www.emanueleferonato.com/2008...h-as3-version/
Так обрабатывается столкновение 2х шаров. Не могу понять физику процесса 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; } Я так понимаю тут весь прикол в вычислении векторов движения шаров. Могли бы прокоментировать код и объяснить как это работает? |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
// начальная позиция шара А 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;
__________________
Загружаем картинки, минуя ошибки безопасности Последний раз редактировалось i.o.; 12.07.2011 в 17:19. |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 68
|
Окей
Цитата:
А MCBallA.x = nMidpointX - nNormalX * nRadiusA - это что за формула и как ее понимать? |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Цитата:
Цитата:
Если понятно, что такое nNormalX и nNormalY, тогда nMidpointX - nNormalX * nRadiusA должно быть понятно тем более. Добавлено через 3 минуты Хотя здесь нужно уточнить. Нормаль здесь не совсем нормаль. nNormalX и nNormalY - это единичный вектор направления от шара А к шару Б.
__________________
Загружаем картинки, минуя ошибки безопасности Последний раз редактировалось i.o.; 12.07.2011 в 18:21. |
|
|||||
|
Тригонометрически "нормали" - это косинусы и синусы, значение которых не более 1, а значит утверждение, что мы "позиционируем шар А и Б так, чтобы они не пересекались" не верно в общем случае. Наоборот, мы вычисляем их положение относительно друг друга в момент столкновения для последующего вычисления направления движений.
__________________
Мой профиль на фрилансе |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|