Fixed physics
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -159,4 +159,4 @@ private:
|
||||
q = convert(from.getRotation());
|
||||
v = convert(from.getOrigin());
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user