Exemplo n.º 1
0
MStatus CXRayCameraExport::ExportCamera(const MFileObject& file)
{
	MDagPath            node; 
    MObject             component; 
    MSelectionList      list; 
    MFnDagNode          nodeFn; 
	MFnCamera			C;
	MStatus		st ;
    
	MGlobal::getActiveSelectionList( list ); 
    for ( u32 index = 0; index < list.length(); ++index ) 
    { 
        list.getDagPath			( index, node, component ); 
        nodeFn.setObject		( node ); 
		st = C.setObject		(node);
		if(st!=MStatus::kSuccess)
		{
			Msg		("Selected object is not a camera");
			return	MStatus::kInvalidParameter;
		}

    } 

	Msg("exporting camera named [%s]",	C.name().asChar());

	MTime				tmTemp,tmTemp2;
	MTime				tmQuant;

	// Remember the frame the scene was at so we can restore it later.
	MTime storedFrame	= MAnimControl::currentTime();
	MTime startFrame	= MAnimControl::minTime();
	MTime endFrame		= MAnimControl::maxTime();

	tmTemp.setUnit		(MTime::uiUnit());
	tmTemp2.setUnit		(MTime::uiUnit());
	tmQuant.setUnit		(MTime::uiUnit());
	tmQuant				= 10.0; //3 time in sec. temporary
	
	COMotion			M;
	M.SetParam			(0, (int)(endFrame-startFrame).as(MTime::uiUnit()), 30);
	
	Fvector				P,R;
	tmTemp				= startFrame;

	MObject cam_parent	= C.parent(0);
	MFnTransform		parentTransform(cam_parent);
	

	MDistance			dist;
	while(tmTemp <= endFrame)
	{
		MAnimControl::setCurrentTime( tmTemp );

		MMatrix parentMatrix	=	parentTransform.transformation().asMatrix();
		MMatrix					cv;
		cv.setToIdentity		();
		cv[2][2]				= -1.0;
		MMatrix					TM;
		TM						=  (cv*parentMatrix)*cv;
		TM						= cv*TM;
		parentMatrix			= TM;

		Msg				("frame[%d]",(int)tmTemp.as(MTime::uiUnit()));
		
		dist.setValue	(parentMatrix[3][0]);
		P.x				= (float)dist.asMeters();
		dist.setValue	(parentMatrix[3][1]);
		P.y				= (float)dist.asMeters();
		dist.setValue	(parentMatrix[3][2]);
		P.z				= (float)dist.asMeters();

		Msg				("P %3.3f,%3.3f,%3.3f",P.x,P.y,P.z);

		double			rot[3];
		MTransformationMatrix::RotationOrder rot_order = MTransformationMatrix::kXYZ;

		st 				= parentTransform.getRotation( rot, rot_order );
                             
		R.x				= -(float)rot[0];
		R.y				= -(float)rot[1];
		R.z				= -(float)rot[2];
//.		Msg				("rt %3.3f,%3.3f,%3.3f kWorld",R.x,R.y,R.z);

		tmTemp2			= tmTemp-startFrame;
		M.CreateKey		(float(tmTemp2.as(MTime::uiUnit()))/30.0f,P,R);

		if(tmTemp==endFrame)
			break;

		tmTemp			+= tmQuant;

		if(tmTemp>endFrame)
			tmTemp=endFrame;
	};


	MString 			fn_save_to = file.fullName();
	fn_save_to			+= ".anm";

	Msg("file full name [%s]", fn_save_to);
	M.SaveMotion		(fn_save_to.asChar());

	MAnimControl::setCurrentTime( storedFrame );

	return MS::kSuccess;
}