Может ли в OpenSCAD сгибать текст (проецировать его на изогнутую поверхность)?

Я хочу нанести рельефный текст на изогнутую поверхность, но не могу найти способ сделать это в OpenSCAD. Я знаю, что можно сгибать текст в Blender, а затем импортировать stl, но мне не нравится этот рабочий процесс. Я нашел своего рода рабочее решение, но оно не идеально.

$fn=50;

module bend_text(caption, angle, text_height, text_width, text_depth, steps=10, k=1) {
    dh = text_height / steps;
    r = text_height / (angle * PI / 180);
    h0 = - text_height / 2;
    translate([0, 0, -r])
    rotate([angle / 2, 0, 0])
    for(i=[0:steps-1]) {
        rotate([-i * angle/steps, 0, 0])
        translate([0, -(dh * i + h0), r / k])
        intersection() {
            linear_extrude(text_depth) 
                text(caption, valign="center", halign="center");
            translate([0, dh * i + h0, 0]) 
                cube([text_width, dh, text_width], center=true);
        }
    }
}

bend_text("test", angle=90, text_height=9, text_width=30, text_depth=1, steps=10, k=1.1);

test

Есть ли лучший способ?

, 👍3

Обсуждение

Это стек 3D-печати, а не стек САПР, требуется указание на актуальность для 3D-печати, из [по теме] (https://3dprinting.stackexchange.com/help/on-topic ): `Если вопрос САПР связан с 3D-печатью, то он по теме. Однако общие вопросы САПР, не связанные с 3D-печатью, не по теме.- Однако очень интересный вопрос! Упоминая, что сгибание текста требуется, когда текст проецируется на небольшие радиусы, иначе под буквами могут быть пробелы, которые препятствуют правильной печати., @0scar


3 ответа


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

4

Другим способом может быть простое пересечение() (вдохновлено этим обсуждением: Как создать изогнутый лист (куб) в OpenSCAD?)

$fn=200;
w = 30;       // ширина прямоугольника
h = 1;       // высота прямоугольника
l = 10;      // длина хорды кривой
dh = 10;           // дельта-высота кривой

module curve(width, height, length, dh) {
    r = (pow(length/2, 2) + pow(dh, 2))/(2*dh);
    a = 2*asin((length/2)/r);
    translate([-(r -dh), 0, -width/2]) rotate([0, 0, -a/2])         rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);
}

intersection(){
    rotate([0,270,0]) curve(w, h, l, dh);
    translate([2,-3,0]) linear_extrude (height = 15) text("TEST", size = 6 );
}

до пересечения окончательный результат


,

2

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

Теоретически, я думаю, что должно быть возможно выполнить преобразование openscad (в самом openscad, а не на языке scad), которое применяется к произвольным 3D-объектам, путем выполнения 2D-конформного отображения в каждом поперечном сечении, перпендикулярном заданной оси, для достижения подобных эффектов без возможности нарушения геометрии. Но я не знаю, чтобы кто-нибудь работал над этим. Вероятно, я предложу это в какой-то момент, и, надеюсь, это не будет отвергнуто как математически несостоятельное (что может быть; я не уверен).

,

3

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

Текст_ В OpenSCAD

Библиотека охватывает различные формы, в том числе цилиндрические:

text on cylinders

Изображение со связанного сайта. Также с сайта: "Работает только с OpenSCAD v 2014.xx и более поздними версиями ..."

,

Насколько я могу судить, он не сгибает персонажей, он просто помещает каждого персонажа в его собственную плоскость, это не то, чего я хочу., @mugiseyebrows

Это различие, которое я упустил из виду, спасибо за разъяснение. Это делает ваше творение еще более впечатляющим. Есть ли способ удалить фрагменты из творения?, @fred_dot_u

да, фрагменты можно удалить, я использовал куб для разделения текста на части, мне следовало использовать треугольную призму, @mugiseyebrows