Search models, users, collections, and posts

3D Ambigram Dual Text

IP Report
This model is created by Parametric Model Maker
Make Your Model

Print Profile(1)

All
P1S
A1
H2D Pro
X1 Carbon
P1P
X1E
H2D
X1
H2S
P2S
H2C
X2D
A2L

0.2mm layer, 2 walls, 15% infill
0.2mm layer, 2 walls, 15% infill
Designer
1.9 h
1 plate

Open in Bambu Studio
Boost
58
116
3
7
353
127
Released 

Description

Latest revision added new parameters and colors selection


I created this model generator to practice and get more familiar with OpenSCAD.

 

I’ve always been fascinated by 3D ambigrams, so I wanted to explore how they are made. I started with a single letter

letter1 = "S";
letter2 = "M";
size  = 40;
font = "Overpass Mono:style=Bold";

intersection() {
  //letter1
  linear_extrude(center = true)
          text(letter1, size = size, font = font, halign = "center", valign = "center");
  
  //letter2
  rotate([0, 90, 0])
      linear_extrude(center = true)
          text(letter2, size = size, font = font, halign = "center", valign = "center");
}

 

 

And gradually worked my way up to creating a simple word, such as:

string1 = "LOVE";
string2 = "HATE";
size  = 30;
font = "Overpass Mono:style=Bold";

rotate([90, 0, 0])
  for (i = [0 : min(len(string1), len(string2)) - 1])
      translate([i * size, 0, 0])
          intersection() {           
              // string1
              rotate([0, -45, 0])
                  linear_extrude(height = size, center = true)
                      text(string1[i], size = size, font = font, halign = "center", valign = "center");
              
              // string2
              rotate([0, 45, 0])
                  linear_extrude(height = size, center = true)
                      text(string2[i], size = size, font = font, halign = "center", valign = "center");
          }

 

 

Step by step I added more parameters, a base, and other refinements, while keeping it simple.

The full source code is included so everyone can experiment and generate their own custom models.

string1 = "LOVE";
string2 = "HATE";
angle = 45;
font = "Overpass Mono:style=Bold";
size  = 30;
spacing = 1.1;
baseThickness = 3;
baseRound = 20;

step = size * spacing;
nChars = min(len(string1), len(string2));
modelLength = (nChars - 1) * step + size;
baseR = min(baseRound, (size / 2) - 0.01);

module letterChar(char, tilt = [0, 0, 0]){
   upperChar = (ord(char) >= 97 && ord(char) <= 122) ? chr(ord(char) - 32) : char;
   rotate(tilt)
       linear_extrude(height = 2 * size, center = true)
           text(upperChar, size = size, font = font, halign = "center", valign = "baseline");
}

translate([-(nChars - 1) * step / 2, 0, baseThickness])
   rotate([90, 0, 0])
   for (i = [0 : nChars - 1])
       translate([i * step, 0, 0])
           intersection() {
               translate([-size/2, 0, -size/2])
                   cube(size);
               letterChar(string1[i], [0, -angle, 0]);
               letterChar(string2[i], [0,  angle, 0]);
           }

linear_extrude(height = baseThickness)
   offset(r = baseR)
       square([(modelLength + size / 2) - 2 * baseR, size - 2 * baseR], center = true);

 

Click che “Customize” button and generate your unique model:

 

Comment & Rating (3)

(0/1000)