Ejemplo n.º 1
0
Matrix<double,7,1> Sim3
::log(const Sim3& sim3)
{
  Vector7d res;
  double scale = sim3.scale();

  Vector3d t = sim3.translation_;

  double theta;

  Vector4d omega_sigma = ScSO3::logAndTheta(sim3.scso3_, &theta);
  Vector3d omega = omega_sigma.head<3>();
  double sigma = omega_sigma[3];
  Matrix3d Omega = SO3::hat(omega);

  Matrix3d W = calcW(theta, sigma, scale, Omega);

  //Vector3d upsilon = W.jacobiSvd(ComputeFullU | ComputeFullV).solve(t);
  Vector3d upsilon = W.partialPivLu().solve(t);

  res.segment(0,3) = upsilon;
  res.segment(3,3) = omega;
  res[6] = sigma;
  return res;
}
Ejemplo n.º 2
0
Sim3 Sim3
::exp(const Matrix<double,7,1>& vect)
{
  Vector3d upsilon = vect.segment(0,3);
  Vector3d omega = vect.segment(3,3);
  double sigma = vect[6];

  double theta;
  ScSO3 scso3 = ScSO3::expAndTheta(vect.tail<4>(), &theta);

  Matrix3d Omega = SO3::hat(omega);
  Matrix3d W = calcW(theta, sigma, scso3.scale(), Omega);
  Vector3d t = W*upsilon;
  return Sim3(scso3, t);
}
Ejemplo n.º 3
0
void CalcKinCharacteristics::run()
{
	showParams();

	core::Code code;
	core::InternalGearRatios k;
	core::GearSetTypes	types;
	core::FakeItem	fake;
	std::vector<core::IIOItem*> containers;
	containers.push_back( &code );
	containers.push_back( &k );
	containers.push_back( &types );
	containers.push_back( &fake );

	while ( core::Singletons::getInstance()->getLoaderFromFile()->load( containers, core::IOFileManager::eOutputFileType::KIN_SLOW ) )
	{
		Characteristics ch;
		ch._tooth = calcZ(k, types);
		ch._torque = calcM( code, k );
		ch._angVelocity = calcW( code, k, ch._tooth );
		ch._power = calcN( ch._angVelocity, ch._torque );
		ch._kpdZacStepen = calcKpdZacStepen( k, ch._angVelocity, ch._power );
		ch._kpdTorque = calcMh( code, k, ch._kpdZacStepen );
		ch._qualityCriterias = calcQualityCriterias( ch._kpdTorque, ch._angVelocity );

		printCharacteristics( code, ch );

		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, code );

		NS_CORE GearBoxWithChanger gb( code );
		gb.createChainsForAllgears();
		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, gb );

		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, types );
		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, fake );
		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, k );
		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile( NS_CORE IOFileManager::eOutputFileType::RESULT, ch );
		NS_CORE Singletons::getInstance()->getIOFileManager()->writeToFile(NS_CORE IOFileManager::eOutputFileType::RESULT, NS_CORE IOFileManager::end);

		m_characteristics.push_back( ch );
	}
}
Ejemplo n.º 4
0
void MD5Anim::load(char *filename) 
{
	FILE *f;
	char data[512];
	f=fopen(filename,"rb");
	int frameind;
	float *frameData;

	while(!feof(f))
	{
		fgets(data,sizeof(data),f);

		if (sscanf(data," numFrames %d", &numFrames) == 1)
		{
			if (numFrames > 0)
			{
				bboxes=new Bounds[numFrames];
				frameJoints=new Joint*[numFrames];
			}

		}
		else if(sscanf(data," numJoints %d", &numJoints) == 1)
		{
			for(int i=0; i < numFrames; i++) 
			{
				frameJoints[i] = new Joint[numJoints];
			}

			jointInfos=new Hierarchy[numJoints];
			baseFrames=new BaseFrame[numJoints];
		}

		else if (sscanf(data," frameRate %d", &frameRate) == 1)
		{

		}
		else if (sscanf(data," numAnimatedComponents %d", &numAnimComp) == 1)
		{
			if (numAnimComp > 0)
				frameData=new float[numAnimComp];
		}
		else if (strncmp(data,"hierarchy {", 11) == 0)
		{
			for (int i=0; i < numJoints; i++) 
			{
				fgets(data, sizeof(data),f);

				sscanf(data, " %s %d %d %d", jointInfos[i].name,&jointInfos[i].parent, &jointInfos[i].flags,
										&jointInfos[i].startIndex);
			}

		}
		else if (strncmp(data,"bounds {", 8) == 0)
		{
			for (int i=0; i < numFrames; i++)
			{
				fgets(data,sizeof(data),f);
				sscanf(data," ( %f %f %f ) ( %f %f %f )", &bboxes[i].min.x, &bboxes[i].min.y, &bboxes[i].min.z, 
													&bboxes[i].max.x, &bboxes[i].max.y, &bboxes[i].max.z);
			}

		}
		else if (strncmp(data, "baseframe {", 11) == 0)
		{
			for (int i=0; i < numJoints; i++ )
			{
				fgets(data,sizeof(data),f);
				if (sscanf(data," ( %f %f %f ) ( %f %f %f )", &baseFrames[i].translation.x, &baseFrames[i].translation.y, 
														&baseFrames[i].translation.z,&baseFrames[i].rotation.x, 
														&baseFrames[i].rotation.y, &baseFrames[i].rotation.z) == 6)
				{
					calcW(&baseFrames[i].rotation);
				}
			}
		}
		else if (sscanf( data, " frame %d", &frameind) == 1)
		{
			for (int i=0; i < numAnimComp; i++)
				fscanf(f, "%f", &frameData[i]);

			createFrameSkeleton(frameData,frameJoints[frameind]);
			//build skeleton
		}
	}
	fclose(f);

	delete[] frameData;

}
Ejemplo n.º 5
0
void MD5Anim::createFrameSkeleton(float *frameData,  Joint *skelFrame)
{

	for (int i=0; i < numJoints; i++)
	{
		Vector3 animPos;
		Quaternion animRot;

		int k=0;

		animPos=baseFrames[i].translation;
		animRot=baseFrames[i].rotation;

		if (jointInfos[i].flags & 1) 
		{
			animPos.x=frameData[jointInfos[i].startIndex + k];
			k++;
		}
		if (jointInfos[i].flags & 2) 
		{
			animPos.y=frameData[jointInfos[i].startIndex + k];
			k++;
		}
		if (jointInfos[i].flags & 4) 
		{
			animPos.z=frameData[jointInfos[i].startIndex + k];
			k++;
		}
		if (jointInfos[i].flags & 8) 
		{
			animRot.x=frameData[jointInfos[i].startIndex + k];
			k++;
		}
		if (jointInfos[i].flags & 16) 
		{
			animRot.y=frameData[jointInfos[i].startIndex + k];
			k++;
		}
		if (jointInfos[i].flags & 32) 
		{
			animRot.z=frameData[jointInfos[i].startIndex + k];
			k++;
		}

		calcW(&animRot);

		Joint *curJoint=&skelFrame[i];
		curJoint->parent=jointInfos[i].parent;

		if (curJoint->parent < 0) 
		{
			curJoint->translation=animPos;
			curJoint->rotation=animRot;
		}
		else
		{
			Joint *parentJoint=&skelFrame[curJoint->parent];
			Vector3 rotated=parentJoint->rotation.multiply3d(curJoint->translation);
			curJoint->translation=parentJoint->translation + rotated;
			curJoint->rotation=parentJoint->rotation*curJoint->rotation;

			curJoint->rotation.normalize();
		}



	}

}