Various nail constraint improvements
TODO: errors while scene loading / saving
This commit is contained in:
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
Written by: Nicola Candussi <nicola@fluidinteractive.com>
|
||||
|
||||
Modified by Roman Ponomarev <rponom@gmail.com>
|
||||
12/24/2009 : Nail constraint improvements
|
||||
|
||||
*/
|
||||
|
||||
//bt_nail_constraint.h
|
||||
@@ -58,10 +62,15 @@ public:
|
||||
}
|
||||
|
||||
virtual void get_world_pivot(vec3f &p) const {
|
||||
// btPoint2PointConstraint const* p2pc = static_cast<btPoint2PointConstraint const*>(m_constraint.get());
|
||||
// p[0] = p2pc->getPivotInB().x();
|
||||
// p[1] = p2pc->getPivotInB().y();
|
||||
// p[2] = p2pc->getPivotInB().z();
|
||||
btPoint2PointConstraint const* p2pc = static_cast<btPoint2PointConstraint const*>(m_constraint.get());
|
||||
p[0] = p2pc->getPivotInB().x();
|
||||
p[1] = p2pc->getPivotInB().y();
|
||||
p[2] = p2pc->getPivotInB().z();
|
||||
btVector3 pivotAinW = p2pc->getRigidBodyA().getCenterOfMassTransform()* p2pc->getPivotInA();
|
||||
p[0] = pivotAinW.x();
|
||||
p[1] = pivotAinW.y();
|
||||
p[2] = pivotAinW.z();
|
||||
}
|
||||
|
||||
virtual void set_world(vec3f const &p) {
|
||||
@@ -69,23 +78,47 @@ public:
|
||||
btVector3 world(p[0], p[1], p[2]);
|
||||
btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
|
||||
p2pc->setPivotA(pivotA);
|
||||
p2pc->setPivotB(world);
|
||||
p2pc->buildJacobian();
|
||||
btVector3 pivotB = p2pc->getRigidBodyB().getWorldTransform().inverse() (world);
|
||||
p2pc->setPivotB(pivotB);
|
||||
// p2pc->buildJacobian();
|
||||
}
|
||||
|
||||
virtual void get_world(vec3f &p) const {
|
||||
btPoint2PointConstraint const* p2pc = static_cast<btPoint2PointConstraint const*>(m_constraint.get());
|
||||
p[0] = p2pc->getPivotInB().x();
|
||||
p[1] = p2pc->getPivotInB().y();
|
||||
p[2] = p2pc->getPivotInB().z();
|
||||
btVector3 pivotAinW = p2pc->getRigidBodyA().getCenterOfMassTransform()* p2pc->getPivotInA();
|
||||
// p[0] = p2pc->getPivotInB().x();
|
||||
// p[1] = p2pc->getPivotInB().y();
|
||||
// p[2] = p2pc->getPivotInB().z();
|
||||
p[0] = pivotAinW.x();
|
||||
p[1] = pivotAinW.y();
|
||||
p[2] = pivotAinW.z();
|
||||
}
|
||||
|
||||
virtual void update_constraint()
|
||||
virtual void update_constraint(rigid_body_impl_t* rb)
|
||||
{
|
||||
btRigidBody* bt_body = static_cast<bt_rigid_body_t*>(rb)->body();
|
||||
btPoint2PointConstraint* p2pc = static_cast<btPoint2PointConstraint*>(m_constraint.get());
|
||||
btVector3 world = p2pc->getPivotInB();
|
||||
btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
|
||||
p2pc->setPivotA(pivotA);
|
||||
btVector3 world, pivot;
|
||||
if(bt_body == &p2pc->getRigidBodyA())
|
||||
{
|
||||
world = p2pc->getRigidBodyB().getWorldTransform() * p2pc->getPivotInB();
|
||||
pivot = p2pc->getRigidBodyA().getWorldTransform().inverse() * world;
|
||||
p2pc->setPivotA(pivot);
|
||||
}
|
||||
else if(bt_body == &p2pc->getRigidBodyB())
|
||||
{
|
||||
world = p2pc->getRigidBodyA().getWorldTransform() * p2pc->getPivotInA();
|
||||
pivot = p2pc->getRigidBodyB().getWorldTransform().inverse() * world;
|
||||
p2pc->setPivotB(pivot);
|
||||
}
|
||||
else
|
||||
{
|
||||
world.setValue(0.f, 0.f, 0.f);
|
||||
}
|
||||
|
||||
// btVector3 world = p2pc->getPivotInB();
|
||||
// btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
|
||||
// p2pc->setPivotA(pivotA);
|
||||
}
|
||||
protected:
|
||||
friend class bt_solver_t;
|
||||
@@ -93,12 +126,34 @@ protected:
|
||||
bt_nail_constraint_t(rigid_body_impl_t* rb, vec3f const& pivot):
|
||||
nail_constraint_impl_t()
|
||||
{
|
||||
btVector3 pivotW(pivot[0], pivot[1], pivot[2]);
|
||||
btRigidBody& bt_body = *static_cast<bt_rigid_body_t*>(rb)->body();
|
||||
btVector3 pivotA = bt_body.getCenterOfMassPosition();
|
||||
m_constraint.reset(new btPoint2PointConstraint(bt_body, -pivotA));
|
||||
const btTransform& tr = bt_body.getCenterOfMassTransform();
|
||||
btTransform iTr = tr.inverse();
|
||||
btVector3 nPivot = iTr * pivotW;
|
||||
m_constraint.reset(new btPoint2PointConstraint(bt_body, nPivot));
|
||||
// btVector3 pivotA = bt_body.getCenterOfMassPosition();
|
||||
// m_constraint.reset(new btPoint2PointConstraint(bt_body, -pivotA));
|
||||
rb->add_constraint(this);
|
||||
}
|
||||
|
||||
bt_nail_constraint_t(rigid_body_impl_t* rbA, rigid_body_impl_t* rbB, vec3f const& pivot):
|
||||
nail_constraint_impl_t()
|
||||
{
|
||||
btVector3 pivotW(pivot[0], pivot[1], pivot[2]);
|
||||
btRigidBody& bt_bodyA = *static_cast<bt_rigid_body_t*>(rbA)->body();
|
||||
const btTransform& trA = bt_bodyA.getCenterOfMassTransform();
|
||||
btTransform iTrA = trA.inverse();
|
||||
btVector3 nPivotA = iTrA * pivotW;
|
||||
btRigidBody& bt_bodyB = *static_cast<bt_rigid_body_t*>(rbB)->body();
|
||||
const btTransform& trB = bt_bodyB.getCenterOfMassTransform();
|
||||
btTransform iTrB = trB.inverse();
|
||||
btVector3 nPivotB = iTrB * pivotW;
|
||||
m_constraint.reset(new btPoint2PointConstraint(bt_bodyA, bt_bodyB, nPivotA, nPivotB));
|
||||
rbA->add_constraint(this);
|
||||
rbB->add_constraint(this);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user