I have a rather interesting problem that I am not sure where the problem is.
I am building a basic OpenGL/Bullet Physics engine just to learn the two systems. The project loads fine.
The problem is when I try to add my "PhysicsBox" object which is an inherited class.
I initialize the object like so; although I don't believe the problem is there:
Code: Select all
/*
Constructor for my PhysicsBox class.
*/
PhysicsBox::PhysicsBox(btDiscreteDynamicsWorld* PhysicsWorld, glm::vec3 SizeOfBox, glm::vec3 PositionOfBox, glm::vec3 InertiaOfBox, GLfloat MassOfBox) {
Vertices = new float[108] {
-1.0f, -1.0f, -1.0f, // triangle 1 : begin
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
1.0f, 1.0f, -1.0f, // triangle 2 : begin
-1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f, // triangle 2 : end
1.0f, -1.0f, 1.0f, // triangle 3 : begin
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f, // triangle 3 : end
1.0f, 1.0f, -1.0f, // triangle 4 : begin
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, // triangle 4 : end
-1.0f, -1.0f, -1.0f, // triangle 5 : begin
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f, // triangle 5 : end
1.0f, -1.0f, 1.0f, // triangle 6 : begin
-1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, -1.0f, // triangle 6 : end
-1.0f, 1.0f, 1.0f, // triangle 7 : begin
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f, // triangle 7 : end
1.0f, 1.0f, 1.0f, // triangle 8 : begin
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f, // triangle 8 : end
1.0f, -1.0f, -1.0f, // triangle 9 : begin
1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, // triangle 9 : end
1.0f, 1.0f, 1.0f, // triangle 10 : begin
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f, // triangle 10 : end
1.0f, 1.0f, 1.0f, // triangle 11 : begin
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f, // triangle 11 : end
1.0f, 1.0f, 1.0f, // triangle 12 : begin
-1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f // triangle 12 : end
};
NumOfVertices = 108;
Colors = new float[108] {
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
0.014f, 0.184f, 0.576f,
0.771f, 0.328f, 0.970f,
0.406f, 0.615f, 0.116f,
0.676f, 0.977f, 0.133f,
0.971f, 0.572f, 0.833f,
0.140f, 0.616f, 0.489f,
0.997f, 0.513f, 0.064f,
0.945f, 0.719f, 0.592f,
0.543f, 0.021f, 0.978f,
0.279f, 0.317f, 0.505f,
0.167f, 0.620f, 0.077f,
0.347f, 0.857f, 0.137f,
0.055f, 0.953f, 0.042f,
0.714f, 0.505f, 0.345f,
0.783f, 0.290f, 0.734f,
0.722f, 0.645f, 0.174f,
0.302f, 0.455f, 0.848f,
0.225f, 0.587f, 0.040f,
0.517f, 0.713f, 0.338f,
0.053f, 0.959f, 0.120f,
0.393f, 0.621f, 0.362f,
0.673f, 0.211f, 0.457f,
0.820f, 0.883f, 0.371f,
0.982f, 0.099f, 0.879f
};
NumOfColors = 108;
CurrentPhysicsWorld = PhysicsWorld;
HalfExtents = btVector3(SizeOfBox.x/2,
SizeOfBox.y/2,
SizeOfBox.z/2);
BoxPosition = btVector3(PositionOfBox.x,
PositionOfBox.y,
PositionOfBox.z);
BoxInertia = btVector3(InertiaOfBox.x,
InertiaOfBox.y,
InertiaOfBox.z);
ModelMatrix = glm::mat4(1.0f);
ModelMatrix = glm::translate(PositionOfBox) * glm::scale(SizeOfBox);
PhysicsBoxShape = new btBoxShape(HalfExtents);
PhysicsBoxMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), BoxPosition));
PhysicsBoxShape->calculateLocalInertia(MassOfBox, BoxInertia);
PhysicsBoxCI = new btRigidBody::btRigidBodyConstructionInfo(MassOfBox, PhysicsBoxMotionState, PhysicsBoxShape, BoxInertia);
PhysicsBoxRigidBody = new btRigidBody((*PhysicsBoxCI));
PhysicsBoxRigidBody->setUserPointer(this);
CurrentPhysicsWorld->addRigidBody(PhysicsBoxRigidBody);
PhysicsWorldID = CurrentPhysicsWorld->getCollisionObjectArray().size() - 1;
}
The problem is when I try and use the "PhysicsBoxRigidBody" pointer above to get the position in the world. I get an access violation.
I confirmed that the pointer itself is invalid via stepping my code.
Code: Select all
void PhysicsBox::GetPhysicsPosition(void) {
if (PhysicsBoxRigidBody && PhysicsBoxRigidBody->getMotionState()) {
btTransform CurrentPhysicsPosition;
/*
Access violation here.
*/
PhysicsBoxRigidBody->getMotionState()->getWorldTransform(CurrentPhysicsPosition);
/*
End Access violation.
*/
ModelMatrix *= glm::translate(glm::vec3(CurrentPhysicsPosition.getOrigin().getX(),
CurrentPhysicsPosition.getOrigin().getY(),
CurrentPhysicsPosition.getOrigin().getZ()
));
}
}
Feel free to clone and use on your own; I would hope that you can help me find the bug(s)!
The project is ready to run right away if you clone and open with Visual Studio's C++ 2013.
Thank you for your time.