// Get the animated parameters of a camera contained in the scene // and store them in the associated member variables contained in // the camera. void Scene::getCameraAnimatedParameters(KFbxNode* pNode, KTime time) { KFbxCamera* lCamera = (KFbxCamera*) pNode->GetNodeAttribute(); lCamera->Position.Set(getGlobalPosition(pNode, time).GetT()); KFbxAnimCurve* fc = lCamera->Roll.GetCurve<KFbxAnimCurve>(currentAnimationLayer); if (fc) lCamera->Roll.Set(fc->Evaluate(time)); if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL || lCamera->GetApertureMode() == KFbxCamera::eVERTICAL) { fc = lCamera->FieldOfView.GetCurve<KFbxAnimCurve>(currentAnimationLayer); if (fc) lCamera->FieldOfView.Set(fc->Evaluate(time)); } else if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL_AND_VERTICAL) { // In this aperture mode, the squeeze ratio is not relevant // because the fields of view in X and Y are independent. // It's value is set to retrieve the proper aspect in function SetCamera(). // // if: // // aspect = field of view X / field of view Y = aperture width * squeeze ratio / aperture height // // then: // // squeeze ratio = (field of view X * aperture height) / (field of view Y * aperture width) // double lFieldOfViewX = lCamera->FieldOfViewX.Get(); double lFieldOfViewY = lCamera->FieldOfViewY.Get(); fc = lCamera->FieldOfViewX.GetCurve<KFbxAnimCurve>(currentAnimationLayer); if (fc) lFieldOfViewX = fc->Evaluate(time); fc = lCamera->FieldOfViewY.GetCurve<KFbxAnimCurve>(currentAnimationLayer); if (fc) lFieldOfViewY = fc->Evaluate(time); double lSqueezeRatio = (lFieldOfViewX * lCamera->GetApertureHeight()) / (lFieldOfViewY * lCamera->GetApertureWidth()); lCamera->FieldOfViewX.Set(lFieldOfViewX); lCamera->FieldOfViewY.Set(lFieldOfViewY); lCamera->SetSqueezeRatio(lSqueezeRatio); } else if (lCamera->GetApertureMode() == KFbxCamera::eFOCAL_LENGTH) { double lFocalLength = lCamera->FocalLength.Get(); fc = lCamera->FocalLength.GetCurve<KFbxAnimCurve>(currentAnimationLayer); if (fc && fc ->Evaluate(time)) lCamera->FocalLength.Set(lFocalLength); } }
void readAnimation(KFbxNode* pNode, KFbxScene& fbxScene, const std::string& targetName, osg::ref_ptr<osgAnimation::AnimationManagerBase>& pAnimationManager, KFbxMesh* pMesh, int nBlendShape, int nBlendShapeChannel, int nShape) { for (int i = 0; i < fbxScene.GetSrcObjectCount(FBX_TYPE(KFbxAnimStack)); ++i) { KFbxAnimStack* pAnimStack = KFbxCast<KFbxAnimStack>(fbxScene.GetSrcObject(FBX_TYPE(KFbxAnimStack), i)); int nbAnimLayers = pAnimStack->GetMemberCount(FBX_TYPE(KFbxAnimLayer)); const char* pTakeName = pAnimStack->GetName(); if (!pTakeName || !*pTakeName) continue; for (int j = 0; j < nbAnimLayers; j++) { KFbxAnimLayer* pAnimLayer = pAnimStack->GetMember(FBX_TYPE(KFbxAnimLayer), j); KFbxAnimCurve* pCurve = pMesh->GetShapeChannel(nBlendShape, nBlendShapeChannel, pAnimLayer, false); if (!pCurve) { continue; } int nKeys = pCurve->KeyGetCount(); if (!nKeys) { continue; } osgAnimation::FloatLinearChannel* pChannel = new osgAnimation::FloatLinearChannel; std::vector<osgAnimation::TemplateKeyframe<float> >& keyFrameCntr = *pChannel->getOrCreateSampler()->getOrCreateKeyframeContainer(); for (int k = 0; k < nKeys; ++k) { KFbxAnimCurveKey key = pCurve->KeyGet(k); double fTime = key.GetTime().GetSecondDouble(); float fValue = static_cast<float>(key.GetValue() * 0.01); keyFrameCntr.push_back(osgAnimation::FloatKeyframe(fTime,fValue)); } pChannel->setTargetName(targetName); std::stringstream ss; ss << nShape; pChannel->setName(ss.str()); addChannel(pChannel, pAnimationManager, pTakeName); } } }
void readKeys(KFbxAnimCurve* curveX, KFbxAnimCurve* curveY, KFbxAnimCurve* curveZ, const fbxDouble3& defaultValue, std::vector<osgAnimation::TemplateKeyframe<osg::Vec3> >& keyFrameCntr, float scalar = 1.0f) { KFbxAnimCurve* curves[3] = {curveX, curveY, curveZ}; typedef std::set<double> TimeSet; typedef std::map<double, float> TimeFloatMap; TimeSet times; TimeFloatMap curveTimeMap[3]; for (int nCurve = 0; nCurve < 3; ++nCurve) { KFbxAnimCurve* pCurve = curves[nCurve]; int nKeys = pCurve ? pCurve->KeyGetCount() : 0; if (!nKeys) { times.insert(0.0); curveTimeMap[nCurve][0.0] = defaultValue[nCurve] * scalar; } for (int i = 0; i < nKeys; ++i) { KFbxAnimCurveKey key = pCurve->KeyGet(i); double fTime = key.GetTime().GetSecondDouble(); times.insert(fTime); curveTimeMap[nCurve][fTime] = static_cast<float>(key.GetValue()) * scalar; } } for (TimeSet::iterator it = times.begin(); it != times.end(); ++it) { double fTime = *it; osg::Vec3 val; for (int i = 0; i < 3; ++i) { if (curveTimeMap[i].empty()) continue; TimeFloatMap::iterator lb = curveTimeMap[i].lower_bound(fTime); if (lb == curveTimeMap[i].end()) --lb; val[i] = lb->second; } keyFrameCntr.push_back(osgAnimation::Vec3Keyframe(fTime, val)); } }
void GetCameraAnimatedParameters(KFbxNode* pNode, KTime& pTime) { KFbxCamera* lCamera = (KFbxCamera*) pNode->GetNodeAttribute(); lCamera->Position.Set(GetGlobalPosition(pNode, pTime).GetT()); KFbxAnimCurve* fc = lCamera->Roll.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); if (fc) lCamera->Roll.Set(fc->Evaluate(pTime)); if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL || lCamera->GetApertureMode() == KFbxCamera::eVERTICAL) { fc = lCamera->FieldOfView.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); if (fc) lCamera->FieldOfView.Set(fc->Evaluate(pTime)); } else if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL_AND_VERTICAL) { double lFieldOfViewX = lCamera->FieldOfViewX.Get(); double lFieldOfViewY = lCamera->FieldOfViewY.Get(); fc = lCamera->FieldOfViewX.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); if (fc) lFieldOfViewX = fc->Evaluate(pTime); fc = lCamera->FieldOfViewY.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); if (fc) lFieldOfViewY = fc->Evaluate(pTime); double lSqueezeRatio = (lFieldOfViewX * lCamera->GetApertureHeight()) / (lFieldOfViewY * lCamera->GetApertureWidth()); lCamera->FieldOfViewX.Set(lFieldOfViewX); lCamera->FieldOfViewY.Set(lFieldOfViewY); lCamera->SetSqueezeRatio(lSqueezeRatio); } else if (lCamera->GetApertureMode() == KFbxCamera::eFOCAL_LENGTH) { double lFocalLength = lCamera->FocalLength.Get(); fc = lCamera->FocalLength.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); if (fc && fc ->Evaluate(pTime)) lCamera->FocalLength.Set(lFocalLength); } }
// -- Cameras ---------------------------------------------------------------------------- KFbxCamera* Scene::getCurrentCamera(KTime time) { KFbxGlobalSettings& lGlobalSettings = fbxScene->GetGlobalSettings(); KFbxGlobalCameraSettings& lGlobalCameraSettings = fbxScene->GlobalCameraSettings(); KString lCurrentCameraName = lGlobalSettings.GetDefaultCamera(); // check if we need to create the Producer cameras! if (lGlobalCameraSettings.GetCameraProducerPerspective() == NULL && lGlobalCameraSettings.GetCameraProducerBottom() == NULL && lGlobalCameraSettings.GetCameraProducerTop() == NULL && lGlobalCameraSettings.GetCameraProducerFront() == NULL && lGlobalCameraSettings.GetCameraProducerBack() == NULL && lGlobalCameraSettings.GetCameraProducerRight() == NULL && lGlobalCameraSettings.GetCameraProducerLeft() == NULL) { lGlobalCameraSettings.CreateProducerCameras(); } if (lCurrentCameraName.Compare(PRODUCER_PERSPECTIVE) == 0) { return lGlobalCameraSettings.GetCameraProducerPerspective(); } else if (lCurrentCameraName.Compare(PRODUCER_BOTTOM) == 0) { return lGlobalCameraSettings.GetCameraProducerBottom(); } else if (lCurrentCameraName.Compare(PRODUCER_TOP) == 0) { return lGlobalCameraSettings.GetCameraProducerTop(); } else if (lCurrentCameraName.Compare(PRODUCER_FRONT) == 0) { return lGlobalCameraSettings.GetCameraProducerFront(); } else if (lCurrentCameraName.Compare(PRODUCER_BACK) == 0) { return lGlobalCameraSettings.GetCameraProducerBack(); } else if (lCurrentCameraName.Compare(PRODUCER_RIGHT) == 0) { return lGlobalCameraSettings.GetCameraProducerRight(); } else if (lCurrentCameraName.Compare(PRODUCER_LEFT) == 0) { return lGlobalCameraSettings.GetCameraProducerLeft(); } else if (lCurrentCameraName.Compare(CAMERA_SWITCHER) == 0) { KFbxCameraSwitcher* lCameraSwitcher = fbxScene->GlobalCameraSettings().GetCameraSwitcher(); KFbxAnimCurve* lCurve = NULL; if (lCameraSwitcher) { lCurve = lCameraSwitcher->CameraIndex.GetCurve<KFbxAnimCurve>(currentAnimationLayer); KFCurve* lFCurve = (lCurve)?lCurve->GetKFCurve():NULL; int lCameraIndex = 0; if (lFCurve) // Get the index of the camera in the camera array. lCameraIndex = (int) lFCurve->Evaluate(time) - 1; if (lCameraIndex >= 0 && lCameraIndex < cameras.GetCount()) { KFbxNode* lNode = cameras[lCameraIndex]; // Get the animated parameters of the camera. getCameraAnimatedParameters(lNode, time); return (KFbxCamera*) lNode->GetNodeAttribute(); } } } else { int i; KFbxNode* lNode = NULL; // Find the camera in the camera array. for (i = 0; i < cameras.GetCount(); i++) { if (lCurrentCameraName.Compare(cameras[i]->GetName()) == 0) { lNode = cameras[i]; break; } } if (lNode) { // Get the animated parameters of the camera. getCameraAnimatedParameters(lNode, time); return (KFbxCamera*) lNode->GetNodeAttribute(); } } return lGlobalCameraSettings.GetCameraProducerPerspective(); }
KFbxCamera* GetCurrentCamera(KFbxScene* pScene, KTime& pTime, KArrayTemplate<KFbxNode*>& pCameraArray) { KFbxGlobalSettings& lGlobalSettings = pScene->GetGlobalSettings(); KFbxGlobalCameraSettings& lGlobalCameraSettings = pScene->GlobalCameraSettings(); KString lCurrentCameraName = lGlobalSettings.GetDefaultCamera(); if (lGlobalCameraSettings.GetCameraProducerPerspective() == NULL && lGlobalCameraSettings.GetCameraProducerBottom() == NULL && lGlobalCameraSettings.GetCameraProducerTop() == NULL && lGlobalCameraSettings.GetCameraProducerFront() == NULL && lGlobalCameraSettings.GetCameraProducerBack() == NULL && lGlobalCameraSettings.GetCameraProducerRight() == NULL && lGlobalCameraSettings.GetCameraProducerLeft() == NULL) { lGlobalCameraSettings.CreateProducerCameras(); } if (lCurrentCameraName.Compare(PRODUCER_PERSPECTIVE) == 0) { return lGlobalCameraSettings.GetCameraProducerPerspective(); } else if (lCurrentCameraName.Compare(PRODUCER_BOTTOM) == 0) { return lGlobalCameraSettings.GetCameraProducerBottom(); } else if (lCurrentCameraName.Compare(PRODUCER_TOP) == 0) { return lGlobalCameraSettings.GetCameraProducerTop(); } else if (lCurrentCameraName.Compare(PRODUCER_FRONT) == 0) { return lGlobalCameraSettings.GetCameraProducerFront(); } else if (lCurrentCameraName.Compare(PRODUCER_BACK) == 0) { return lGlobalCameraSettings.GetCameraProducerBack(); } else if (lCurrentCameraName.Compare(PRODUCER_RIGHT) == 0) { return lGlobalCameraSettings.GetCameraProducerRight(); } else if (lCurrentCameraName.Compare(PRODUCER_LEFT) == 0) { return lGlobalCameraSettings.GetCameraProducerLeft(); } else if (lCurrentCameraName.Compare(CAMERA_SWITCHER) == 0) { KFbxCameraSwitcher* lCameraSwitcher = pScene->GlobalCameraSettings().GetCameraSwitcher(); KFbxAnimCurve* lCurve = NULL; if (lCameraSwitcher) { lCurve = lCameraSwitcher->CameraIndex.GetCurve<KFbxAnimCurve>(gCurrentAnimationLayer); KFCurve* lFCurve = (lCurve)?lCurve->GetKFCurve():NULL; int lCameraIndex = 0; if (lFCurve) lCameraIndex = (int) lFCurve->Evaluate(pTime) - 1; if (lCameraIndex >= 0 && lCameraIndex < pCameraArray.GetCount()) { KFbxNode* lNode = pCameraArray[lCameraIndex]; GetCameraAnimatedParameters(lNode, pTime); return (KFbxCamera*) lNode->GetNodeAttribute(); } } } else { int i; KFbxNode* lNode = NULL; for (i = 0; i < pCameraArray.GetCount(); i++) { if (lCurrentCameraName.Compare(pCameraArray[i]->GetName()) == 0) { lNode = pCameraArray[i]; break; } } if (lNode) { GetCameraAnimatedParameters(lNode, pTime); return (KFbxCamera*) lNode->GetNodeAttribute(); } } return lGlobalCameraSettings.GetCameraProducerPerspective(); }