Мне нужна формула для матриц с правой и правой проекцией - PullRequest
1 голос
/ 16 мая 2011

Я делаю тест 3D-графики "нетекстурированные кубики на синем экране", используя правые координаты. Однако они выглядят странно обрезанными или искаженными (в Orthographic левая сторона дисплея заканчивается раньше, чем окно; в перспективе это выглядит так, будто дисплей растягивается от заднего левого к переднему правому).

Не уверен, в чем проблема на самом деле, но матрицы проекций, кажется, хорошее место для начала.

Те, что я использую сейчас:

    // Went back to where I found it and found out this is a 
    // left-handed projection. Oops!
    public static Matrix4x4 Orthographic(float width, float height,
        float near, float far)
    {
        float farmnear = far - near;
        return new Matrix4x4(
            2 / width, 0, 0, 0,
            0, 2 / height, 0, 0,
            0, 0, 1 / farmnear, -near / farmnear,
            0, 0, 0, 1
            );
    }


    // Copied from a previous project.
    public static Matrix4x4 PerspectiveFov(float fov, float aspect, 
        float near, float far)
    {
        float yScale = 1.0F / (float)Math.Tan(fov / 2);
        float xScale = yScale / aspect;
        float farmnear = far - near;
        return new Matrix4x4(
            xScale, 0, 0, 0,
            0, yScale, 0, 0,
            0, 0, far / (farmnear), 1,
            0, 0, -near * far / (farmnear), 1
            );
    }

Спасибо

1 Ответ

0 голосов
/ 16 мая 2011

Решено - Спасибо за вашу помощь.Это были не матрицы проекций;это была единственная неправильно помещенная переменная в матрице LookAt / View.Теперь все исправлено.

    public static Matrix4x4 LookAt(Vector3 eye, Vector3 target, Vector3 up)
    {
        Vector3 zAxis = target; zAxis.Subtract(ref eye); zAxis.Normalize();
        Vector3 xAxis = up; xAxis.Cross(zAxis); xAxis.Normalize();
        Vector3 yAxis = zAxis; yAxis.Cross(xAxis);
        return new Matrix4x4(
            xAxis.X, yAxis.X, zAxis.Z, 0, // There.
            xAxis.Y, yAxis.Y, zAxis.Y, 0,
            xAxis.Z, yAxis.Z, zAxis.Z, 0,
            -xAxis.Dot(eye), -yAxis.Dot(eye), -zAxis.Dot(eye), 1
            );
    }

Упс.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...