public static CameraMatricesExpressions GetMatricesExpressions(IEnumerable <VFXNamedExpression> expressions, VFXCoordinateSpace cameraSpace, VFXCoordinateSpace outputSpace) { var fov = expressions.First(e => e.name == "Camera_fieldOfView"); var aspect = expressions.First(e => e.name == "Camera_aspectRatio"); var near = expressions.First(e => e.name == "Camera_nearPlane"); var far = expressions.First(e => e.name == "Camera_farPlane"); var cameraMatrix = expressions.First(e => e.name == "Camera_transform"); var isOrtho = expressions.First(e => e.name == "Camera_orthographic"); var orthoSize = expressions.First(e => e.name == "Camera_orthographicSize"); var lensShift = expressions.First(e => e.name == "Camera_lensShift"); VFXExpression ViewToVFX = cameraMatrix.exp; if (cameraSpace == VFXCoordinateSpace.World && outputSpace == VFXCoordinateSpace.Local) { ViewToVFX = new VFXExpressionTransformMatrix(VFXBuiltInExpression.WorldToLocal, cameraMatrix.exp); } else if (cameraSpace == VFXCoordinateSpace.Local && outputSpace == VFXCoordinateSpace.World) { ViewToVFX = new VFXExpressionTransformMatrix(VFXBuiltInExpression.LocalToWorld, cameraMatrix.exp); } VFXExpression VFXToView = new VFXExpressionInverseTRSMatrix(ViewToVFX); VFXExpression ViewToClip = new VFXExpressionBranch(isOrtho.exp, VFXOperatorUtility.GetOrthographicMatrix(orthoSize.exp, aspect.exp, near.exp, far.exp), VFXOperatorUtility.GetPerspectiveMatrix(fov.exp, aspect.exp, near.exp, far.exp, lensShift.exp)); VFXExpression ClipToView = new VFXExpressionInverseMatrix(ViewToClip); return(new CameraMatricesExpressions() { ViewToVFX = new VFXNamedExpression(ViewToVFX, "ViewToVFX"), VFXToView = new VFXNamedExpression(VFXToView, "VFXToView"), ViewToClip = new VFXNamedExpression(ViewToClip, "ViewToClip"), ClipToView = new VFXNamedExpression(ClipToView, "ClipToView"), }); }