123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include "cone_twist_joint_bullet.h"
- #include "bullet_types_converter.h"
- #include "bullet_utilities.h"
- #include "rigid_body_bullet.h"
- #include <BulletDynamics/ConstraintSolver/btConeTwistConstraint.h>
- ConeTwistJointBullet::ConeTwistJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &rbAFrame, const Transform &rbBFrame) :
- JointBullet() {
- Transform scaled_AFrame(rbAFrame.scaled(rbA->get_body_scale()));
- scaled_AFrame.basis.rotref_posscale_decomposition(scaled_AFrame.basis);
- btTransform btFrameA;
- G_TO_B(scaled_AFrame, btFrameA);
- if (rbB) {
- Transform scaled_BFrame(rbBFrame.scaled(rbB->get_body_scale()));
- scaled_BFrame.basis.rotref_posscale_decomposition(scaled_BFrame.basis);
- btTransform btFrameB;
- G_TO_B(scaled_BFrame, btFrameB);
- coneConstraint = bulletnew(btConeTwistConstraint(*rbA->get_bt_rigid_body(), *rbB->get_bt_rigid_body(), btFrameA, btFrameB));
- } else {
- coneConstraint = bulletnew(btConeTwistConstraint(*rbA->get_bt_rigid_body(), btFrameA));
- }
- setup(coneConstraint);
- }
- void ConeTwistJointBullet::set_param(PhysicsServer::ConeTwistJointParam p_param, real_t p_value) {
- switch (p_param) {
- case PhysicsServer::CONE_TWIST_JOINT_SWING_SPAN:
- coneConstraint->setLimit(5, p_value);
- coneConstraint->setLimit(4, p_value);
- break;
- case PhysicsServer::CONE_TWIST_JOINT_TWIST_SPAN:
- coneConstraint->setLimit(3, p_value);
- break;
- case PhysicsServer::CONE_TWIST_JOINT_BIAS:
- coneConstraint->setLimit(coneConstraint->getSwingSpan1(), coneConstraint->getSwingSpan2(), coneConstraint->getTwistSpan(), coneConstraint->getLimitSoftness(), p_value, coneConstraint->getRelaxationFactor());
- break;
- case PhysicsServer::CONE_TWIST_JOINT_SOFTNESS:
- coneConstraint->setLimit(coneConstraint->getSwingSpan1(), coneConstraint->getSwingSpan2(), coneConstraint->getTwistSpan(), p_value, coneConstraint->getBiasFactor(), coneConstraint->getRelaxationFactor());
- break;
- case PhysicsServer::CONE_TWIST_JOINT_RELAXATION:
- coneConstraint->setLimit(coneConstraint->getSwingSpan1(), coneConstraint->getSwingSpan2(), coneConstraint->getTwistSpan(), coneConstraint->getLimitSoftness(), coneConstraint->getBiasFactor(), p_value);
- break;
- default:
- ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
- WARN_DEPRECATED
- break;
- }
- }
- real_t ConeTwistJointBullet::get_param(PhysicsServer::ConeTwistJointParam p_param) const {
- switch (p_param) {
- case PhysicsServer::CONE_TWIST_JOINT_SWING_SPAN:
- return coneConstraint->getSwingSpan1();
- case PhysicsServer::CONE_TWIST_JOINT_TWIST_SPAN:
- return coneConstraint->getTwistSpan();
- case PhysicsServer::CONE_TWIST_JOINT_BIAS:
- return coneConstraint->getBiasFactor();
- case PhysicsServer::CONE_TWIST_JOINT_SOFTNESS:
- return coneConstraint->getLimitSoftness();
- case PhysicsServer::CONE_TWIST_JOINT_RELAXATION:
- return coneConstraint->getRelaxationFactor();
- default:
- ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
- WARN_DEPRECATED;
- return 0;
- }
- }
|