Fixed physics

This commit is contained in:
2025-07-11 09:52:13 +03:00
parent 0c27405da7
commit 9ef3194cde
4 changed files with 57 additions and 173 deletions

View File

@@ -81,8 +81,8 @@ void Character::setupBody()
inertia);
}
mGhostObject->setCollisionFlags(
btCollisionObject::CF_KINEMATIC_OBJECT |
btCollisionObject::CF_NO_CONTACT_RESPONSE);
btCollisionObject::CF_KINEMATIC_OBJECT /* |
btCollisionObject::CF_NO_CONTACT_RESPONSE */);
mGhostObject->setActivationState(DISABLE_DEACTIVATION);
Ogre::Bullet::KinematicMotionSimple *controller =
new Ogre::Bullet::KinematicMotionSimple(mGhostObject,

View File

@@ -224,17 +224,19 @@ void CharacterController::setupBody()
}
mGhostObject->setCollisionFlags(
btCollisionObject::CF_KINEMATIC_OBJECT |
btCollisionObject::CF_NO_CONTACT_RESPONSE);
btCollisionObject::CF_NO_CONTACT_RESPONSE );
mGhostObject->setActivationState(DISABLE_DEACTIVATION);
mWorld->attachCollisionObject(mGhostObject, mBodyEnt,
1,
0x7FFFFFF);
Ogre::Bullet::KinematicMotionSimple *controller =
new Ogre::Bullet::KinematicMotionSimple(mGhostObject,
mBodyNode);
mWorld->attachCollisionObject(mGhostObject, mBodyEnt,
btBroadphaseProxy::AllFilter,
btBroadphaseProxy::AllFilter);
OgreAssert(mGhostObject, "Need GhostObject");
OgreAssert(controller, "Need controller");
mWorld->getBtWorld()->addAction(controller);
assert(mCollisionShape);
OgreAssert(mCollisionShape, "No collision shape");
#if 0
if (mRigidBody->getMass() == 0) {
#if 0
@@ -264,9 +266,9 @@ void CharacterController::setupBody()
WorldData::get_singleton()->getBtWorld()->addAction(mController);
}
#endif
assert(mSkeleton->hasBone("Root"));
OgreAssert(mSkeleton->hasBone("Root"), "No root bone");
mRootBone = mSkeleton->getBone("Root");
assert(mRootBone);
OgreAssert(mRootBone, "No root bone");
}
void CharacterController::setupCamera()
{
@@ -544,6 +546,11 @@ void CharacterController::updateAnimations(Ogre::Real delta)
}
fadeAnimations(delta);
}
struct EntityCollisionListener
{
const Ogre::MovableObject* entity;
Ogre::Bullet::CollisionListener* listener;
};
void CharacterController::updateRootMotion(Ogre::Real delta)
{
Ogre::Vector3 boneMotion = mRootBone->getPosition();
@@ -562,15 +569,33 @@ void CharacterController::updateRootMotion(Ogre::Real delta)
/* Kinematic motion */
Ogre::Quaternion rot = mBodyNode->getOrientation();
Ogre::Vector3 gravity(0, -9.8, 0);
gravity.y = 0.5f;
Ogre::Vector3 velocity = rot * boneMotion / delta;
velocity += gravity * delta;
velocity += gravity * 10.0f * delta;
Ogre::Vector3 rotMotion = velocity * delta;
btTransform from(convert(mBodyNode->getOrientation()),
convert(mBodyNode->getPosition()));
mBodyNode->setPosition(mBodyNode->getPosition() + rotMotion);
// WorldData::get_singleton()->getWorld()->testBodyMotion(mRigidBody, from, Ogre::Bullet::convert(rotMotion), true,
// nullptr, false, std::set<btCollisionObject *>());
#if 0
if (mGhostObject->getNumOverlappingObjects() > 0) {
int i;
std::cout << "overlaps: " << mGhostObject->getNumOverlappingObjects() << "\n";
for (i = 0; i < mGhostObject->getNumOverlappingObjects(); i++) {
btCollisionObject *collided = nullptr;
EntityCollisionListener *a = nullptr;
collided = mGhostObject->getOverlappingObject(i);
if (collided)
a = static_cast<EntityCollisionListener*>(collided->getUserPointer());
std::cout << i << " " << collided << " " << a << " ";
if (a)
std::cout << a->entity << " ";
if (a->entity)
std::cout << a->entity->getName();
std::cout << "\n";
}
}
#endif
}
void CharacterController::fadeAnimations(Ogre::Real delta)
{

View File

@@ -159,4 +159,4 @@ private:
q = convert(from.getRotation());
v = convert(from.getOrigin());
}
};
};