2016-01-31 1 views
1

Donc j'essaie de générer du terrain en utilisant l'algorithme des cubes de marching. À ce stade, j'implémente l'éclairage diffus (fragment shader). J'ai calculé pour chaque sommet Normales et obtenu ceci: resultcubes de marche, très petits triangles

Le côté gauche de l'image affiche les Normales (pour chaque sommet et triangle) et wireframe, à droite est le paysage éclairé par le même angle de la caméra. Donc, je suis curieux, qu'est-ce que je fais mal?

Je Calculons Normales cette façon:

for (int t = 0; t < all_triangles.size(); t++) { 

     Vertex v0 = all_vertices[triangle.get_vertex(0)]; 
     Vertex v1 = all_vertices[triangle.get_vertex(1)]; 
     Vertex v2 = all_vertices[triangle.get_vertex(2)]; 

     QVector3D edge1 = v1 - v0; 
     QVector3D edge2 = v2 - v0; 

     QVector3D normal = QVector3D::crossProduct(edge1, edge2); 
//  triangle.set_normal(normal.normalized()); 

     for (int v = 0; v < 3; v++) { 
      all_vertices[triangle.get_vertex(v)].add_normal(normal.normalized()); 
     } 
    } 

    for (int v = 0; v < all_vertices.size(); v++) { 
     auto normal = all_vertices[v].get_normal(); 
     normal.normalize(); 
     all_vertices[v].set_normal(normal); 

    } 

màj: VCS

bitbucket source

+0

Est-ce intentionnellement que «t» n'est pas utilisé dans la boucle? – 4386427

+0

@ 4386427 ouais, j'utilise la macro, désolé je ne l'ai pas posté '#define triangle all_triangles [t]' – viache

+0

Quel est l'effet de 'get_normal()' et 'add_normal (...)'? Pouvez-vous fournir le code de ces méthodes. –

Répondre

1

Votre calcul est correct. Vous avez l'air normal, mais il est très difficile de comprendre votre image à 100%.

approche commune pour debug ces problèmes est: - ombrage plat (pas de lissage normal) - triangle utilisation/vertex normale que la couleur pour visualiser Normales

s'il vous plaît également partager votre code d'ombrage.

+0

donc je l'ai [que] (http://i.imgur.com/op7mcbZ.png), semble assez aléatoire. quelle pourrait être ma prochaine étape? pourquoi rendre des normales en utilisant un shader de géométrie donne un résultat plausible, et cela ressemble à du désordre? – viache

+0

pouvez-vous partager votre code s'il vous plaît? github/bitbucket/peu importe? – Bagobor

+0

La majorité des normales doivent être bleues, mais les vôtres sont vertes. essayer d'inverser les vecteurs. (mult-it sur -1 ou changer l'ordre des bords dans le produit croisé) – Bagobor

1

C'est normal pour les cubes de marche. C'est un problème connu de l'algorythme avec un nom technique comme des triangles redondants. Il y a un ajustement très simple pour cela, si vous avez besoin de moins de triangles et que vous ajoutez une ligne de comparaison pour chaque sommet, la solution est d'aligner les valeurs iso sur les coins des cubes s'ils sont plus proches de 95%. Les optimisations MC sont très cool, le mieux serait de détecter les cubes usés et de redimensionner les cubes par rapport à la complexité ou la planéité de la surface à cette zone. il y a des articles géniaux sur le sujet.

Voici une démonstration d'une solution rapide juste en accrochant les valeurs aux coins si la proximité de l'intersection des bords est inférieure à 5% ou supérieure à 95%, accordable, peut essayer 90% si vous le souhaitez.

Générique MC: enter image description here

Simplest optimisation possible: enter image description here

SnapMC est similaire:

enter image description here

0

Quelques choses à essayer:

(1) Poids votre normales. add_normal (normal.normalized() * weight), où le poids peut être beaucoup de choses, comme la zone du triangle, ou l'angle interne

(2) Calculez une normale à partir de votre champ. Vous obtenez une surface où f (x, y, z) = 0. Évaluer à f (x-eps, y, z) -f (x + eps, y, z) pour obtenir votre x normal, même pour y, z.

(3) Il suffit de le brouiller. Pour chaque sommet ajouter dans toutes les normales adjacentes par le bord, et moyenne.

Je pense que vous voulez (2). Surtout pour le terrain.