2017-02-11 4 views
0

J'écrivais un moteur voxel quand j'ai eu ce problème bizarre avec les visages. Donc quand je m'éloigne du terrain, tout se casse. Je n'ai même pas une idée de comment décrire le problème, je vais poster quelques captures d'écran.Voxel Engine, les visages sont mis en veille lorsque la caméra fait un panoramique

camera_projection = bb_perspective(bb_toRadiansReal32(70.0f), ((r32)WINDOW_WIDTH/(r32)WINDOW_HEIGHT), 0.1f, 1000.0f); 

j'ai découvert quand je joue avec la deuxième à la dernière valeur et de changement qui à un problème de 1.0f en partie disparaît. Mais je ne veux pas garder cette valeur à 1.0f.

I poster définition de cette fonction:

static bbMat4 bb_perspective(r32 fov, r32 aspect, r32 near, r32 far) { 
    bbMat4 ret(1.0f); 

    r32 range = near - far; 
    r32 tan_half_fov = tanf(fov/2.0f); 

    ret[0][0] = 1.0f/(tan_half_fov * aspect); 
    ret[1][1] = 1.0f/tan_half_fov; 
    ret[2][2] = (-near - far)/range; 
    ret[2][3] = 2.0f * far * near/range; 
    ret[3][3] = 0.0f; 
    ret[3][2] = 1.0f; 

    return ret; 
} 

Je n'ai complètement aucune idée de la façon de traiter cette question.

+0

Pouvez-vous expliquer ce que nous voyons dans les captures d'écran et ce qui ne va pas? Pourquoi ne voulez-vous pas changer la valeur znear à une valeur qui fonctionne? Le réglage des plans de clipping proches et lointains à des valeurs raisonnables est essentiel. Quelle profondeur de bits utilisez-vous pour votre tampon de profondeur? –

+0

Va-t-il disparaître si vous choisissez une gamme plus petite de près à lointain, disons 1.0f à 1000.0f? –

+0

Pas complètement, je dois aller plus loin avec caméra pour revoir ce bug. – Brajanowski

Répondre

0

Vérifiez vos maths.

ret[2][2] = (-near - far)/range; ne semble pas correct. Si vous regardez une bibliothèque existante (par exemple le dernier GLM) vous serez en mesure de voir ce que je veux dire:

GLM utilise Result[2][2] = (zFar + zNear)/(zFar - zNear); lorsque l'espace de clip est -1, 1.

également ret[2][3] = 2.0f * far * near/range; devrait être ret[3][2] = 2.0f * far * near/range; et ret[2][3] En guise de remarque, l'utilisation de votre propre bibliothèque de maths n'est presque jamais la meilleure idée. Les établis sont toujours rigoureusement testés par beaucoup de gens. Cela peut être un excellent exercice, je l'ai fait moi-même dans le passé, mais peut-être que l'utilisation d'une bibliothèque existante pour tester votre production serait une bonne idée.