簡體   English   中英

解決圓之間的2D彈性碰撞的簡單方法

[英]Simple way to resolve 2D elastic collision between circles

我需要最簡單的解決方案來解決圓之間的2D彈性碰撞,每個圓具有彼此相等的質量。

環境是Android畫布,其中Y軸朝下生長。 圓的邏輯表示是具有成功碰撞檢測功能的PlayerBall類。 PlayerBall具有以下字段:

圓心的xy位置

圓運動的velXvelY速度矢量表示為兩個標量值,可以為正或負。

直徑 -圓的直徑

public static void resolveCollision(PlayerBall ballOne, PlayerBall ballTwo) 
{
    double collisionAngle = Math.atan2(ballTwo.y - ballOne.y, ballTwo.x - ballOne.x); // angle for ball one
    // calculating new velocities between ballOne and ballTwo
    ...
    // setting the new velocities for both balls
    ballOne.setVelocity((float)ballOneVelX, (float)ballOneVelY);
    ballTwo.setVelocity((float)ballTwoVelX, (float)ballwTwoVelY);

}

我期望球的速度根據本文中定義的公式而變化https://en.wikipedia.org/wiki/Elastic_collision#Two-Dimension_collision_with_two_moving_objects

如果您知道兩個質量的x和y速度,則實際上不需要碰撞角。 球上的合力x和y可以計算為它們各自質量和速度的乘積。

您可以通過以下公式定義此關系:

V_xr1 =(V_x1 *(m1-m2)+(2 * m2 * V_x2))/(m1 + m1)

其中V_x1僅表示x平面上的速度,m1和m2是球的質量。 這將為您提供合成的x速度。 您可以應用相同的邏輯來計算y方向上的合力。

let newVelX1 = (vel1.vX * (m1 - m2) + (2 * m2 * vel2.vX)) / (m1 + m2);
let newVelY1 = (vel1.vY * (m1 - m2) + (2 * m2 * vel2.vY)) / (m1 + m2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM