OpenSCAD не рендеринг многогранника

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

Предварительный просмотр-поли вырез отображается сверху (и снизу).

preview

Визуализация - поли-вырез не виден.

rendered

Поли взорвался - потянул поли вправо, чтобы показать его форму.

poly exploded

Код

size = 30;
wall = 3;
wall_x2 = wall * 2;
nubGap = .125;
nubHeight = 8;
nubOffset = wall + nubGap;
xCutoutSize = size - wall_x2;
yCutoutSize = size - wall_x2;
cutoutLowerY = nubHeight + nubGap;
cutoutUpperOffset = nubOffset + wall;
    
difference() {
    cube([size, size, size]);
    
    translate([wall, wall, 0]) {
        polyhedron(
            points = [
                [0, 0, -10],
                [xCutoutSize, 0, -10],
                [xCutoutSize, yCutoutSize, -10],
                [0, yCutoutSize, -10],
        
                [0, 0, cutoutLowerY],
                [xCutoutSize, 0, cutoutLowerY],
                [xCutoutSize, yCutoutSize, cutoutLowerY],
                [0, yCutoutSize, cutoutLowerY],
        
                [cutoutUpperOffset, cutoutUpperOffset, size],
                [xCutoutSize - cutoutUpperOffset, cutoutUpperOffset, size],
                [xCutoutSize - cutoutUpperOffset, yCutoutSize - cutoutUpperOffset, size],
                [cutoutUpperOffset, yCutoutSize - cutoutUpperOffset, size]
            ],
            faces = [
                [0, 1, 2], [2, 3, 0],     // bottom
                
                [0, 1, 4], [1, 4, 5],     // side A
                [1, 2, 5], [2, 5, 6],     // side B
                [2, 3, 6], [3, 6, 7],     // side C
                [3, 0, 7], [0, 7, 4],     // side D
                
                [4, 5,  8], [5,   8,  9], // slope A
                [5, 6,  9], [6,   9, 10], // slope B
                [6, 7, 10], [7,  10, 11], // slope C
                [7, 4, 11], [4,  11,  8], // slope D
                
                [8, 9, 10], [10, 11,  8]  // top
            ]
        );
    };
};

, 👍2


2 ответа


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

4

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

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

meshmixer image

Это изображение из meshmixer показывает, что грани имеют перевернутые нормали. Порядок точек имеет решающее значение при описании многогранника. С вики-страницы OpenSCAD:

Это произвольно, с какой точки вы начинаете, но все грани должны иметь точки, упорядоченные в одном направлении . OpenSCAD предпочитает смотреть на каждую грань снаружи внутрь по часовой стрелке. Спина просматривается сзади, низ снизу и т. Д. Еще один способ запомнить это требование-использовать правило правой руки. Используя правую руку, поднимите большой палец вверх и согните пальцы, как бы давая знак большого пальца вверх, направьте большой палец в лицо и расположите точки в направлении, в котором ваши пальцы сгибаются.

ПРАВКА: Я перевернул некоторые пункты, бессистемно и, к счастью, выбрал правильные:

        faces = [
            [0, 1, 2], [2, 3, 0],     // bottom
            
            [4, 1, 0], [1, 4, 5],     // side A
            [5, 2, 1], [2, 5, 6],     // side B
            [6, 3, 2], [3, 6, 7],     // side C
            [7, 0, 3], [0, 7, 4],     // side D
            
            [8, 5, 4], [5,   8,  9], // slope A
            [9, 6, 5], [6,   9, 10], // slope B
            [10, 7, 6], [7,  10, 11], // slope C
            [11, 4, 7], [4,  11,  8], // slope D
            
            [10, 9, 8], [8, 11, 10]  // top

rendered code


,

Ах, в этом есть смысл, я попробую. Спасибо!, @Josh M.

Да, OpenSCAD требует последовательных норм, и, исходя из моего опыта, на самом деле требует (а не просто предпочитает), чтобы они указывали внутрь, если вы хотите, чтобы функции CSG работали правильно., @R.. GitHub STOP HELPING ICE

Я не был уверен насчет ссылки "требуется по сравнению с предпочтениями... указывать внутрь", но, согласно вики, она "предпочитает по часовой стрелке"., @fred_dot_u

Спасибо. Я только что переупорядочил точки так, чтобы они были по часовой стрелке, но у меня была похожая, но другая проблема. Я думаю, я не понимаю, почему (для стороны А) [4, 1, 0] работает, но "[0, 4, 1]" не работает (применительно ко всем другим лицам) - они оба смотрят на лицо по часовой стрелке, но, возможно, разница в том, чтобы начать с "верха"?, @Josh M.


2

Если поверхность многогранника и верхняя поверхность куба точно копланарны, как это кажется, это не будет работать; OpenSCAD работает численно, а не аналитически, и то, что находится "внутри" или "снаружи" другого, подвержено числовой нестабильности. Всякий раз, когда вы используете различия, вам нужно сделать так, чтобы вычитаемый объект расширялся по крайней мере на какой-то небольшой эпсилон вне зоны действия объекта, из которого вы вычитаете.

,

Я расширил нижнюю часть поля вниз через нижнюю часть куба и получил те же результаты. Но я попробую сделать это еще раз., @Josh M.