-
Notifications
You must be signed in to change notification settings - Fork 1
/
rigidbody.cpp
141 lines (110 loc) · 3.76 KB
/
rigidbody.cpp
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "rigidbody.h"
#include "define.h"
#include <cassert>
#ifdef TAK_USE_BULLET_PHYSICS
RigidBody::RigidBody(float weight) : m_rigidBody(0), m_weight(weight), m_node(0)
{
}
RigidBody::~RigidBody()
{
if(m_rigidBody)
{
delete m_rigidBody->getMotionState();
delete m_rigidBody;
}
}
void RigidBody::SetPosition(const Vector3f& position)
{
assert(m_rigidBody);
btTransform transform = m_rigidBody->getCenterOfMassTransform();
transform.setOrigin(btVector3(position.x, position.y, position.z));
m_rigidBody->setCenterOfMassTransform(transform);
}
Vector3f RigidBody::GetPosition() const
{
assert(m_rigidBody);
btTransform trans;
m_rigidBody->getMotionState()->getWorldTransform(trans);
btVector3 pos = trans.getOrigin();
return Vector3f(pos.getX(), pos.getY(), pos.getZ());
}
Vector3f RigidBody::GetRotation() const
{
assert(m_rigidBody);
btTransform trans;
m_rigidBody->getMotionState()->getWorldTransform(trans);
float x, y, z;
trans.getBasis().getEulerZYX(x, y, z);
Vector3f rot = Vector3f(RADTODEG(x), RADTODEG(y), RADTODEG(z));
return rot;
}
void RigidBody::SetLinearVelocity(const Vector3f& velocity)
{
assert(m_rigidBody);
m_rigidBody->setLinearVelocity(btVector3(velocity.x, velocity.y, velocity.z));
}
Vector3f RigidBody::GetLinearVelocity() const
{
assert(m_rigidBody);
const btVector3& velocity = m_rigidBody->getLinearVelocity();
return Vector3f(velocity.x(), velocity.y(), velocity.z());
}
void RigidBody::SetKinematic()
{
m_rigidBody->setCollisionFlags(m_rigidBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
m_rigidBody->setActivationState(DISABLE_DEACTIVATION);
}
void RigidBody::ApplyForce(const Vector3f& force)
{
m_rigidBody->applyCentralImpulse(btVector3(force.x, force.y, force.z));
}
btRigidBody* RigidBody::GetInternalHandle() const
{
return m_rigidBody;
}
void RigidBody::LinkWithNode(SceneNode* node)
{
m_node = node;
}
SceneNode* RigidBody::GetLinkedNode() const
{
return m_node;
}
void RigidBody::SetInternalHandle(btRigidBody* handle)
{
m_rigidBody = handle;
m_rigidBody->setUserPointer(this);
}
BoxRigidBody::BoxRigidBody(float weight, const Vector3f& position, const Vector3f& size) : RigidBody(weight)
{
btCollisionShape* fallShape = new btBoxShape(btVector3(size.x / 2.f, size.y / 2.f, size.z / 2.f));
btDefaultMotionState* fallMotionState =
//new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
//new btDefaultMotionState(btTransform(btQuaternion(btVector3(0, 0, 1), 45),btVector3(0,10,0)));
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(position.x, position.y, position.z)));
btScalar mass = weight;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
SetInternalHandle(new btRigidBody(fallRigidBodyCI));
}
BoxRigidBody::~BoxRigidBody()
{
}
CapsuleRigidBody::CapsuleRigidBody(float weight) : RigidBody(weight)
{
// The total height is height+2*radius
btCollisionShape* fallShape = new btCapsuleShape(.5f, 1);
btDefaultMotionState* fallMotionState =
//new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
new btDefaultMotionState(btTransform(btQuaternion(btVector3(0, 0, 1), 0),btVector3(5,5,0)));
btScalar mass = weight;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
SetInternalHandle(new btRigidBody(fallRigidBodyCI));
}
CapsuleRigidBody::~CapsuleRigidBody()
{
}
#endif