【发布时间】:2012-03-23 11:43:38
【问题描述】:
我正在尝试计算在发生碰撞时作用在圆形物体上的力。不幸的是,我的机械装置有点生锈,所以我遇到了一些麻烦。
我有一个有成员的代理类
vector position // (x,y)
vector velocity // (x,y)
vector forward // (x,y)
float radius // radius of the agent (all circles)
float mass
所以如果我们有 A,B:Agent,并且在下一个时间步,速度将改变位置。如果要发生碰撞,我想计算出作用在物体上的力。
我知道需要 Line1 = (B.position-A.position) 来计算合力的角度,但是当我必须考虑车辆的当前速度以及碰撞角度。
arctan(L1.y,L1.x) 是力的角度(方向可以确定) sin/cos 是组件的高度/宽度
我也知道计算我需要使用的旋转轴 x = cos(T)*vel.x + sin(T)*vel.y y = cos(T)*vel.y + sin(T)*vel.x
这是我的大脑无法再应付的地方了。任何帮助将不胜感激。
正如我所说,目标是计算出施加到对象上的矢量力,因为我已经考虑了基本物理学。
添加了一些伪代码来显示我开始使用它的地方..
A,B:Agent
Agent {
vector position, velocity, front;
float radius,mass;
}
vector dist = B.position - A.position;
float distMag = dist.magnitude();
if (distMag < A.radius + B.radius) { // collision
float theta = arctan(dist.y,dist.x);
flost sine = sin(theta);
float cosine = cos(theta);
vector newAxis = new vector;
newAxis.x = cosine * dist .x + sine * dist .y;
newAxis.y = cosine * dist .y - sine * dist .x;
// Converted velocities
vector[] vTemp = {
new vector(), new vector() };
vTemp[0].x = cosine * agent.velocity.x + sine * agent.velocity.y;
vTemp[0].y = cosine * agent.velocity.y - sine * agent.velocity.x;
vTemp[1].x = cosine * current.velocity.x + sine * current.velocity.y;
vTemp[1].y = cosine * current.velocity.y - sine * current.velocity.x;
希望堆栈上有一个好奇的数学极客..
【问题讨论】:
-
我已经把所有东西都设置好了,我缺少的东西应该是相对容易的角度。转换后的轴意味着碰撞发生在我知道的角度,我需要对此做些什么..
-
你确定 force 是你想要的吗?在“刚性”物体的碰撞中,力是巨大的,但很短暂。重要的是效果,碰撞后物体的速度。我认为这些是刚性的、非旋转的圆圈。有弹性还是无弹性?
-
它们确实是非旋转圆,我试图先进行弹性碰撞,我确实通过改变速度来稍微改变一下,但它没有按预期工作。如果我可以计算力,那么我可以使用我必须计算出给定方向上的加速度的物理原理。
-
强制不是解决这个问题的好方法。从碰撞前的一帧到碰撞后的一帧,力作用的时间(换句话说,所有的加速度)已经发生。相反,保持动量和能量。
标签: physics trigonometry collision