impl::impl(system_impl_ptr sys,compound_sensor_ptr s,/*compound_shape_proxy& s,*/ params_t const& params, decart_position const& pos) : bt_body_user_info_t(rb_aircraft) , sys_ (sys) , chassis_ (sys->dynamics_world()) , raycast_veh_(sys->dynamics_world()) , chassis_shape_(compound_sensor_impl_ptr(s)->cs_) , params_(params) , elevator_(0) , ailerons_(0) , rudder_(0) , thrust_(0) , steer_(0) , prev_attack_angle_(0) , has_chassis_contact_(false) , body_contact_points_(1.5) { tuning_.m_maxSuspensionTravelCm = 500; btTransform tr; tr.setIdentity(); btVector3 aabbMin,aabbMax; #if 0 chassis_shape_.get()->getAabb(tr,aabbMin,aabbMax); #else chassis_shape_->getAabb(tr,aabbMin,aabbMax); #endif btScalar dxx = btScalar(params_.wingspan / 2); btScalar dyy = btScalar(params_.length / 2); btScalar dzz = btScalar((aabbMax.z() - aabbMin.z()) / 2); btScalar m12 = btScalar((params_.mass) /12); btVector3 inertia = m12 * btVector3(dyy*dyy + dzz*dzz, dxx*dxx + dzz*dzz, dyy*dyy + dxx*dxx); btDefaultMotionState* motionState = new btDefaultMotionState(tr); btRigidBody::btRigidBodyConstructionInfo chassis_construction_info(btScalar(params_.mass), NULL/*new custom_ms*//*motionState*/, chassis_shape_/*&*chassis_shape_.get()*/, inertia); chassis_.reset(phys::bt_rigid_body_ptr(boost::make_shared<btRigidBody>(chassis_construction_info))); // FIXME TODO chassis_->setCenterOfMassTransform(to_bullet_transform(pos.pos, pos.orien.cpr())); FIXME("Off point for bullet") #if 1 chassis_->setLinearVelocity(to_bullet_vector3(pos.dpos)); #endif //chassis_->setDamping(0.05f, 0.5f); chassis_->setRestitution(0.1f); //chassis_->setActivationState(DISABLE_DEACTIVATION); chassis_->setFriction(0.3f); raycast_veh_.reset(boost::make_shared<btRaycastVehicle>(tuning_, &*chassis_.get(), &*sys->vehicle_raycaster())); raycast_veh_->setCoordinateSystem(0,2,1); sys_->dynamics_world()->addAction(this); sys_->register_rigid_body(this); chassis_->setUserPointer(this); }
impl::impl(system_impl_ptr sys,compound_sensor_ptr s,params_t const& params, decart_position const& pos) : bt_body_user_info_t(rb_simple) , sys_ (sys) , chassis_ (sys->dynamics_world()) , chassis_shape_ (s?compound_sensor_impl_ptr(s)->cs_: create_compound_shape()) , params_ (params) , has_chassis_contact_ (false) , body_contact_points_ (1.5) { btTransform tr; tr.setIdentity(); btVector3 aabbMin,aabbMax; #if 1 FIXME(chassis_shape_) chassis_shape_->getAabb(tr,aabbMin,aabbMax); const float fake_mass = 20; btScalar dxx = btScalar((aabbMax.x() - aabbMin.x()) / 2); btScalar dyy = btScalar((aabbMax.y() - aabbMin.y()) / 2); btScalar dzz = btScalar((aabbMax.z() - aabbMin.z()) / 2); btScalar m12 = btScalar((fake_mass) /12); btVector3 inertia = m12 * btVector3(dyy*dyy + dzz*dzz, dxx*dxx + dzz*dzz, dyy*dyy + dxx*dxx); btDefaultMotionState* motionState = new btDefaultMotionState(tr); btRigidBody::btRigidBodyConstructionInfo chassis_construction_info(btScalar(fake_mass), /*NULL*//*new custom_ms*/motionState, new btBoxShape(btVector3(.6,.6,.6))/*chassis_shape_*//*&*chassis_shape_.get()*/, inertia); chassis_.reset(boost::make_shared<btRigidBody>(chassis_construction_info)); // FIXME TODO chassis_->setCenterOfMassTransform(to_bullet_transform(pos.pos, pos.orien.cpr())); #if 0 chassis_->setLinearVelocity(to_bullet_vector3(pos.dpos)); #endif //chassis_->setDamping(0.05f, 0.5f); chassis_->setRestitution(0.1f); //chassis_->setActivationState(DISABLE_DEACTIVATION); chassis_->setFriction(0.3f); #endif //sys_->dynamics_world()->addAction(this); sys_->register_rigid_body(this); #if 1 chassis_->setUserPointer(this); #endif }
void impl::create_rope( bt_softrigid_dynamics_world_ptr bw, params_t::rope_t const& rope, unsigned seg_num) { if(!bw) return; ropes_.back().get()->reset(bt_create_rope(bw->getWorldInfo(), to_bullet_vector3(rope.first), to_bullet_vector3(rope.second), seg_num, 1+2)); auto& psb = *ropes_.back().get(); psb->m_cfg.piterations = 5;/*4;*/ // psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS; //btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS; // psb->m_cfg.kAHR = 1.0; psb->m_materials[0]->m_kLST = 0.2;// 0.1+((n - i)/(btScalar)(n-1))*0.9; //psb->m_materials[0]->m_kVST = 1.0; //psb->m_materials[0]->m_kAST = 1.0; psb->setTotalMass(0.002); psb->setUserPointer(this); }
bvh_static_mesh::bvh_static_mesh(system_impl_ptr sys, sensor_ptr s) : sys_(sys) { btAlignedObjectArray<btVector3> points; //for (size_t i = 0; i < s->chunks_count(); ++i) //{ // for (size_t j = 0; j < s->triangles_count(i); ++j) // { // cg::triangle_3f tr = s->triangle(i, j); // if (s->material(i) == "ground" || s->material(i) == "building" || s->material(i) == "concrete") // mesh_.addTriangle(to_bullet_vector3(tr[0]), to_bullet_vector3(tr[1]), to_bullet_vector3(tr[2]), false); // } //} btMatrix3x3 m; m.setIdentity(); FIXME(Need btBvhTriangleMeshShape shape) //shape_ = boost::shared_ptr<btCollisionShape>(new btBvhTriangleMeshShape(&mesh_, true)); //shape_ = shared_ptr<btCollisionShape>(new btStaticPlaneShape(btVector3(0, 0, 1), 0)); //////////////////////////// // Stub for the ground // osg::Vec3 norm = plane.getNormal(); btCollisionShape* groundShape = new btStaticPlaneShape( btVector3(0.0, 0.0, 1.0), 0 ); btTransform groundTransform; groundTransform.setIdentity(); btDefaultMotionState* motionState = new btDefaultMotionState(groundTransform); btRigidBody::btRigidBodyConstructionInfo rigidInfo( 0.0, motionState, groundShape, btVector3(0.0, 0.0, 0.0) ); body_ = shared_ptr<btRigidBody>(new btRigidBody(rigidInfo)); //////////////////////////// // body_ = shared_ptr<btRigidBody>(new btRigidBody(0, 0, &*shape_)); body_->setRestitution(0.1f); body_->setCenterOfMassTransform(btTransform(m, to_bullet_vector3(cg::point_3()))); body_->setFriction(0.99f); body_->setActivationState(DISABLE_SIMULATION); body_->setUserPointer(new bt_body_user_info_t(rb_terrain)); body_->setCollisionFlags(body_->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); sys_->dynamics_world()->addRigidBody(&*body_); }
void impl::apply_force (point_3 const& f) { chassis_->applyCentralForce(to_bullet_vector3(f)); }
void impl::set_angular_velocity (point_3 const& a) { chassis_->setAngularVelocity(to_bullet_vector3(a)); }
void impl::set_linear_velocity (point_3 const& v) { chassis_->setLinearVelocity(to_bullet_vector3(v)); }
void impl::set_position(const decart_position& pos) { chassis_->setCenterOfMassTransform(to_bullet_transform(pos.pos, pos.orien.cpr())); chassis_->setLinearVelocity(to_bullet_vector3(pos.dpos)); }