diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7aa641ca6cd71ee11a3187b63a8fdd1364fb89e7..a518560fde128d7795a404d29834bbf86bfa018a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ Note that since we don't clearly distinguish between a public and private interf
 
 ## [Unreleased]
 
+- Enable odd dash count (1,3,5)
+
 ## [v3.33.0] - 2023-04-02
 
 - Handle resizes of viewer element even when window remains the same size
diff --git a/src/mol-geo/geometry/cylinders/cylinders-builder.ts b/src/mol-geo/geometry/cylinders/cylinders-builder.ts
index aa28124cf5da42846404e3ffcc63bf5a568d4b3c..9f0e7f589aa45a0031d2b545a4b1f5d92fa0a745 100644
--- a/src/mol-geo/geometry/cylinders/cylinders-builder.ts
+++ b/src/mol-geo/geometry/cylinders/cylinders-builder.ts
@@ -45,24 +45,21 @@ export namespace CylindersBuilder {
         const addFixedCountDashes = (start: Vec3, end: Vec3, segmentCount: number, radiusScale: number, topCap: boolean, bottomCap: boolean, stubCap: boolean, group: number) => {
             const d = Vec3.distance(start, end);
             const isOdd = segmentCount % 2 !== 0;
-            segmentCount++;
-            const s = Math.floor(segmentCount / 2);
-            const step = 1 / segmentCount;
-            const offset = step / 2;
+            const s = Math.floor((segmentCount + 1) / 2);
+            const step = d / (segmentCount + 0.5);
 
-            Vec3.sub(tmpDir, end, start);
+            Vec3.setMagnitude(tmpDir, Vec3.sub(tmpDir, end, start), step);
+            Vec3.copy(tmpVecA, start);
             for (let j = 0; j < s; ++j) {
-                const f = step * (j * 2 + 1) + offset;
-                Vec3.setMagnitude(tmpDir, tmpDir, d * f);
-                Vec3.add(tmpVecA, start, tmpDir);
+                Vec3.add(tmpVecA, tmpVecA, tmpDir);
                 if (isOdd && j === s - 1) {
                     Vec3.copy(tmpVecB, end);
                     if (!stubCap) bottomCap = false;
                 } else {
-                    Vec3.setMagnitude(tmpDir, tmpDir, d * (step * ((j + 1) * 2) + offset));
-                    Vec3.add(tmpVecB, start, tmpDir);
+                    Vec3.add(tmpVecB, tmpVecA, tmpDir);
                 }
                 add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], radiusScale, topCap, bottomCap, group);
+                Vec3.add(tmpVecA, tmpVecA, tmpDir);
             }
         };
 
diff --git a/src/mol-geo/geometry/lines/lines-builder.ts b/src/mol-geo/geometry/lines/lines-builder.ts
index d8d512dd643d4410ee290dbf5de72dec3e32dd66..2d36442b6da9122afed2d82b95b919573a558273 100644
--- a/src/mol-geo/geometry/lines/lines-builder.ts
+++ b/src/mol-geo/geometry/lines/lines-builder.ts
@@ -52,23 +52,20 @@ export namespace LinesBuilder {
         const addFixedCountDashes = (start: Vec3, end: Vec3, segmentCount: number, group: number) => {
             const d = Vec3.distance(start, end);
             const isOdd = segmentCount % 2 !== 0;
-            segmentCount++;
-            const s = Math.floor(segmentCount / 2);
-            const step = 1 / segmentCount;
-            const offset = step / 2;
+            const s = Math.floor((segmentCount + 1) / 2);
+            const step = d / (segmentCount + 0.5);
 
-            Vec3.sub(tmpDir, end, start);
+            Vec3.setMagnitude(tmpDir, Vec3.sub(tmpDir, end, start), step);
+            Vec3.copy(tmpVecA, start);
             for (let j = 0; j < s; ++j) {
-                const f = step * (j * 2 + 1) + offset;
-                Vec3.setMagnitude(tmpDir, tmpDir, d * f);
-                Vec3.add(tmpVecA, start, tmpDir);
+                Vec3.add(tmpVecA, tmpVecA, tmpDir);
                 if (isOdd && j === s - 1) {
                     Vec3.copy(tmpVecB, end);
                 } else {
-                    Vec3.setMagnitude(tmpDir, tmpDir, d * step * ((j + 1) * 2) + offset);
-                    Vec3.add(tmpVecB, start, tmpDir);
+                    Vec3.add(tmpVecB, tmpVecA, tmpDir);
                 }
                 add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], group);
+                Vec3.add(tmpVecA, tmpVecA, tmpDir);
             }
         };
 
diff --git a/src/mol-geo/geometry/mesh/builder/cylinder.ts b/src/mol-geo/geometry/mesh/builder/cylinder.ts
index d432a13a405eff46f9fa3defb9361da152cd8905..76ad187f767e5823366d42d01bde3d3e315fdf73 100644
--- a/src/mol-geo/geometry/mesh/builder/cylinder.ts
+++ b/src/mol-geo/geometry/mesh/builder/cylinder.ts
@@ -101,28 +101,24 @@ export function addDoubleCylinder(state: MeshBuilder.State, start: Vec3, end: Ve
 export function addFixedCountDashedCylinder(state: MeshBuilder.State, start: Vec3, end: Vec3, lengthScale: number, segmentCount: number, stubCap: boolean, props: BasicCylinderProps) {
     const d = Vec3.distance(start, end) * lengthScale;
     const isOdd = segmentCount % 2 !== 0;
-    segmentCount++;
-    const s = Math.floor(segmentCount / 2);
-    const step = 1 / segmentCount;
-    const offset = step / 2;
+    const s = Math.floor((segmentCount + 1) / 2);
+    let step = d / (segmentCount + 0.5);
 
     let cylinder = getCylinder(props);
-    Vec3.sub(tmpCylinderDir, end, start);
-
+    Vec3.setMagnitude(tmpCylinderDir, Vec3.sub(tmpCylinderDir, end, start), step);
+    Vec3.copy(tmpCylinderStart, start);
     for (let j = 0; j < s; ++j) {
-        const f = step * (j * 2 + 1) + offset;
-        let len = d * step;
-        Vec3.setMagnitude(tmpCylinderDir, tmpCylinderDir, d * f);
-        Vec3.add(tmpCylinderStart, start, tmpCylinderDir);
-
+        Vec3.add(tmpCylinderStart, tmpCylinderStart, tmpCylinderDir);
         if (isOdd && j === s - 1) {
             if (!stubCap && props.topCap) {
                 props.topCap = false;
                 cylinder = getCylinder(props);
             }
-            len /= 2;
+            step /= 2;
         }
-        setCylinderMat(tmpCylinderMat, tmpCylinderStart, tmpCylinderDir, len, false);
+        setCylinderMat(tmpCylinderMat, tmpCylinderStart, tmpCylinderDir, step, false);
         MeshBuilder.addPrimitive(state, tmpCylinderMat, cylinder);
+
+        Vec3.add(tmpCylinderStart, tmpCylinderStart, tmpCylinderDir);
     }
 }