Exemplo n.º 1
0
// 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);
    }
}
Exemplo n.º 2
0
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));
    }
}
Exemplo n.º 4
0
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);
	}
}
Exemplo n.º 5
0
// -- 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();
}
Exemplo n.º 6
0
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();
}