Exemple #1
0
void testPointPlaneICP()
{
    Random rnd( 0 );
    Matrix4f dstToSrc = Matrix4f::translation( 0.1f, -0.42f, 0.2f ) * Matrix4f::rotateX( MathUtils::degreesToRadians( 10.f ) );
    //Matrix4f dstToSrc = Matrix4f::rotateX( MathUtils::degreesToRadians( 10.f ) );
    //Matrix4f dstToSrc = Matrix4f::rotateX( MathUtils::degreesToRadians( 20.f ) );

    Matrix4f srcToDstGT = dstToSrc.inverse();

    int nPoints = 1024;

    std::vector< Vector3f > srcPoints( nPoints );
    std::vector< Vector3f > dstPoints( nPoints );
    std::vector< Vector3f > dstNormals( nPoints );

    for( size_t i = 0; i < dstPoints.size(); ++i )
    {
        dstPoints[i] = Vector3f( rnd.nextFloat(), rnd.nextFloat(), rnd.nextFloat() );
        dstNormals[i] = Sampling::areaSampleSphere( rnd.nextFloat(), rnd.nextFloat() );

        srcPoints[i] = dstToSrc.transformPoint( dstPoints[i] );
    }

    PointPlaneICP icp( 6, 0.01f );

    Matrix4f initialGuess = Matrix4f::identity();
    Matrix4f mSolution;
    bool succeeded = icp.align( srcPoints, dstPoints, dstNormals, initialGuess, mSolution );

    Matrix4f diff = srcToDstGT.inverse() - mSolution;
    diff.print();
}
Exemple #2
0
  void AnimeshObject::Skin ()
  {
    if (!skeleton)
      return;

    CS_ASSERT (SkinV ?
	       skinnedVertices->GetElementCount () >= factory->vertexCount : true);
    CS_ASSERT (SkinN ?
	       skinnedNormals->GetElementCount () >= factory->vertexCount : true);
    CS_ASSERT (SkinTB ?
	       skinnedTangents->GetElementCount () >= factory->vertexCount
	       && skinnedBinormals->GetElementCount () >= factory->vertexCount
	       : true);

    // Setup some local data
    csVertexListWalker<float, csVector3> srcVerts (postMorphVertices);
    csRenderBufferLock<csVector3> dstVerts (skinnedVertices);
    csVertexListWalker<float, csVector3> srcNormals (factory->normalBuffer);
    csRenderBufferLock<csVector3> dstNormals (skinnedNormals);

    csVertexListWalker<float, csVector3> srcTangents (factory->tangentBuffer);
    csRenderBufferLock<csVector3> dstTangents (skinnedTangents);
    csVertexListWalker<float, csVector3> srcBinormals (factory->binormalBuffer);
    csRenderBufferLock<csVector3> dstBinormals (skinnedBinormals);

    csSkeletalState2* skeletonState = lastSkeletonState;

    csAnimatedMeshBoneInfluence* influence = factory->boneInfluences.GetArray ();

    for (size_t i = 0; i < factory->vertexCount; ++i)
    {
      // Accumulate data for the vertex
      int numInfluences = 0;

      csDualQuaternion dq (csQuaternion (0,0,0,0), csQuaternion (0,0,0,0)); 
      csQuaternion pivot;

      for (size_t j = 0; j < 4; ++j, ++influence) // @@SOLVE 4
      {
        if (influence->influenceWeight > 0.0f)
        {
          numInfluences++;

          csDualQuaternion inflQuat (
            skeletonState->GetQuaternion (influence->bone),
            skeletonState->GetVector (influence->bone));

          if (numInfluences == 1)
          {
            pivot = inflQuat.real;
          }
          else if (inflQuat.real.Dot (pivot) < 0.0f)
          {
            inflQuat *= -1.0f;
          }

          dq += inflQuat * influence->influenceWeight;
        }
      }   

      if (numInfluences == 0)
      {
        if (SkinV)
        {
          dstVerts[i] = *srcVerts;
        }

        if (SkinN)
        {
          dstNormals[i] = *srcNormals;
        }        

        if (SkinTB)
        {
          dstTangents[i] = *srcTangents;
          dstBinormals[i] = *srcBinormals;
        }        
      }
      else
      {
        dq = dq.Unit ();

        if (SkinV)
        {
          dstVerts[i] = dq.TransformPoint (*srcVerts);
        }

        if (SkinN)
        {
          dstNormals[i] = dq.Transform (*srcNormals);
        }

        if (SkinTB)
        {
          dstTangents[i] = dq.Transform (*srcTangents);
          dstBinormals[i] = dq.Transform (*srcBinormals);
        }       
      }

      ++srcVerts;
      ++srcNormals;
      ++srcTangents;
      ++srcBinormals;
    }
  }