Как я могу эмулировать двумерные столкновения в физическом мире с помощью Sphero, используя CollisionDetectedAsyncData?

Я использую сферо Android SDK.

Рассмотрим клон прорыва (например, Арканоид) и то, как мяч в 2D-игре отскакивает от боковых краев экрана, а также от верхней части экрана. Я полагаю, что то, как он отскакивает, использует базовое "отражение" и что все без трения, нет силы вращения или силы тяжести и т. Д. На скорость мяча влияет только то, как мяч ударяется о весло, и, возможно, некоторые специальные кирпичи, которые ускоряют это до. Предположим, мы создали нечто подобное в реальном мире, где у нас довольно узкий коридор, и, возможно, стены находятся на расстоянии всего 1 метра. Давайте выбросим кирпичи и весло и просто получим 2 стены и 1 мяч (шар - это, конечно, сферо). Рассмотрим связанный с изображением. Sphero 2D эмуляция столкновений с реальными физическими стенами

Предполагая, что я запускаю мяч в каком-то направлении с помощью маневра смахивания или джойстика или даже просто программно отсылаю его в указанном направлении с определенной скоростью, чтобы он имел некоторую скорость (x, y), когда он ударяет по первой стене, есть какой-то способ, которым я могу использовать данные, содержащиеся в CollisionDetectedAsyncData, чтобы определить, какой была эта Скорость во время удара, а также угол между стеной и линией, проходящей через центр шара и точку удара по мячу, чтобы я мог заставить мяч "подпрыгивать", как в клоне 2D-прорыва, как показано на рисунке? Если я смогу выяснить, какова скорость в момент удара и этот угол, тогда я смогу это сделать. Скорость мяча после "отскока" будет такой же, какой была непосредственно перед ударом по стене.

У меня есть проект настройки, где я слушаю столкновения, и я также получаю потоковую LocatorData. Таким образом, у меня есть и LocatorData и CollisionDetectedAsyncData, доступные для меня. Я регистрирую экземпляр CollisionDetectedAsyncData при обнаружении коллизии в соответствии с заданным порогом, а затем пытаюсь выполнить некоторые расчеты на его основе. Проблема в том, что я до сих пор не понимаю, что именно содержит CollisionDetectedAsyncData. Я не понимаю, что такое powerX и powerY. Док говорит, что это величина, но величина чего? Пожалуйста, прости мое невежество здесь. Как вы можете сказать, я очень слаб в физическом отделе. Во всяком случае, я также регистрирую LocatorData, когда разница текущего вектора ускорения и предыдущего вектора ускорения превышает 15000. Вот фрагмент моего журнала.

(CollisionDetectedAsyncData)

01-20 22:35:58.559: WARN/CollisionCalculator(15101): Begin calculateReactionHeading
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Calculating Reaction Heading with Algorithm 3
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Angle relative to [X:13.970461890040886, Y:76.02953810995912]
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Result Angle: 76.02953810995912
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Impact Heading: 0.0
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Power X: 205
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Power Y: 51
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Acceleration X: -0.562255859375
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Acceleration Y: -2.44140625E-4
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Calculated Heading: 283.9704618900409
01-20 22:35:58.559: WARN/CollisionCalculator(15101): Calculated Heading Mod Abs 360: 283.9704618900409
01-20 22:35:58.559: WARN/CollisionCalculator(15101): End calculateReactionHeading

(LocatorData)

01-20 22:35:58.679: WARN/CollisionCalculator(15101): Significant acceleration magnitude found! Magnitude: 48047.68312045681
01-20 22:35:58.679: WARN/CollisionCalculator(15101): Previous Vectors [Velocity: x=5.300000190734863, y=-1.2000000476837158], [Acceleration: x=-399.99961853027344, y=99.99990463256836]
01-20 22:35:58.679: WARN/CollisionCalculator(15101): Current Vectors [Velocity: x=27.899999618530273, y=92.19999694824219], [Acceleration: x=11299.999713897705, y=46699.99849796295]
01-20 22:35:58.679: WARN/CollisionCalculator(15101): Angle theta=3.2335627660548973
01-20 22:35:58.679: WARN/CollisionCalculator(15101): Angle of current Velocity vector relative to [X=73.16402521005779, Y=16.835974789942213]

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

Но в основном это сводится к следующему: могу ли я добиться того, что показано на моем прикрепленном изображении, в реальном мире с помощью Сферо и двух стен?

Спасибо.

1 ответ

Величины X и Y представляют собой двумерный вектор столкновения вдоль плоскости земли. Проблема с вашей установкой заключается в том, что гораздо проще узнать, где находятся стены, чтобы точно рассчитать угол отражения. Вы можете попытаться отразить угол поперек передней части робота, а затем добавить его к текущему курсу. Таким образом, если вы едете по курсу 0, получите столкновение под углом 45 градусов, сначала отразите угол поперек передней части робота (-45 или 315), затем добавьте текущий курс (0 + 315 = 315). Это должно дать вам приблизительное представление о том, под каким углом двигаться, чтобы казалось, что мяч "отскочил" от стены.

Другие вопросы по тегам