void
CGrassSticks::simulationTickCallback(btDynamicsWorld *dynamicsWorld, btScalar timeStep)
{
    //if (mField)
    {       
        const btSoftBodyArray& softBodyArray = static_cast<btSoftRigidDynamicsWorld*>(dynamicsWorld)->getSoftBodyArray();
        int numSoftBodys = softBodyArray.size();

        btVector3 rot0(0,0,0);
        for (int i=0;i<numSoftBodys;++i)
        { 
            btSoftBody* psb = softBodyArray[i];
            int linksize = psb->m_links.size();
            
            rot0.setZero();
            for(int k=0;k<linksize;++k)
            {
	            const btSoftBody::Link&	l=psb->m_links[k];
	            rot0 += l.m_n[1]->m_x-l.m_n[0]->m_x;				            
            }
            
            const btVector3& pos0 = psb->m_nodes[0].m_x;
            Ogre::Vector4 offset(-rot0.getX(), -rot0.getY()/2.0f, -rot0.getZ(), 0);				
            Ogre::Vector4 pos(pos0.getX(), pos0.getY(), pos0.getZ(), 0);
            Ogre::Renderable* rend = static_cast<Ogre::Renderable*>(psb->getUserPointer());
            if (rend)
            {                
                rend->setCustomParameter(999, offset);
            }
        }    
    } // End if
}
Ejemplo n.º 2
0
void
RankTwoTensorTest::rotateTest()
{
  Real sqrt2 = 0.707106781187;
  RealTensorValue rtv0(sqrt2, -sqrt2, 0, sqrt2, sqrt2, 0, 0, 0, 1); // rotation about "0" axis
  RealTensorValue rtv1(sqrt2, 0, -sqrt2, 0, 1, 0, sqrt2, 0, sqrt2); // rotation about "1" axis
  RealTensorValue rtv2(1, 0, 0, 0, sqrt2, -sqrt2, 0, sqrt2, sqrt2); // rotation about "2" axis

  RankTwoTensor rot0(rtv0);
  RankTwoTensor rot0T = rot0.transpose();
  RankTwoTensor rot1(rtv1);
  RankTwoTensor rot1T = rot1.transpose();
  RankTwoTensor rot2(rtv2);
  RankTwoTensor rot2T = rot2.transpose();
  RankTwoTensor rot = rot0*rot1*rot2;

  RankTwoTensor answer;
  RankTwoTensor m3;

  // the following "answer"s come from mathematica of course!

  // rotate about "0" axis with RealTensorValue, then back again with RankTwoTensor
  m3 = _m3;
  answer = RankTwoTensor(-4, 3, 6.363961, 3, 0, -2.1213403, 6.363961, -2.1213403, 9);
  m3.rotate(rtv0);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - answer).L2norm(), 0.0001);
  m3.rotate(rot0T);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - _m3).L2norm(), 0.0001);

  // rotate about "1" axis with RealTensorValue, then back again with RankTwoTensor
  m3 = _m3;
  answer = RankTwoTensor(2, 5.656854, -4, 5.656854, -5, -2.828427, -4, -2.828427, 8);
  m3.rotate(rtv1);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - answer).L2norm(), 0.0001);
  m3.rotate(rot1T);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - _m3).L2norm(), 0.0001);

  // rotate about "2" axis with RealTensorValue, then back again with RankTwoTensor
  m3 = _m3;
  answer = RankTwoTensor(1, -sqrt2, 3.5355339, -sqrt2, 8, -7, 3.5355339, -7, -4);
  m3.rotate(rtv2);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - answer).L2norm(), 0.0001);
  m3.rotate(rot2T);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - _m3).L2norm(), 0.0001);

  // rotate with "rot"
  m3 = _m3;
  answer = RankTwoTensor(-2.9675144, -6.51776695, 5.6213203, -6.51776695, 5.9319805, -2.0857864, 5.6213203, -2.0857864, 2.0355339);
  m3.rotate(rot);
  CPPUNIT_ASSERT_DOUBLES_EQUAL(0, (m3 - answer).L2norm(), 0.0001);
}