After fixing the issues I had in my other topic (which no one replied to

The main problem now is that collisions don't seem to be happening, I can still walk through walls. I imagine its something I'm doing/Not doing as it maybe, but I'm not sure what. So if I post the code of the relevant functions and how I'm using them, could someone take a look and see why its not working correctly?
I've probably posted more code than is neccesary but I wanted to make sure I didn't miss anything, chances are you won't have to look at all of it to see what idiotitc thing I've missed.
Here is the init function I'm using:
Code: Select all
void Scene::physicsInit()
{
maxRigidBodies = 1024; //maybe this should be in the scene file instead
btVector3 worldAabbMin(-10000, -10000, -10000); //world size for broadphase.
btVector3 worldAabbMax(10000, 10000, 10000); //should probs be loaded from scene file to
broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, (unsigned short)maxRigidBodies);
m_overlappingPairCache = broadphase;
collisionConfig = new btDefaultCollisionConfiguration();
dispatcher = new btCollisionDispatcher(collisionConfig);
solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, m_overlappingPairCache, solver, collisionConfig);
}
Code: Select all
void Scene::initPlayer()
{
btTransform startTransform;
startTransform.setIdentity();
startTransform.setOrigin(btVector3(0.0, 0.0, 10.0));
m_ghostObject = new btPairCachingGhostObject();
m_ghostObject->setWorldTransform(startTransform);
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
btScalar characterHeight = 0.75;
btScalar characterWidth = 0.75;
btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight);
m_ghostObject->setCollisionShape (capsule);
m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT);
btScalar stepHeight = btScalar(0.0);
m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight);
dynamicsWorld->addCollisionObject(m_ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
dynamicsWorld->addCharacter(m_character);
//not sure these lines needed or not
dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_ghostObject->getBroadphaseHandle(),dispatcher);
m_character->reset ();
//m_character->warp (btVector3(0.0f, 0.0f, 0.0f));
}
Code: Select all
void Scene::getPlayerPos(cnVertex *vert, cnRotationVertex *rot)
{
btTransform trans;
trans = m_ghostObject->getWorldTransform();
vert->x = trans.getOrigin().getX();
vert->y = trans.getOrigin().getY();
vert->z = trans.getOrigin().getZ();
btQuaternion qTemp;
qTemp = trans.getRotation();
btVector3 vTemp = qTemp.getAxis();
rot->x = (float)vTemp.x();
rot->y = (float)vTemp.y();
rot->z = (float)vTemp.z();
rot->angle = (float)(qTemp.getAngle() * radToDeg);
}
Code: Select all
void Scene::setVel(bool gForward, bool gBackward, float yRot,float dt)
{
///set walkDirection for our character
btTransform xform;
xform = m_ghostObject->getWorldTransform();
btVector3 forwardDir = xform.getBasis()[2];
// printf("forwardDir=%f,%f,%f\n",forwardDir[0],forwardDir[1],forwardDir[2]);
btVector3 upDir = xform.getBasis()[1];
btVector3 strafeDir = xform.getBasis()[0];
forwardDir.normalize();
upDir.normalize();
strafeDir.normalize();
btVector3 walkDirection = btVector3(0.0, 0.0, 0.0);
btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s
btScalar walkSpeed = walkVelocity * dt;
//rotate view
if (yRot)
{
btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();
orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yRot));
m_ghostObject->getWorldTransform().setBasis(orn);
}
/* if (gRight)
{
btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();
orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),gRight));
m_ghostObject->getWorldTransform().setBasis(orn);
}*/
if (gForward)
walkDirection += forwardDir;
if (gBackward)
walkDirection -= forwardDir;
m_character->setWalkDirection(walkDirection*walkSpeed);
}
Code: Select all
cnVertex TVert;
cnRotationVertex TRot;
scene->setVel(forward, backward, Yrot,(1.0f/420.0f));
scene->getPlayerPos(&TVert, &TRot);
glRotatef(TRot.angle, TRot.x, TRot.y, TRot.z);
glTranslatef(TVert.x, TVert.y, TVert.z);
scene->drawSCOs((1.0f/420.0f));
SDL_GL_SwapBuffers();
Code: Select all
void Scene::drawSCOs(float dt)
{
GLint mode = 0;
glGetIntegerv(GL_RENDER_MODE, &mode);
if(mode == GL_RENDER)
{
for(int i=0; i<header.numRSO; i++)
{
dynamicsWorld->stepSimulation(dt, 10);
btTransform trans;
RSOs[i].getRigidBody()->getMotionState()->getWorldTransform(trans);
unsigned int typetemp = RSOs[i].getModelType();
cnVertex vertemp;
cnRotationVertex rotemp;
vertemp.x = trans.getOrigin().getX();
vertemp.y = trans.getOrigin().getY();
vertemp.z = trans.getOrigin().getZ();
btQuaternion qTemp;
qTemp = trans.getRotation();
btVector3 vTemp = qTemp.getAxis();
rotemp.x = (float)vTemp.x();
rotemp.y = (float)vTemp.y();
rotemp.z = (float)vTemp.z();
rotemp.angle = (float)(qTemp.getAngle() * radToDeg);
models[typetemp].setPosition(vertemp);
models[typetemp].setRotation(rotemp);
models[typetemp].draw();
}
}
...}