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; } } }
// Set the view to the current camera settings. void SetCamera(KFbxScene* pScene, KTime& pTime, KFbxAnimLayer* pAnimLayer, KArrayTemplate<KFbxNode*>& pCameraArray) { KFbxCamera* lCamera = GetCurrentCamera(pScene, pTime, pCameraArray); KFbxNode* lCameraNode = lCamera ? lCamera->GetNode() : NULL; KFbxVector4 lEye(0,0,1); KFbxVector4 lCenter(0,0,0); KFbxVector4 lUp(0,1,0); KFbxVector4 lForward, lRight; if (lCamera) { lEye = lCamera->Position.Get(); lUp = lCamera->UpVector.Get(); } if (lCameraNode && lCameraNode->GetTarget()) { lCenter = GetGlobalPosition(lCameraNode->GetTarget(), pTime).GetT(); } else { if (!lCameraNode || IsProducerCamera(pScene, lCamera)) { if (lCamera) lCenter = lCamera->InterestPosition.Get(); } else { KFbxXMatrix lGlobalRotation; KFbxVector4 lRotationVector(GetGlobalPosition(lCameraNode, pTime).GetR()); lGlobalRotation.SetR(lRotationVector); KFbxVector4 lInterestPosition(lCamera->InterestPosition.Get()); KFbxVector4 lCameraGlobalPosition(GetGlobalPosition(lCameraNode, pTime).GetT()); double lLength = (KFbxVector4(lInterestPosition - lCameraGlobalPosition).Length()); lRotationVector = KFbxVector4(1.0,0,0); lCenter = lGlobalRotation.MultT(lRotationVector); lCenter *= lLength; lCenter += lEye; lRotationVector = KFbxVector4(0,1.0,0); lUp = lGlobalRotation.MultT(lRotationVector); } } lForward = lCenter - lEye; lForward.Normalize(); lRight = lForward.CrossProduct(lUp); lRight.Normalize(); lUp = lRight.CrossProduct(lForward); lUp.Normalize(); double lRadians = 0; if (lCamera) lRadians = 3.1416 * lCamera->Roll.Get() / 180.0; lUp *= cos(lRadians); lRight *= sin(lRadians); lUp = lUp + lRight; double lNearPlane = 0.01; if (lCamera) lNearPlane = lCamera->GetNearPlane(); double lFarPlane = 1000.0; if (lCamera) lFarPlane = lCamera->GetFarPlane(); if (lCamera && lCamera->ProjectionType.Get() == KFbxCamera::ePERSPECTIVE) { double lFieldOfViewY=0.0; double lAspect = lCamera->GetApertureWidth() * lCamera->GetSqueezeRatio() / lCamera->GetApertureHeight(); if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL || lCamera->GetApertureMode() == KFbxCamera::eVERTICAL) { lFieldOfViewY = lCamera->FieldOfView.Get(); if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL) lFieldOfViewY /= lAspect; } else if (lCamera->GetApertureMode() == KFbxCamera::eFOCAL_LENGTH) { lFieldOfViewY = lCamera->ComputeFieldOfView(lCamera->FocalLength.Get()); lFieldOfViewY /= lAspect; } else if (lCamera->GetApertureMode() == KFbxCamera::eHORIZONTAL_AND_VERTICAL) { lFieldOfViewY = lCamera->FieldOfViewY.Get(); } GlSetCameraPerspective(lFieldOfViewY, lAspect, lNearPlane, lFarPlane, lEye, lCenter, lUp); } else { double lPixelRatio = 1.0; if (lCamera) lPixelRatio = lCamera->GetPixelRatio(); int lWidth, lHeight; double lLeftPlane, lRightPlane, lBottomPlane, lTopPlane; GlGetWindowSize(lWidth, lHeight); if(lWidth < lHeight) { lLeftPlane = -gsOrthoCameraScale * lPixelRatio; lRightPlane = gsOrthoCameraScale * lPixelRatio; lBottomPlane = -gsOrthoCameraScale * lHeight / lWidth; lTopPlane = gsOrthoCameraScale * lHeight / lWidth; } else { lWidth *= (int) lPixelRatio; lLeftPlane = -gsOrthoCameraScale * lWidth / lHeight; lRightPlane = gsOrthoCameraScale * lWidth / lHeight; lBottomPlane = -gsOrthoCameraScale; lTopPlane = gsOrthoCameraScale; } GlSetCameraOrthogonal(lLeftPlane, lRightPlane, lBottomPlane, lTopPlane, lNearPlane, lFarPlane, lEye, lCenter, lUp); } }