Esempio n. 1
0
void CameraZoomOut(KFbxScene* pScene, int dY)
{
	KFbxCamera* lCamera = GetCurrentCamera(pScene);

	if (lCamera)
	{
		if (lCamera->ProjectionType.Get() == KFbxCamera::ePERSPECTIVE)
		{
			double lOriginalAperture = sqrt(lCamera->GetApertureWidth());
			double lApertureTransform = lOriginalAperture+dY/400.0;

			if (lApertureTransform <0.25) 
			{
				lApertureTransform =0.25;
			}

			if (lApertureTransform*lApertureTransform >179) 
			{
				lApertureTransform = sqrt(179.0);
			}

			double lApertureH = lApertureTransform/lOriginalAperture*sqrt(lCamera->GetApertureHeight());

			double lApertureWidthOrig = lCamera->GetApertureWidth();
			double lApertureHeightOrig = lCamera->GetApertureHeight();

			if (lCamera->GetApertureMode() == KFbxCamera::eFOCAL_LENGTH) {
				double lFLOrig  = lCamera->FocalLength.Get();
				double lFOVOrig = lCamera->ComputeFieldOfView(lFLOrig); // recompute to be sure.
				lCamera->SetApertureWidth(lApertureTransform * lApertureTransform);
				lCamera->SetApertureHeight(lApertureH * lApertureH);
				double lFLNew  = lCamera->ComputeFocalLength(lFOVOrig);
				double lFOVNew = lCamera->ComputeFieldOfView(lFLNew);
				lCamera->FocalLength.Set(lFLNew);
				lCamera->FieldOfView.Set(lFOVNew);
			} else if (lCamera->GetApertureMode() == KFbxCamera::eVERTICAL
					|| lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL) {
				double lFOVOrig = lCamera->FieldOfView.Get();
				double lFLOrig = lCamera->ComputeFocalLength(lFOVOrig); // recompute to be sure.
				lCamera->SetApertureWidth(lApertureTransform * lApertureTransform);
				lCamera->SetApertureHeight(lApertureH * lApertureH);
				double lFOVNew = lCamera->ComputeFieldOfView(lFLOrig);
				double lFLNew = lCamera->ComputeFocalLength(lFOVNew);
				lCamera->FieldOfView.Set(lFOVNew);
				lCamera->FocalLength.Set(lFLNew);
			} else if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL_AND_VERTICAL) {
				double lFOVOrig = lCamera->FieldOfViewY.Get();
				double lFLOrig = lCamera->ComputeFocalLength(lFOVOrig); // recompute to be sure.
				lCamera->SetApertureWidth(lApertureTransform * lApertureTransform);
				lCamera->SetApertureHeight(lApertureH * lApertureH);
				double lFOVNew = lCamera->ComputeFieldOfView(lFLOrig);
				double lFLNew = lCamera->ComputeFocalLength(lFOVNew);
				lCamera->FieldOfViewY.Set(lFOVNew);
				lCamera->FocalLength.Set(lFLNew);
			}
			lCamera->SetApertureWidth(lApertureWidthOrig);
			lCamera->SetApertureHeight(lApertureHeightOrig);
		}
		else
		{
			gsOrthoCameraScale *= 1.25;
		}
	}
}