3D
Links
Matrix
Projection = Float4x4.CreatePerspectiveFieldOfView(fieldOfView, aspectRatio, nearPlaneDistance, farPlaneDistance);
View = Float4x4.CreateLookAt(cameraPosition, cameraTarget, cameraUpVector);
World = Float4x4.CreateWorld(position, forward, up);
ViewProjection = View * Projection;
WorldViewProjection = World * ViewProjection;
effect.WorldViewProj = WorldViewProjection;
CreatePerspectiveFieldOfView
public static Float4x4 CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance)
{
Float4x4 matrix;
if ((fieldOfView <= 0f) || (fieldOfView >= 3.141593f))
{
throw new ArgumentOutOfRangeException("fieldOfView", string.Format(CultureInfo.CurrentCulture, FrameworkResources.OutRangeFieldOfView, new object[] {"fieldOfView"}));
}
if (nearPlaneDistance <= 0f)
{
throw new ArgumentOutOfRangeException("nearPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[] {"nearPlaneDistance"}));
}
if (farPlaneDistance <= 0f)
{
throw new ArgumentOutOfRangeException("farPlaneDistance", string.Format(CultureInfo.CurrentCulture, FrameworkResources.NegativePlaneDistance, new object[] {"farPlaneDistance"}));
}
if (nearPlaneDistance >= farPlaneDistance)
{
throw new ArgumentOutOfRangeException("nearPlaneDistance", FrameworkResources.OppositePlanes);
}
float num = 1f/((float) Math.Tan((fieldOfView*0.5f)));
float num9 = num/aspectRatio;
matrix.M11 = num9;
matrix.M12 = matrix.M13 = matrix.M14 = 0f;
matrix.M22 = num;
matrix.M21 = matrix.M23 = matrix.M24 = 0f;
matrix.M31 = matrix.M32 = 0f;
matrix.M33 = farPlaneDistance/(nearPlaneDistance - farPlaneDistance);
matrix.M34 = -1f;
matrix.M41 = matrix.M42 = matrix.M44 = 0f;
matrix.M43 = (nearPlaneDistance*farPlaneDistance)/(nearPlaneDistance - farPlaneDistance);
return matrix;
}
CreateLookAt
public static Float4x4 CreateLookAt(Float3 cameraPosition, Float3 cameraTarget, Float3 cameraUpVector)
{
Float4x4 matrix;
var vector = Float3.Normalize(cameraPosition - cameraTarget);
var vector2 = Float3.Normalize(Float3.Cross(cameraUpVector, vector));
var float3 = Float3.Cross(vector, vector2);
matrix.M11 = vector2.X;
matrix.M12 = float3.X;
matrix.M13 = vector.X;
matrix.M14 = 0f;
matrix.M21 = vector2.Y;
matrix.M22 = float3.Y;
matrix.M23 = vector.Y;
matrix.M24 = 0f;
matrix.M31 = vector2.Z;
matrix.M32 = float3.Z;
matrix.M33 = vector.Z;
matrix.M34 = 0f;
matrix.M41 = -Float3.Dot(vector2, cameraPosition);
matrix.M42 = -Float3.Dot(float3, cameraPosition);
matrix.M43 = -Float3.Dot(vector, cameraPosition);
matrix.M44 = 1f;
return matrix;
}
CreateWorld
public static Float4x4 CreateWorld(Float3 position, Float3 forward, Float3 up)
{
Float4x4 matrix;
var vector = Float3.Normalize(-forward);
var vector2 = Float3.Normalize(Float3.Cross(up, vector));
var float3 = Float3.Cross(vector, vector2);
matrix.M11 = vector2.X;
matrix.M12 = vector2.Y;
matrix.M13 = vector2.Z;
matrix.M14 = 0f;
matrix.M21 = float3.X;
matrix.M22 = float3.Y;
matrix.M23 = float3.Z;
matrix.M24 = 0f;
matrix.M31 = vector.X;
matrix.M32 = vector.Y;
matrix.M33 = vector.Z;
matrix.M34 = 0f;
matrix.M41 = position.X;
matrix.M42 = position.Y;
matrix.M43 = position.Z;
matrix.M44 = 1f;
return matrix;
}
· ·