Как предотвратить z-файтинг в OpenSCAD?

Z-fighting-это артефакт 3D-рендеринга копланарных поверхностей (т. е. треугольников, расположенных в одной плоскости и перекрывающих друг друга).

Это может произойти в режиме предварительного просмотра OpenSCAD при выполнении операции difference() или union (). В случае разницы ()артефакты рендеринга могут помешать заглянуть в отверстие в объекте. В режиме "компиляция и визуализация" в OpenSCAD нет проблем с z-борьбой. Но поскольку для визуализации объекта в этом режиме может потребоваться некоторое время, это не является практическим решением во время разработки.

Как лучше всего избежать z-боев?

Если ответ включает в себя изменения в моем коде OpenSCAD, я хотел бы видеть идиоматический ответ / установленное соглашение кодеров OpenSCAD, если оно существует.

, 👍12


1 ответ


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

14

Общий совет в сообществе OpenSCAD заключается в том, чтобы "расширить ваши сокращения и внедрить ваши объединения" (источник). Артефакты рендеринга-это одно, а скорее просто раздражение; однако z-fighting также может вызывать неожиданные ошибки во время экспорта STL (до сих пор я сам этого не испытывал, просто где-то читал об этом).

Таким образом, вы должны очень незначительно изменить размеры своих объектов (0,01 мм работает нормально), чтобы:

  • для соединения ()существует объем перекрытия между деталями
  • для разницы ()пересечение имеет объем как внутри, так и снаружи пересекаемой части

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

Вместо этого я настраиваю положение или размер детали в зависимости от того, что проще в каждом случае. Мера в окончательной конструкции будет отклонена на 0,01 мм, что не имеет значения.

И я сохраняю смещение 0,01 мм в переменной под названием ничего (где-то подобрал это и мне понравилось ...). Это делает расчеты интуитивно понятными.

Пример

Чтобы создать цилиндр и вырезать отверстие на половину его глубины, я бы сделал следующее:

//!OpenSCAD
nothing=0.01;
height=40;

difference(){
    cylinder(h=height, r=20, center=true);

    translate([0, 0, height/4 + nothing]) 
        cylinder(h=height/2, r=15, center=true);
}

Теперь отверстие ничего=0,01 меньше половины цилиндра – это неточность, которую я принимаю.

(Примечание: Если у вас не установлен OpenSCAD, вы также можете попробовать приведенный выше код в Интернете, скопировав и вставив его в OpenJSCAD. Включите комментарий magic в первую строку, чтобы переключить его на синтаксис OpenSCAD.)


,

Ваш ответ - это тот, который я бы опубликовал для этого вопроса. Вы добавляете параметр "ничего", в то время как я использую "addabit = 0.1" для большинства действий z., @fred_dot_u

Это может улучшить генерацию STL. OpenSCAD имеет две системы рендеринга. Первый используется для быстрого отображения кода. Вторая намного медленнее и должна выполняться перед созданием STL. По моему опыту, первый подвержен этой проблеме со слоями нулевой толщины, но второй более точен и не подвержен этой проблеме. Ваш опыт может отличаться, но я не создавал плохие STL-файлы для изображений с этим артефактом отображения., @cmm

@cmm То же самое здесь, я также до сих пор видел z-fighting только в режиме предварительного просмотра. Проблема STL-это то, что я подхватил где-то еще. Я четко обозначил это различие в ответе сейчас., @tanius

Вы можете увеличить высоту объекта на *ничего*, чтобы получить идеальную деталь., @Cem Kalyoncu

Я также видел, что эта переменная называется "терпимость", что лично я нахожу менее забавным, но более описательным., @user31389

Я видел, как слово «eps» означает «эпсилон» — математический произвольно малый интервал, используемый для пределов и интегрирования., @Dave X