Necesito una fórmula para matrices de proyección ortográfica y de perspectiva para diestros

Estoy haciendo una prueba de gráficos 3D "cubos sin textura en una pantalla azul" usando coordenadas para diestros. Sin embargo, salen extrañamente recortados o distorsionados (en ortográfico, el lado izquierdo de la pantalla termina antes que la ventana; en perspectiva, parece que la pantalla se extiende de atrás a la izquierda a adelante y a la derecha).

No estoy seguro de cuál es realmente el problema, pero las matrices de proyección parecen un buen lugar para comenzar.

Los que estoy usando ahora:

    // 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
            );
    }

Muchas Gracias

preguntado el 16 de mayo de 11 a las 16:05

¿Cómo es su proceso de transformación? ¿O está utilizando alguna API de gráficos 3D como OpenGL o Direct3D? -

Estoy usando SlimDX (envoltorio de DirectX para .Net, esencialmente) como back-end, con mi propia biblioteca en la parte superior. Y ... no estoy seguro de qué es una "canalización de transformación", pero aquí hay un Pastebin de un código relevante: pastebin.com/3DziVJSV - Sé que es un truco; es una prueba temprana de funcionalidad básica. -

Con "canalización de transformación" me refiero a la forma en que las coordenadas 3D de sus vértices se transforman en coordenadas de pantalla. Pero como dice que está usando Direct3D, es bastante obvio. -

Pero recuerde, si está utilizando un sombreador de vértices, depende de cómo su sombreador transforme los vértices. -

No tengo un sombreador que esté usando en este momento. ¿Puedes ver algo obviamente mal en mi código de proyección? Trabajando para mejorar mis matemáticas, pero no es un proceso instantáneo. -

1 Respuestas

Resuelto - Gracias por toda su ayuda. No fueron las matrices de proyección; era una única variable mal colocada en la matriz LookAt / View. Todo se muestra correctamente ahora que está arreglado.

    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
            );
    }

Ups :)

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.