Mogę obliczyć trójkąt normalny N, mając trzy pozycje wierzchołków v0, v1, v2 i przy użyciu produktu krzyżowego:

calculation

Problemem jest struktura danych siatki 3D potrzebuje normalnego dla każdego wierzchołka. To znaczy, potrzebuje n1, n2 i n3. Nie wiem, jaki jest właściwy sposób ich obliczenia.

Wypróbowany

Próbowałem użyć tej samej wartości N dla n1, n2 i n3, ale nie jestem pewien, czy jest to właściwe podejście:

n1 = n2 = n3 = N

1
user3405291 12 październik 2020, 11:37

1 odpowiedź

Najlepsza odpowiedź

Zaimplementowane gładkie wierzchołek normalny:

std::vector<Vec3d> points = ...
std::vector<Vec3i> facets = ...

// Count how many faces/triangles a vertex is shared by
std::vector<int> counters;
counters.resize(points.size());

// Compute normals
norms.clear();
norms.resize(points.size());
for (Vec3i f : facets) {
    int i0 = f.x();
    int i1 = f.y();
    int i2 = f.z();
    Vec3d pos0 = points.at(i0);
    Vec3d pos1 = points.at(i1);
    Vec3d pos2 = points.at(i2);
    Vec3d N = triangleNormal(pos0, pos1, pos2);
    
    // Must be normalized
    // https://stackoverflow.com/a/21930058/3405291
    N.normalize();

    norms[i0] += N;
    norms[i1] += N;
    norms[i2] += N;

    counters[i0]++;
    counters[i1]++;
    counters[i2]++;
}

for (int i = 0; i < static_cast<int>(norms.size()); ++i) {
    if (counters[i] > 0)
        norms[i] /= counters[i];
    else
        norms[i].normalize();
}
0
user3405291 23 październik 2020, 15:30