Esempio n. 1
0
    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_);
    }
Esempio n. 5
0
 void impl::apply_force (point_3 const& f)
 {
     chassis_->applyCentralForce(to_bullet_vector3(f));
 }
Esempio n. 6
0
 void  impl::set_angular_velocity (point_3 const& a)
 {
     chassis_->setAngularVelocity(to_bullet_vector3(a));
 }
Esempio n. 7
0
 void  impl::set_linear_velocity (point_3 const& v)
 {
     chassis_->setLinearVelocity(to_bullet_vector3(v));
 }
Esempio n. 8
0
	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));
	}