Ejemplo n.º 1
0
	virtual ~RigidObject() 
	{
		if(body->getMotionState())
			delete body->getMotionState();
		world->removeRigidBody(body);
		delete body;
	}
Ejemplo n.º 2
0
	virtual ~RigidObject() 
	{
		if(body)
		{
			if(body->getMotionState() != NULL)
				delete body->getMotionState();
	//		if(body->getCollisionShape() != NULL)
	//			delete body->getCollisionShape();
			world->removeRigidBody(body);
			delete body;
		}
	}
    bool inside(vec3f pos, float fudge)
    {
        mat3f rot;

        //if(ctr == nullptr)
        {
            btTransform trans;

            rigid_body->getMotionState()->getWorldTransform(trans);

            btVector3 bpos = trans.getOrigin();
            btQuaternion bq = trans.getRotation();

            quaternion q = {{bq.x(), bq.y(), bq.z(), bq.w()}};

            rot = q.get_rotation_matrix();

            vec3f v = {bpos.x(), bpos.y(), bpos.z()};

            vec3f rel = pos - v;

            return within(b, rot.transp() * rel, fudge);
        }

        /*rot = ctr->rot_quat.get_rotation_matrix();

        vec3f my_pos = xyz_to_vec(ctr->pos);

        return within(b, rot.transp() * (pos - my_pos));*/
    }
Ejemplo n.º 4
0
 void updateBall()
 {
     if (_ptrBall)
         // TODO use _motionState ?
         _rigidBody.getMotionState()->getWorldTransform(
                 _ptrBall->_transform);
 }
Ejemplo n.º 5
0
	void glDraw() {
		if (!model) return;
		body1->getMotionState()->getWorldTransform(t);
		t.getOpenGLMatrix(m);		
		glPushMatrix();
		glMultMatrixf(m);
		model->glDraw();
		glPopMatrix();
	}
    quaternion get_quat()
    {
        btTransform newTrans;

        rigid_body->getMotionState()->getWorldTransform(newTrans);

        btQuaternion bq = newTrans.getRotation();

        return {{bq.x(), bq.y(), bq.z(), bq.w()}};
    }
    vec3f get_pos()
    {
        btTransform newTrans;

        rigid_body->getMotionState()->getWorldTransform(newTrans);

        btVector3 bq = newTrans.getOrigin();

        return {bq.x(), bq.y(), bq.z()};
    }
Ejemplo n.º 8
0
void triMeshApp::exitPhysics()
{
	//cleanup in the reverse order of creation/initialization
	
	if(m_convexRigidBody->getMotionState())
		delete m_convexRigidBody->getMotionState();
	m_dynamicsWorld->removeRigidBody(m_convexRigidBody);
	delete m_convexRigidBody;
	
	if(m_concaveRigidBody->getMotionState())
		delete m_concaveRigidBody->getMotionState();
	m_dynamicsWorld->removeRigidBody(m_concaveRigidBody);
	delete m_concaveRigidBody;
	
	if(m_hfRigidBody->getMotionState())
		delete m_hfRigidBody->getMotionState();
	m_dynamicsWorld->removeRigidBody(m_hfRigidBody);
	delete m_hfRigidBody;
	
	
	delete m_dynamicsWorld;
	
	delete m_solver;
	
	delete m_broadphase;
	
	delete m_dispatcher;
	
	delete m_collisionConfiguration;
}
    void set_trans(cl_float4 clpos, quaternion m)
    {
        mat3f mat_diff = base_diff.get_rotation_matrix();

        mat3f current_hand = m.get_rotation_matrix();
        mat3f my_rot = current_hand * mat_diff;

        quaternion n;
        n.load_from_matrix(my_rot);


        vec3f absolute_pos = {clpos.x, clpos.y, clpos.z};

        ///current hand does not take into account the rotation offset when grabbing
        ///ie we'll double rotate
        vec3f offset_rot = current_hand * offset;

        vec3f pos = absolute_pos + offset_rot;

        btTransform newTrans;

        //rigid_body->getMotionState()->getWorldTransform(newTrans);

        newTrans.setOrigin(btVector3(pos.v[0], pos.v[1], pos.v[2]));
        newTrans.setRotation(btQuaternion(n.x(), n.y(), n.z(), n.w()));

        rigid_body->getMotionState()->setWorldTransform(newTrans);
        //rigid_body->setInterpolationWorldTransform(newTrans);

        //if(ctr)
        //    ctr->set_pos(conv_implicit<cl_float4>(pos));

        slide_parent_init = true;
        slide_saved_parent = absolute_pos;

        remote_pos = pos;
        remote_rot = n;

        kinematic_old = kinematic_current;
        kinematic_current = xyzf_to_vec(rigid_body->getWorldTransform().getOrigin());
    }
