Порядок намотки вершин треугольника в файлах стереолитографии (STL) (триангулированные объекты) - PullRequest
1 голос
/ 03 января 2012

Я работаю над импортером файлов STL и подумал, что использовал бы нормальное значение, данное для определения порядка намотки треугольника. Пример данных с 4 треугольниками приведен ниже (исходные данные имеют более 70 000 треугольников). Логика моего кода вычисляет нормаль, предполагая, что вершины заданы против часовой стрелки, а затем вычисляет скалярное произведение этой вычисленной нормали с предоставленной нормалью. Если результат положительный, то я предполагаю, что против часовой стрелки, а по часовой стрелке.

        tm.SetCCW(Dot(Cross(facet.getVertex2() - facet.getVertex1(),facet.getVertex3() - facet.getVertex1()),facet.getNormal()) > 0.0);

Эта логика не работает для набора файлов с определенного 3D-сканера. Когда я загружаю эти файлы в Rhino3D и запускаю команду «Dir», чтобы посмотреть на нормальное направление, Rhino имеет правильное направление! То же самое с парой других зрителей STL, которых я пробовал.

Мой код определяет, что для данных выборки вершины предоставляются по часовой стрелке, но при использовании этого порядка намотки модель вывернута наизнанку, подразумевая, что введенные нормали неверны.

Это приводит меня к выводу, что для импортеров STL принято игнорировать предоставленную нормаль и принимать порядок намотки против часовой стрелки. Я ищу людей с большим опытом работы с форматом файлов STL, чтобы понять, верны ли мои предположения.

solid object_name
    facet normal -0.651094 0.733745 -0.194150
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.155055 -39.911656 -67.162500
            vertex 30.263726 -40.702583 -67.162500
        endloop
    endfacet
    facet normal -0.654292 0.732059 -0.189714
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.711866 0.677947 -0.183397
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.980540 -39.044870 -67.162500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.714326 0.676343 -0.179716
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 32.048799 -39.228928 -68.126500
            vertex 31.980540 -39.044870 -67.162500
        endloop
    endfacet
endsolid

РЕДАКТИРОВАТЬ: Мои расчеты для первого аспекта:

p1 = {30.335684, -40.893806, -68.126500}
p2 = {31.155055, -39.911656, -67.162500}
p3 = {30.263726, -40.702583, -67.162500}

u = p2 - p1 = {0.819371, 0.98215, 0.964}
w = p3 - p1 = {-0.071958, 0.191223, 0.964}

u x w = {0.762454, -0.859241, 0.227356}   (calculated normal)

given normal = {-0.651094, 0.733745, -0.194150}

calculated_normal <dot> given_normal = -1.17103

verdict: 90 < theta < 270 where theta is the angle between the calculated and given normals

1 Ответ

2 голосов
/ 23 мая 2013

Вершины должны быть в порядке против часовой стрелки, когда вершины видны снаружи объекта.(Очевидно, что при просмотре изнутри объекта они располагаются по часовой стрелке).

Нормаль должна указывать наружу.

Я читал, что некоторые программы игнорируют нормаль и идут только по порядку вершини я даже прочитал рекомендацию по установке нормали на {0.0, 0.0, 0.0}, хотя в спецификации говорится, что должны использоваться и нормаль, и порядок вершин.

Хотя нормаль избыточна.Для многих программ порядок вершин - это все, что необходимо.Я не знаю, верно ли это для всех программ.Я рекомендую, чтобы оба были правильными.

...