Help with Invalid Pointer Reference for OpenGL/Bullet Physics Project

Hello,

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; hopefully some folks are familiar with Bullet Physics although I don't believe the problem is there:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*

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;
}


So, long story short at this point the box I have should be initialized and added into the Physics world.

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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()
			));
	}

}


In order to better facilitate troubleshooting of the problem the COMPLETE project is available via GitHub here: https://github.com/tmason101/QuickPhysics

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.
I don't know this library at all, but it appears that 'btMotionState' is an abstract base class. You'll need to setup a class that inherits from this and defines these functions.

EDIT: Forgot the link: http://bulletphysics.org/Bullet/BulletFull/classbtMotionState.html
Last edited on
I don't know this library either.

Don't you need to initialize "CurrentPhysicsPosition". (line 4 second code snippet)
Hey @norm b

Tried that, same result:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void PhysicsBox::GetPhysicsPosition(void) {

	if (PhysicsBoxRigidBody && PhysicsBoxRigidBody->getMotionState()) {

		btTransform CurrentPhysicsPosition = btTransform();

		PhysicsBoxRigidBody->getMotionState()->getWorldTransform(CurrentPhysicsPosition);

		ModelMatrix *= glm::translate(glm::vec3(CurrentPhysicsPosition.getOrigin().getX(),
			CurrentPhysicsPosition.getOrigin().getY(),
			CurrentPhysicsPosition.getOrigin().getZ()
			));
	}

}
@Computergeek01,

Thanks for the tip; It's so weird because other examples online I followed just used that method similar to how I used it without a problem.

For example, here is the base "Hello World" example which works 100%:

Notice how the base class is used without issue.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>

#include <btBulletDynamicsCommon.h>

int main (void)
{

        btBroadphaseInterface* broadphase = new btDbvtBroadphase();

        btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
        btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);

        btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;

        btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);

        dynamicsWorld->setGravity(btVector3(0, -10, 0));


        btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0, 1, 0), 1);

        btCollisionShape* fallShape = new btSphereShape(1);


        btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0)));
        btRigidBody::btRigidBodyConstructionInfo
                groundRigidBodyCI(0, groundMotionState, groundShape, btVector3(0, 0, 0));
        btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
        dynamicsWorld->addRigidBody(groundRigidBody);


        btDefaultMotionState* fallMotionState =
                new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 50, 0)));
        btScalar mass = 1;
        btVector3 fallInertia(0, 0, 0);
        fallShape->calculateLocalInertia(mass, fallInertia);
        btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass, fallMotionState, fallShape, fallInertia);
        btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
        dynamicsWorld->addRigidBody(fallRigidBody);


        for (int i = 0; i < 300; i++) {
                dynamicsWorld->stepSimulation(1 / 60.f, 10);

                btTransform trans;
                fallRigidBody->getMotionState()->getWorldTransform(trans);

                std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
        }

        dynamicsWorld->removeRigidBody(fallRigidBody);
        delete fallRigidBody->getMotionState();
        delete fallRigidBody;

        dynamicsWorld->removeRigidBody(groundRigidBody);
        delete groundRigidBody->getMotionState();
        delete groundRigidBody;


        delete fallShape;

        delete groundShape;


        delete dynamicsWorld;
        delete solver;
        delete collisionConfiguration;
        delete dispatcher;
        delete broadphase;

        return 0;
}
Topic archived. No new replies allowed.