kingBook

导航

统计

box2d 计算下一帧的位置/角度

var dt:Number=1/30;
var y0:Number=_body.GetPosition().y;
var y:Number=y0+_body.GetLinearVelocity().y*dt+_world.GetGravity().y*dt*dt;
trace(y0, "y:"+y);

 b2Island中的实现:

复制代码
var l_gravity:b2Vec2=b.m_customGravity?b.m_customGravity:gravity;
//==============================added================================
// Integrate velocities.
//b.m_linearVelocity += step.dt * (gravity + b.m_invMass * b.m_force);
b.m_linearVelocity.x += step.dt * (l_gravity.x + b.m_invMass * b.m_force.x);
b.m_linearVelocity.y += step.dt * (l_gravity.y + b.m_invMass * b.m_force.y);
b.m_angularVelocity += step.dt * b.m_invI * b.m_torque;

// Apply damping.
// ODE: dv/dt + c * v = 0
// Solution: v(t) = v0 * exp(-c * t)
// Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
// v2 = exp(-c * dt) * v1
// Taylor expansion:
// v2 = (1.0f - c * dt) * v1
b.m_linearVelocity.Multiply( b2Math.Clamp(1.0 - step.dt * b.m_linearDamping, 0.0, 1.0) );
b.m_angularVelocity *= b2Math.Clamp(1.0 - step.dt * b.m_angularDamping, 0.0, 1.0);
复制代码

 角度:

复制代码
var dt:Number=1/30;
var ang:Number=_body.GetAngle();

var angV:Number=_body.GetAngularVelocity();
angV += dt * _body.m_invI * _body.m_torque;
angV*=dt
angV *= b2Math.Clamp(1.0 - dt * _body.m_angularDamping, 0.0, 1.0);

var nextAng:Number=ang+angV;
/*trace("ang:",ang);
trace("angV:",angV);
trace("nextAng:",nextAng+"\n");*/
复制代码

LinearVelocity与像素的关系:

不考虑摩擦,刚体质量为1,无重力的情况下
linearVelocity*dt=distancePixel(像素距离)/ptm_ratio(像素到b2World单位)

 

posted on   kingBook  阅读(834)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示