mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-29 16:25:42 +00:00
Merge pull request #1610 from Azaezel/alpha41/physicsFindings
physics findings
This commit is contained in:
commit
30ef348124
6 changed files with 15 additions and 14 deletions
|
|
@ -658,9 +658,9 @@ void Item::updateWorkingCollisionSet(const U32 mask, const F32 dt)
|
||||||
{
|
{
|
||||||
// It is assumed that we will never accelerate more than 10 m/s for gravity...
|
// It is assumed that we will never accelerate more than 10 m/s for gravity...
|
||||||
//
|
//
|
||||||
Point3F scaledVelocity = mVelocity * dt;
|
Point3F scaledVelocity = mVelocity * dt * TickSec;
|
||||||
F32 len = scaledVelocity.len();
|
F32 len = scaledVelocity.len();
|
||||||
F32 newLen = len + (10 * dt);
|
F32 newLen = len + (mDataBlock->getShape()->mRadius * dt * TickSec);
|
||||||
|
|
||||||
// Check to see if it is actually necessary to construct the new working list,
|
// Check to see if it is actually necessary to construct the new working list,
|
||||||
// or if we can use the cached version from the last query. We use the x
|
// or if we can use the cached version from the last query. We use the x
|
||||||
|
|
|
||||||
|
|
@ -6097,7 +6097,7 @@ void Player::updateWorkingCollisionSet()
|
||||||
// box by the possible movement in that tick.
|
// box by the possible movement in that tick.
|
||||||
Point3F scaledVelocity = mVelocity * TickSec;
|
Point3F scaledVelocity = mVelocity * TickSec;
|
||||||
F32 len = scaledVelocity.len();
|
F32 len = scaledVelocity.len();
|
||||||
F32 newLen = len + (10.0f * TickSec);
|
F32 newLen = len + (mDataBlock->getShape()->mRadius * TickSec);
|
||||||
|
|
||||||
// Check to see if it is actually necessary to construct the new working list,
|
// Check to see if it is actually necessary to construct the new working list,
|
||||||
// or if we can use the cached version from the last query. We use the x
|
// or if we can use the cached version from the last query. We use the x
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,8 @@ Rigid::Rigid()
|
||||||
friction = 0.5f;
|
friction = 0.5f;
|
||||||
atRest = false;
|
atRest = false;
|
||||||
|
|
||||||
sleepLinearThreshold = 0.0004f;
|
sleepLinearThreshold = POINT_EPSILON;
|
||||||
sleepAngThreshold = 0.0004f;
|
sleepAngThreshold = POINT_EPSILON;
|
||||||
sleepTimeThreshold = 0.75f;
|
sleepTimeThreshold = 0.75f;
|
||||||
sleepTimer = 0.0f;
|
sleepTimer = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +71,7 @@ void Rigid::integrate(F32 delta)
|
||||||
linVelocity = linMomentum * oneOverMass;
|
linVelocity = linMomentum * oneOverMass;
|
||||||
|
|
||||||
// 2. advance orientation if ang vel significant
|
// 2. advance orientation if ang vel significant
|
||||||
F32 angle = angVelocity.len();
|
F32 angle = angVelocity.len()*delta;
|
||||||
if (mFabs(angle)> POINT_EPSILON)
|
if (mFabs(angle)> POINT_EPSILON)
|
||||||
{
|
{
|
||||||
QuatF dq;
|
QuatF dq;
|
||||||
|
|
@ -101,7 +101,7 @@ void Rigid::integrate(F32 delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. refresh ang velocity
|
// 5. refresh ang velocity
|
||||||
updateAngularVelocity();
|
updateAngularVelocity(delta);
|
||||||
|
|
||||||
|
|
||||||
// 6. CoM update
|
// 6. CoM update
|
||||||
|
|
@ -138,7 +138,7 @@ void Rigid::updateCenterOfMass()
|
||||||
|
|
||||||
void Rigid::applyImpulse(const Point3F &r, const Point3F &impulse)
|
void Rigid::applyImpulse(const Point3F &r, const Point3F &impulse)
|
||||||
{
|
{
|
||||||
if (impulse.lenSquared() < mass) return;
|
if ((impulse.lenSquared() - mass) < POINT_EPSILON) return;
|
||||||
wake();
|
wake();
|
||||||
|
|
||||||
// Linear momentum and velocity
|
// Linear momentum and velocity
|
||||||
|
|
@ -304,7 +304,8 @@ void Rigid::trySleep(F32 dt)
|
||||||
// If there is active force/torque, don’t sleep
|
// If there is active force/torque, don’t sleep
|
||||||
if (!force.isZero() || !torque.isZero())
|
if (!force.isZero() || !torque.isZero())
|
||||||
{
|
{
|
||||||
sleepTimer = 0.0f; return;
|
sleepTimer = 0.0f;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const F32 linV2 = linVelocity.lenSquared();
|
const F32 linV2 = linVelocity.lenSquared();
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ public:
|
||||||
//
|
//
|
||||||
void setSleepThresholds(F32 linVel2, F32 angVel2, F32 timeToSleep);
|
void setSleepThresholds(F32 linVel2, F32 angVel2, F32 timeToSleep);
|
||||||
void wake();
|
void wake();
|
||||||
TORQUE_FORCEINLINE void updateAngularVelocity() { invWorldInertia.mulV(angMomentum, &angVelocity); }
|
TORQUE_FORCEINLINE void updateAngularVelocity(F32 delta) { Point3F deltaVel = angVelocity * delta; invWorldInertia.mulV(angMomentum, &deltaVel); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1138,7 +1138,7 @@ void RigidShape::updatePos(F32 dt)
|
||||||
|
|
||||||
// Update collision information based on our current pos.
|
// Update collision information based on our current pos.
|
||||||
bool collided = false;
|
bool collided = false;
|
||||||
if (!mDisableMove)
|
if (!mRigid.atRest && !mDisableMove)
|
||||||
{
|
{
|
||||||
collided = updateCollision(dt);
|
collided = updateCollision(dt);
|
||||||
|
|
||||||
|
|
@ -1151,7 +1151,7 @@ void RigidShape::updatePos(F32 dt)
|
||||||
{
|
{
|
||||||
F32 k = mRigid.getKineticEnergy();
|
F32 k = mRigid.getKineticEnergy();
|
||||||
F32 G = mNetGravity* dt * TickMs / mDataBlock->integration;
|
F32 G = mNetGravity* dt * TickMs / mDataBlock->integration;
|
||||||
F32 Kg = mRigid.mass * G * G;
|
F32 Kg = mRigid.mass * G * G * TickSec;
|
||||||
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
||||||
mRigid.setAtRest();
|
mRigid.setAtRest();
|
||||||
}
|
}
|
||||||
|
|
@ -1447,7 +1447,7 @@ void RigidShape::updateWorkingCollisionSet(const U32 mask)
|
||||||
// working list is updated on a Tick basis, which means we only expand our box by
|
// working list is updated on a Tick basis, which means we only expand our box by
|
||||||
// the possible movement in that tick, plus some extra for caching purposes
|
// the possible movement in that tick, plus some extra for caching purposes
|
||||||
Box3F convexBox = mConvex.getBoundingBox(getTransform(), getScale());
|
Box3F convexBox = mConvex.getBoundingBox(getTransform(), getScale());
|
||||||
F32 len = (mRigid.linVelocity.len() + 50) * TickSec;
|
F32 len = (mRigid.linVelocity.len() + mDataBlock->getShape()->mRadius) * TickSec;
|
||||||
F32 l = (len * 1.1) + 0.1; // fudge factor
|
F32 l = (len * 1.1) + 0.1; // fudge factor
|
||||||
convexBox.minExtents -= Point3F(l, l, l);
|
convexBox.minExtents -= Point3F(l, l, l);
|
||||||
convexBox.maxExtents += Point3F(l, l, l);
|
convexBox.maxExtents += Point3F(l, l, l);
|
||||||
|
|
|
||||||
|
|
@ -827,7 +827,7 @@ void Vehicle::updatePos(F32 dt)
|
||||||
{
|
{
|
||||||
F32 k = mRigid.getKineticEnergy();
|
F32 k = mRigid.getKineticEnergy();
|
||||||
F32 G = mNetGravity* dt * TickMs / mDataBlock->integration;
|
F32 G = mNetGravity* dt * TickMs / mDataBlock->integration;
|
||||||
F32 Kg = 0.5 * mRigid.mass * G * G;
|
F32 Kg = mRigid.mass * G * G * TickSec;
|
||||||
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
||||||
mRigid.setAtRest();
|
mRigid.setAtRest();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue