В этой статье MSDN показано, как написать метод, который создает матрицу перспективы, которая независимо учитывает горизонтальное и вертикальное FOV (хотя и в C ++)
http://msdn.microsoft.com/en-us/library/bb147302%28VS.85%29.aspx
D3DXMATRIX
ProjectionMatrix(const float near_plane, // Distance to near clipping
// plane
const float far_plane, // Distance to far clipping
// plane
const float fov_horiz, // Horizontal field of view
// angle, in radians
const float fov_vert) // Vertical field of view
// angle, in radians
{
float h, w, Q;
w = (float)1/tan(fov_horiz*0.5); // 1/tan(x) == cot(x)
h = (float)1/tan(fov_vert*0.5); // 1/tan(x) == cot(x)
Q = far_plane/(far_plane - near_plane);
D3DXMATRIX ret;
ZeroMemory(&ret, sizeof(ret));
ret(0, 0) = w;
ret(1, 1) = h;
ret(2, 2) = Q;
ret(3, 2) = -Q*near_plane;
ret(2, 3) = 1;
return ret;
} // End of ProjectionMatrix
Математика более подробно объясняется в статье, приведенной выше, чтобы помочь вам в написании C #-версии этого метода. Удачи: -)