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; }
/******************************************************************************************************** * Method to translate a single camera * ********************************************************************************************************/ MStatus OgreExporter::writeCamera(MFnCamera& camera) { MPlug plug; MPlugArray srcplugarray; double dist; MAngle angle; MFnTransform* cameraTransform = NULL; MFnAnimCurve* animCurve = NULL; // get camera transform for (int i=0; i<camera.parentCount(); i++) { if (camera.parent(i).hasFn(MFn::kTransform)) { cameraTransform = new MFnTransform(camera.parent(i)); continue; } } // start camera description m_params.outCameras << "camera " << cameraTransform->partialPathName().asChar() << "\n"; m_params.outCameras << "{\n"; //write camera type m_params.outCameras << "\ttype "; if (camera.isOrtho()) m_params.outCameras << "ortho\n"; else m_params.outCameras << "persp\n"; // write translation data m_params.outCameras << "\ttranslation\n"; m_params.outCameras << "\t{\n"; //translateX m_params.outCameras << "\t\tx "; plug = cameraTransform->findPlug("translateX"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i < srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to translateX attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(dist); m_params.outCameras << "= " << dist << "\n"; } //translateY m_params.outCameras << "\t\ty "; plug = cameraTransform->findPlug("translateY"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i< srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to translateY attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(dist); m_params.outCameras << "= " << dist << "\n"; } //translateZ m_params.outCameras << "\t\tz "; plug = cameraTransform->findPlug("translateZ"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i< srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to translateZ attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(dist); m_params.outCameras << "= " << dist << "\n"; } m_params.outCameras << "\t}\n"; // write rotation data m_params.outCameras << "\trotation\n"; m_params.outCameras << "\t{\n"; m_params.outCameras << "\t\tx "; //rotateX plug = cameraTransform->findPlug("rotateX"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i< srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to rotateX attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(angle); m_params.outCameras << "= " << angle.asDegrees() << "\n"; } //rotateY m_params.outCameras << "\t\ty "; plug = cameraTransform->findPlug("rotateY"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i< srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to rotateY attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(angle); m_params.outCameras << "= " << angle.asDegrees() << "\n"; } //rotateZ m_params.outCameras << "\t\tz "; plug = cameraTransform->findPlug("rotateZ"); if (plug.isConnected() && m_params.exportCamerasAnim) { plug.connectedTo(srcplugarray,true,false,&stat); for (int i=0; i< srcplugarray.length(); i++) { if (srcplugarray[i].node().hasFn(MFn::kAnimCurve)) { if (animCurve) delete animCurve; animCurve = new MFnAnimCurve(srcplugarray[i].node()); continue; } else if (i == srcplugarray.length()-1) { std::cout << "Invalid link to rotateZ attribute\n"; return MS::kFailure; } } m_params.outCameras << "anim " << animCurve->name().asChar() << "\n"; } else { plug.getValue(angle); m_params.outCameras << "= " << angle.asDegrees() << "\n"; } m_params.outCameras << "\t}\n"; // end camera description m_params.outCameras << "}\n\n"; if (cameraTransform != NULL) delete cameraTransform; if (animCurve != NULL) delete animCurve; return MS::kSuccess; }