Ejemplo n.º 10
0
        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {
            btScalar m[16];

            btDefaultMotionState* myMotionState = (btDefaultMotionState*) _body->getMotionState();
            myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m);

            osg::Matrixf mat(m);

            
            // to move our ShapeNode according to gravity, we do something like this?:
            
            osg::Matrixf diff = osg::Matrix::inverse(previousMatrix_) * mat;
            spin::ShapeNode *shp = dynamic_cast<spin::ShapeNode*>(node);
            /*
            if (shp)
            {
                //osg::Vec3 t = diff.getTrans() - osg::Vec3(2,0,0);
                //shp->translate(t.x(),t.y(),t.z());
                shp->setTranslation(mat.getTrans().x(),mat.getTrans().y(),mat.getTrans().z());
            }
            else
            {
                osg::PositionAttitudeTransform *pat = dynamic_cast<osg::PositionAttitudeTransform*>(node);
                if (pat)
                {
                    pat->setPosition(mat.getTrans());
                    pat->setAttitude(mat.getRotate());

                    //std::cout << mat.getTrans().x() << ", " << mat.getTrans().y() << ", " << mat.getTrans().z() << std::endl;
                }
            }
            */
            
            //_body->getMotionState()->setWorldTransform(trans);
            _body->setWorldTransform(trans);
            
            previousMatrix_ = mat;
            
            traverse(node, nv);
        }
    ///milliseconds
    void tick(float ftime, CommonRigidBodyBase* bullet_scene)
    {
        kinematic_source s;
        s.pos = &remote_pos;
        s.rot = &remote_rot;

        bullet_scene->setKinematicSource(rigid_body, s);

        //should_hand_collide = false;

        if(time_elapsed_since_release_ms >= time_needed_since_release_to_recollide_ms && should_hand_collide)
        {
            make_collide_hands(bullet_scene);
        }

        if(!should_hand_collide)
        {
            make_no_collide_hands(bullet_scene);
        }

        time_elapsed_since_release_ms += ftime;

        //printf("%f timeelapsed\n", time_elapsed_since_release_ms);

        if(frame_wait_restore > 0)
        {
            frame_wait_restore--;

            if(frame_wait_restore == 0)
            {
                vec3f avg = {0,0,0};

                int n = 0;

                //if(history.size() > 0)
                //    history.pop_back();
                /*if(history.size() > 0)
                    history.pop_back();*/

                for(auto& i : history)
                {
                    //if(n == history.size() / 2)
                    //    break;

                    avg += i;

                    n++;
                }

                if(n > 0)
                    avg = avg / n;

                //if(n > 0)
                //    rigid_body->setLinearVelocity({avg.v[0], avg.v[1], avg.v[2]});

                //rigid_body->setLinearVelocity(bullet_scene->getBodyAvgVelocity(rigid_body));
            }
        }

        ///so the avg velocity is wrong, because it updates out of 'phase' with this function
        if(is_kinematic && last_world_id != bullet_scene->info.internal_step_id)
        {
            //rigid_body->saveKinematicState(1/60.f);

            btVector3 vel = rigid_body->getLinearVelocity();
            btVector3 angular = rigid_body->getAngularVelocity();

            //vec3f pos = get_pos();

            //printf("pos %f %f %f\n", pos.v[0], pos.v[1], pos.v[2]);

            avg_vel = avg_vel + (vec3f){vel.x(), vel.y(), vel.z()};

            avg_vel = avg_vel / 2.f;

            history.push_back({vel.x(), vel.y(), vel.z()});

            if(history.size() > max_history)
                history.pop_front();

            //angular_stability_history
            //printf("vel %f %f %f\n", vel.x(), vel.y(), vel.z());
        }

        angular_stability_history.push_back(get_scaled_angular_stability());

        if(angular_stability_history.size() > max_stability_history)
            angular_stability_history.pop_front();

        /*if(!is_kinematic)
        {
            history.clear();
        }*/

        if(is_kinematic && slide_timer < slide_time_ms && slide_towards_parent)
        {
            offset = offset * 0.95f + ideal_offset * 0.05f;
        }

        if(self_owned)
        {
            btTransform trans;
            rigid_body->getMotionState()->getWorldTransform(trans);

            vec3f pos = xyzf_to_vec(trans.getOrigin());
            quaternion qrot = convert_from_bullet_quaternion(trans.getRotation());

            ctr->set_pos(conv_implicit<cl_float4>(pos));
            ctr->set_rot_quat(qrot);
        }

        slide_timer += ftime;

        last_ftime = ftime;
        last_world_id = bullet_scene->info.internal_step_id;
    }