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;
}
Hyrtwol, Version 1.1.0.45 · Repertoire, Version 1.1.51.82 · View markdown source