Pergunta

Eu tenho um FOV de perspectiva, mas ao girar, ele não "parece" correto - Objetos mais distantes percorrem mais rápido que objetos mais próximos, passando por eles no meio da tela.

Então:Isso está correto?Usando coordenadas para destros, se isso importa?

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

Obrigado.

Foi útil?

Solução

Vejo alguns problemas.Primeiro, o argumento para tan() deve ser convertido de graus para radianos.

Segundo, a fórmula para projeção em perspectiva no OpenGL é um pouco diferente da sua.Como especificado aqui, ele usa 'perto - longe' no denominador em vez de 'muito perto'.Os termos do numerador também são diferentes.Modificando ligeiramente sua função e convertendo de Java para C, produzi uma matriz de projeção idêntica àquela fornecida por gluPerspective() com o seguinte:

static void my_PerspectiveFOV(double fov, double aspect, double near, double far, double* mret) {
    double D2R = M_PI / 180.0;
    double yScale = 1.0 / tan(D2R * fov / 2);
    double xScale = yScale / aspect;
    double nearmfar = near - far;
    double m[] = {
        xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, (far + near) / nearmfar, -1,
        0, 0, 2*far*near / nearmfar, 0 
    };
    geom_matrix4_copy(m, mret);
}

Outras dicas

Para questões como esta, sugiro excelentes recursos:https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrixRealmente vai no detalhe da matriz de projeção.São mais lições sobre o tema câmera, construção de raios de câmera, etc.Você precisará fazer algumas escavações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top