Почему OpenSCAD не может вырезать отверстия в сторонах многоугольника точно по ширине стены?

Я пытаюсь сделать рамку для литографии, которую планирую напечатать в 3D-формате для своей жены ко Дню матери. Обычно я делаю так, чтобы мои различия были точно нужного размера (а не увеличивали их ради предварительного просмотра), потому что это дает мне хорошее представление о том, насколько точна моя математика (особенно когда я учитываю горизонтальный запас, создаваемый сжатым филаментом, выходящим из сопла).

В этом случае, однако, он вернулся, чтобы укусить меня. Я довольно долго отлаживал эту проблему, предполагая, что что-то просчитал или каким-то образом перепутал порядок своих вращений.

В конце концов, я увеличил свой вырез и, конечно же, отверстия появились правильно. После того, как я ткнул в него, я понял, что мне нужно всего 0,000005 мм по обе стороны от моего выреза, чтобы он правильно отображался!

Я создал минимальный воспроизводимый пример моей проблемы здесь:

outerRadius = 100;
height = 40;

wallWidth = 2;

innerRadius = outerRadius - wallWidth / sin(60);
apothem = innerRadius * cos(180 / 6);

// change this to 0 and see what happens!!
holeSizeCorrection = 0.00001;

module holes() {
    for (face = [0:5]) {
        rotate([0, 0, face * 60 + 30])
            translate([apothem - holeSizeCorrection / 2, 0, height / 2])
                rotate([0, 90, 0])
                    cylinder(h = wallWidth + holeSizeCorrection, r = height / 4, $fn = 4);
    }    
}

color("orange") difference() {
    $fn = 6;
    
    cylinder(h = height, r = outerRadius);
    
    translate([0, 0, -height/4]) // because if it's exactly right, you can't see inside
        cylinder(h = height * 2, r = innerRadius);

    color("blue") holes();
}

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

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

Но если у меня форма отверстия торчит на 0,000005 мм с обеих сторон, то она рендерится просто отлично!

Теперь, когда я знаю, как искать такие вещи, это, вероятно, сэкономит мне время на отладку в будущем. :) Но было бы неплохо узнать, не сделал ли я что-то не так.

, 👍5

Обсуждение

Мы не являемся местом общего 3D-дизайна. Что делает это актуальным для 3D-печати?, @Trish

@Триш, я планирую напечатать эту фигуру в 3D. Кроме того, я предположил, что есть тег "openscad" по какой-то причине (к лучшему или худшему). Я думаю, что OpenSCAD-относительно популярный CAD для людей, интересующихся 3D-печатью. Когда я искал "stackexchange openscad", 3dprinting были первыми 3 результатами. Это все просто для того, чтобы ответить на ваш вопрос . . . не для того, чтобы утверждать, что он принадлежит здесь . . . Я думаю, что у вас есть правильный мета-вопрос для бета-версии обмена стеками 3d-печати. Мое личное убеждение состоит в том, что это сообщество, скорее всего, в конечном итоге будет обсуждать инструменты моделирования так же, как и инструменты нарезки (если не больше)., @D. Patrick

Тег существует по этой причине, но политика также заключается в том, что при вопросах о 3D-дизайне [вы должны рассказать, как или почему ваш вопрос относится к 3D-печати, а не только к моделированию](https://3dprinting.meta.stackexchange.com/questions/501/cad-questions-review). Нам пришлось это сделать, потому что люди начали задавать вопросы, не имеющие отношения к 3D-печати и рассматривающие нас как общее руководство по 3D-моделированию. Пожалуйста, [отредактируйте] свой вопрос, чтобы включить в него, что это будет печатный проект., @Trish

@Trish, я добавил справочную информацию к вопросу, чтобы было более очевидно, как моя проблема (точность моих форм) связана с 3d-печатью (будучи уверенным, что мои расчеты верны в отношении размера сопла)., @D. Patrick

Связанный с этим вопрос: https://3d-printery.ru/topics/9794, @user31389

Это хорошо известная https://en.wikipedia.org/wiki/Z-fighting. Чтобы решить эту проблему в OpenSCAD, я использую глобальную переменную eps=0.001 и делаю вырезы типа translate([0,0,- eps])цилиндр(r=Радиус,h=Высота+2*eps). Я также использую eps для создания перекрытия/интерференции, если у меня возникают проблемы с несколькими поверхностями., @Dave X


1 ответ


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

4

OpenSCAD просто позволяет иметь поверхностные решения, которые приводят к стенке толщиной 0 мм. Стены, по-видимому, обрезаются в этих областях и иногда могут быть видны с обеих сторон, как в вашем примере:

a 0 thickness wall clipping

0, то толщина стены будет также экспортировать в формат STL в виде треугольников раскручивается вершинами, которые друг у друга в плоскости, но уже перевернутый нормальные векторы двух сторон, что означает, что конструкт существует для компьютера - и я использовал это в 3D дизайна для голограмма-эффект, даже если он не приводит к физически возможный набор свойств.

Примером такого эффекта может служить куб (сделанный в блендере), задняя стенка которого фиолетовая, все остальные серые, а внутренняя стенка имеет то же значение X, что и задняя. Вы видите, как серая стена отсекается, несмотря на то, что нормаль ее указывает на +X, в то время как нормаль фиолетовой стены находится в-X.

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

Обратите внимание, что стена с 0-й поверхностью сохраняется в предварительном просмотре слайсера:

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


,