Помогите с задачей «данная сетка не замкнута», простое объединение многогранника и куба.

В более крупном скрипте OpenSCAD возникает ошибка:

ОШИБКА: данная сетка не замкнута! Невозможно преобразовать в CGAL_Nef_Polyhedron.

Мне удалось воспроизвести ошибку на гораздо меньшем примере — объединении многогранника и куба:

h1 = 10;
h2 = 20;
w = 20;
dy = 0;
l = 30;
ANGLE_BRACKET_THICKNESS = 2;

polyhedron(points=
           [
            // нижняя грань
            [0, 0, 0], [0, +h1, 0], [+w, +h1, 0], [+w, 0, 0],

            // верхняя грань
            [0, dy, l], [0, dy, l+h2], [+w, dy, l+h2], [+w, dy, l],
            ],
           faces = [
                    [0, 1, 2], [0, 2, 3], // база
                    [4, 5, 6], [4, 6, 7], // верх
                    [0, 1, 4], [1, 4, 5], // левая грань
                    [1, 2, 5], [2, 5, 6], // верхняя грань
                    [2, 3, 6], [3, 6, 7], // правая грань
                    [0, 3, 4], [3, 4, 7], // нижняя грань
                    ]
           );


magic_dy = 0;

translate([0, dy-h2/2+magic_dy, l]) {
    translate([0, 0, h2/2])
        translate([0, 0, -h2/2])
        cube([ANGLE_BRACKET_THICKNESS, h2/2, h2]);
}

Дает:

openscad -o test.stl test.scad
ERROR: The given mesh is not closed! Unable to convert to CGAL_Nef_Polyhedron.
Geometries in cache: 5
Geometry cache size in bytes: 3928
CGAL Polyhedrons in cache: 1
CGAL cache size in bytes: 11344
Total rendering time: 0:00:00.000
   Top level object is a 3D object:
   Simple:        yes
   Vertices:        8
   Halfedges:      24
   Edges:          12
   Halffacets:     12
   Facets:          6
   Volumes:         2

Визуально я не вижу никаких проблем с моделью:

сетка не закрыта

Если я попытаюсь выполнить рендеринг в состоянии ошибки, многогранник будет удален:

Многогранник удалён при рендеринге

Если я уберу куб и отрисую только многогранник, ошибка исчезнет, и многогранник отобразится:

openscad -o test.stl test.scad
Geometries in cache: 1
Geometry cache size in bytes: 1016
CGAL Polyhedrons in cache: 0
CGAL cache size in bytes: 0
Total rendering time: 0:00:00.000
   Top level object is a 3D object:
   Facets:         12

только многогранник

Какие шаги я могу предпринять для устранения этой ошибки?

Есть ли более простой способ создания многогранника в форме прокладки, изображенного выше, в OpenSCAD?

, 👍0


1 ответ


Лучший ответ:

2

Цитирование документации

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

Ваши треугольники (кстати, вся суть faces, а не triangles в том, что можно просто написать [1,0,3,2] вместо [1,0,2],[2,0,3]) ориентированы случайным образом. Некоторые вовнутрь, некоторые наружу.

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

Итак, просто переверните неправильно упорядоченные треугольники

            faces = [
                    [1, 0, 2], [2, 0, 3], // база
                    [4, 5, 6], [4, 6, 7], // верх
                    [0, 1, 4], [4, 1, 5], // левая грань
                    [1, 2, 5], [5, 2, 6], // верхняя грань
                    [2, 3, 6], [3, 7, 6], // правая грань
                    [3, 0, 4], [3, 4, 7], // нижняя грань
                    ]
           );

И проблема решена.

Правка: из документации (признаюсь, я обнаружил это только сейчас. Я определил неправильную ориентацию трудным путем. И только при попытке скопировать и вставить документацию я увидел следующий трюк) мы также узнаем, что существует простой способ определить неправильно ориентированные грани, используя «скомпонованную» визуализацию из меню «Вид» (или клавиши F12). Тогда неправильно ориентированные грани будут фиолетовыми.

Ваш исходный код даёт:

(И если вы думаете: «Но если он может определить неправильно ориентированную грань, почему он сам не исправит ориентацию?»: он этого не делает. Просто грани рисуются желтыми, когда вы видите их снаружи, и фиолетовыми, когда вы видите их изнутри. Но когда вы смотрите на замкнутый многогранник, вы должны видеть все снаружи и не иметь возможности видеть изнутри. Таким образом, даже при правильной ориентации половина нарисованной поверхности фиолетовая. Просто вы ее не видите, так как она находится внутри. Если вы видите фиолетовый, то есть проблема.)


,