コード例 #1
0
ファイル: SmrCCDSolver.cpp プロジェクト: CalebVDW/smr-motion
void SmrCCDSolver::computeErrorVect(void)
{

  if ( m_jointProcessed == m_IKChainPtr->getNumJoints() ) m_jointProcessed = 0;

  SmrKinematicJoint *currentJoint = m_IKChainPtr->getJoint(m_jointProcessed);

  //change this according to constraints.
  // Build target vector
  ColumnVector targetVector(3);
  ColumnVector currentVector(3);


  m_IKChainPtr->setMode( ABSOLUTEMODE );

  SmrIKConstraint* currentConstraint = getConstraintPtr(0);
  //get the related joint for every constraint
  SmrJoint* relatedJoint = currentConstraint->getRelatedJointPtr();
  SmrQuaternion relatedOrient = relatedJoint->getOrient();
  SmrVector3 currentOffset = currentConstraint->getOffset();
  //apply the local offsets defined in the constraint
  relatedOrient.rotate(currentOffset);
  // update error vector
  currentVector(1) = (relatedJoint->getPos()+currentOffset).X();
  currentVector(2) = (relatedJoint->getPos()+currentOffset).Y();
  currentVector(3) = (relatedJoint->getPos()+currentOffset).Z();

  targetVector(1) = (currentConstraint->getPosition()).X();
  targetVector(2) = (currentConstraint->getPosition()).Y();
  targetVector(3) = (currentConstraint->getPosition()).Z();
  //cout << currentOffset << endl;

  m_IKChainPtr->setMode( RELATIVEMODE );
  //cout << m_error << endl;// << currentVector << endl << targetVector << endl;
  currentVector-=targetVector;
  m_error=currentVector;
  //cout << m_IKChainPtr->getName() << " errorCalculated" << endl;
}
コード例 #2
0
    OrthogonalProjections::OrthogonalProjections(const Matrix& originalVectors,
                                                 Real multiplierCutoff,
                                                 Real tolerance)
    : originalVectors_(originalVectors),
      multiplierCutoff_(multiplierCutoff),
      numberVectors_(originalVectors.rows()),
      dimension_(originalVectors.columns()),
      validVectors_(true,originalVectors.rows()), // opposite way round from vector constructor
      orthoNormalizedVectors_(originalVectors.rows(),
                              originalVectors.columns())
    {
        std::vector<Real> currentVector(dimension_);
        for (Size j=0; j < numberVectors_; ++j)
        {

            if (validVectors_[j])
            {
                for (Size k=0; k< numberVectors_; ++k) // create an orthormal basis not containing j
                {
                    for (Size m=0; m < dimension_; ++m)
                        orthoNormalizedVectors_[k][m] = originalVectors_[k][m];

                    if ( k !=j && validVectors_[k])
                    {


                        for (Size l=0; l < k; ++l)
                        {
                            if (validVectors_[l] && l !=j)
                            {
                                Real dotProduct = innerProduct(orthoNormalizedVectors_, k, orthoNormalizedVectors_,l);
                                for (Size n=0; n < dimension_; ++n)
                                    orthoNormalizedVectors_[k][n] -=  dotProduct*orthoNormalizedVectors_[l][n];
                            }

                        }

                        Real normBeforeScaling= norm(orthoNormalizedVectors_,k);

                        if (normBeforeScaling < tolerance)
                        {
                            validVectors_[k] = false;
                        }
                        else
                        {
                            Real normBeforeScalingRecip = 1.0/normBeforeScaling;
                            for (Size m=0; m < dimension_; ++m)
                                orthoNormalizedVectors_[k][m] *= normBeforeScalingRecip;

                        } // end of else (norm < tolerance)

                    } // end of if k !=j && validVectors_[k])

                }// end of  for (Size k=0; k< numberVectors_; ++k)

                // we now have an o.n. basis for everything except  j

                Real prevNormSquared = normSquared(originalVectors_, j);


                for (Size r=0; r < numberVectors_; ++r)
                    if (validVectors_[r] && r != j)
                    {
                        Real dotProduct = innerProduct(orthoNormalizedVectors_, j, orthoNormalizedVectors_,r);

                        for (Size s=0; s < dimension_; ++s)
                           orthoNormalizedVectors_[j][s] -= dotProduct*orthoNormalizedVectors_[r][s];

                    }

               Real projectionOnOriginalDirection = innerProduct(originalVectors_,j,orthoNormalizedVectors_,j);
               Real sizeMultiplier = prevNormSquared/projectionOnOriginalDirection;

               if (std::fabs(sizeMultiplier) < multiplierCutoff_)
               {
                    for (Size t=0; t < dimension_; ++t)
                        currentVector[t] = orthoNormalizedVectors_[j][t]*sizeMultiplier;

               }
               else
                   validVectors_[j] = false;


            } // end of  if (validVectors_[j])

            projectedVectors_.push_back(currentVector);


        } //end of j loop

        numberValidVectors_ =0;
        for (Size i=0; i < numberVectors_; ++i)
            numberValidVectors_ +=  validVectors_[i] ? 1 : 0;


    } // end of constructor