Пример #1
0
void CameraOrbit(KFbxScene* pScene, KFbxVector4 lOrigCamPos, double OrigRoll, int dX, int dY)
{
	KFbxCamera* lCamera = GetCurrentCamera(pScene);
	if (!lCamera) return;
	KFbxGlobalCameraSettings& lGlobalCameraSettings = pScene->GlobalCameraSettings();
	if (lCamera != lGlobalCameraSettings.GetCameraProducerPerspective()) return;
	if (lCamera->LockMode.Get()) return;
	if (dX == 0 && dY == 0) return;

	KFbxVector4 lRotationVector, lNewPosition, lCurPosition;
	KFbxXMatrix lRotation;
	KFbxVector4 lCenter = lCamera->InterestPosition.Get();

	KFbxVector4 lPosition = lCamera->Position.Get();
	lCurPosition = lPosition-lCenter;

	lNewPosition = lOrigCamPos-lCenter;

	int rotX;
	if (lNewPosition[2] == 0) {
		rotX = 90;
	} else {
		rotX = (int) (180.0* atan((double)lNewPosition[0]/(double)lNewPosition[2]) / 3.14159);
	}
	bool bRoll = (((int)OrigRoll % 360) != 0);
	if (   (lNewPosition[2] < 0 && !bRoll)
			|| (lNewPosition[2] > 0 && bRoll) ) {
		dY = -dY;
	}
	if (bRoll) dX = -dX;

	lRotationVector[1] = -rotX;
	lRotation.SetR(lRotationVector);
	lNewPosition = lRotation.MultT(lNewPosition);
	lRotationVector[1] = 0;
	lRotationVector[0] = dY;
	lRotation.SetR(lRotationVector);
	lNewPosition = lRotation.MultT(lNewPosition);
	lRotationVector[0] = 0;
	lRotationVector[1] = rotX;
	lRotation.SetR(lRotationVector);
	lNewPosition = lRotation.MultT(lNewPosition);
	lRotationVector[1] = -dX;
	lRotation.SetR(lRotationVector);
	lNewPosition = lRotation.MultT(lNewPosition);

	if (   lNewPosition[0]*lCurPosition[0] < 0 
			&& lNewPosition[2]*lCurPosition[2] < 0) {
		double lRoll = lCamera->Roll.Get();
		lRoll = 180.0-lRoll;
		lCamera->Roll.Set(lRoll);
	}

	lNewPosition = lNewPosition + lCenter;
	lCamera->Position.Set(lNewPosition);
}
Пример #2
0
// 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);
	}
}