<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Recently Active Topics]]></title><description><![CDATA[A list of topics that have been active within the past 24 hours]]></description><link>https://openjscad.nodebb.com/recent</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 20:00:57 GMT</lastBuildDate><atom:link href="https://openjscad.nodebb.com/recent.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Jun 2026 01:06:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[JSCAD Release V3 Alpha : 2026 JUN 28]]></title><link>https://openjscad.nodebb.com/topic/455/jscad-release-v3-alpha-2026-jun-28</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/455/jscad-release-v3-alpha-2026-jun-28</guid><pubDate>Sun, 28 Jun 2026 01:06:44 GMT</pubDate></item><item><title><![CDATA[JSCAD Release V3 Alpha : 2026 MAY 16]]></title><link>https://openjscad.nodebb.com/topic/454/jscad-release-v3-alpha-2026-may-16</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/454/jscad-release-v3-alpha-2026-may-16</guid><pubDate>Sat, 16 May 2026 00:24:12 GMT</pubDate></item><item><title><![CDATA[vec3.angle(a,b)]]></title><description><![CDATA[@sopatt Sorry to the late reply.
You probably already know this but an ''orientation" is required to determine the rotation, and sign of the angle.
This is probably the best implementation out there. And if you want then this could be added to the vec3 functions.
https://stackoverflow.com/questions/5188561/signed-angle-between-two-3d-vectors-with-same-origin-within-the-same-plane
]]></description><link>https://openjscad.nodebb.com/topic/442/vec3-angle-a-b</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/442/vec3-angle-a-b</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Wed, 29 Apr 2026 00:08:29 GMT</pubDate></item><item><title><![CDATA[roadmap for v3]]></title><description><![CDATA[@Christopher-Fry OH! A V3 user! Awesome!
The modeling library is getting there, and pretty mulch complete, functional, and tested. We expect a few bugs, and a few more API improvements. But nothing radical.
Also. we are setting up a new website which will have a landing page, both V2 and V3 web UI applications, and more.
There's no plan yet for the BIG switch to V3. So, expect a few more V3 beta versions.
]]></description><link>https://openjscad.nodebb.com/topic/451/roadmap-for-v3</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/451/roadmap-for-v3</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sat, 25 Apr 2026 13:22:55 GMT</pubDate></item><item><title><![CDATA[How is the performance of JSCAD on mobile device]]></title><description><![CDATA[@BOYUAN-SHI Welcome
I have done some designs using my iPad, which was a little cramped for viewing. Technically, everything worked fine.
If you are working with a project with multiple files then probably a PC would be better. You can drag and drop the whole folder to the website. And change any file.
I think most people use a favorite editor to make changes, and drag and drop the file to the website. That works really well.
]]></description><link>https://openjscad.nodebb.com/topic/452/how-is-the-performance-of-jscad-on-mobile-device</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/452/how-is-the-performance-of-jscad-on-mobile-device</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sat, 25 Apr 2026 13:16:38 GMT</pubDate></item><item><title><![CDATA[JSCAD Release V3 Alpha : 2026 APR 11]]></title><link>https://openjscad.nodebb.com/topic/453/jscad-release-v3-alpha-2026-apr-11</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/453/jscad-release-v3-alpha-2026-apr-11</guid><pubDate>Sun, 12 Apr 2026 07:35:12 GMT</pubDate></item><item><title><![CDATA[3D Fractals]]></title><description><![CDATA[@z3dev
NICE!
]]></description><link>https://openjscad.nodebb.com/topic/441/3d-fractals</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/441/3d-fractals</guid><dc:creator><![CDATA[Christopher Fry]]></dc:creator><pubDate>Fri, 27 Feb 2026 00:28:37 GMT</pubDate></item><item><title><![CDATA[V2 Release : 2026 FEB 21]]></title><link>https://openjscad.nodebb.com/topic/450/v2-release-2026-feb-21</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/450/v2-release-2026-feb-21</guid><pubDate>Sun, 22 Feb 2026 01:18:56 GMT</pubDate></item><item><title><![CDATA[V2 Release : 2026 FEB 11]]></title><link>https://openjscad.nodebb.com/topic/449/v2-release-2026-feb-11</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/449/v2-release-2026-feb-11</guid><pubDate>Wed, 11 Feb 2026 07:22:02 GMT</pubDate></item><item><title><![CDATA[JSCAD Release V3 Alpha : 2026 JAN 18]]></title><link>https://openjscad.nodebb.com/topic/448/jscad-release-v3-alpha-2026-jan-18</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/448/jscad-release-v3-alpha-2026-jan-18</guid><pubDate>Mon, 19 Jan 2026 12:14:07 GMT</pubDate></item><item><title><![CDATA[applyTransforms]]></title><description><![CDATA[@z3dev if there is anything I can do to help, I'm willing.
I'm happy to share my code as well.
Here is PosableGeom3.js:
"use strict";
const jscad = require('@jscad/modeling');
const { Pose } = require('./Pose');
const { mat4, vec3, vec4 } = jscad.maths;
const { geom3 } = jscad.geometries;
const { PI } = Math;
// Base class for geom3 objects with named Poses
class PosableGeom3 {
  constructor(geometry, poses) {
    this._geometry = geometry || geom3.create();
    this._poses = {};
    if (poses) {
      Object.keys(poses).forEach(key =&gt; {
        this._poses[key] = poses[key].clone();
      });
    }
  }
  get polygons() { return this._geometry.polygons; }
  set polygons() { this._geometry.polygons = value; }
  get transforms() { return this._geometry.transforms; }
  set transforms(value) { this._geometry.transforms = value; }
  clone() {
    // Create a new geom3 with deep-copied polygons and transforms
    const clonedGeom = geom3.clone(this._geometry);
    // Clone the poses
    const clonedPoses = {};
    Object.keys(this._poses).forEach(key =&gt; {
      clonedPoses[key] = this._poses[key].clone();
    });
    // Create a new PosableGeom3 with the cloned geometry and poses
    return new PosableGeom3(clonedGeom, clonedPoses);
  }
  transform(matrix) {
    this._geometry = geom3.transform(matrix, this._geometry);
    Object.keys(this._poses).forEach(key =&gt; {
      this._poses[key].transform(matrix);
    });
    return this;
  }
  getPose(name) {
    return this._poses[name] || new Pose();
  }
	applyTransforms(){
		this._geometry = geom3.create(geom3.toPolygons(this._geometry));
		return this;
	}
  alignTo(port, targetPose) {
    const sourcePose = this.getPose(port);
    if (!sourcePose) {
      throw new Error(`Invalid port ${port}`);
    }
    if (!targetPose) {
      throw new Error(`Invalid targetPose`);
    }
    return this.transform(
      sourcePose.getMatrix(targetPose)
    );
  }
}
module.exports = { PosableGeom3 };

And here is Pose.js:
"use strict";
const jscad = require('@jscad/modeling');
const { vec3, vec4, mat4 } = jscad.maths;
const { geom3 } = jscad.geometries;
const { abs } = Math;
const { translate } = jscad.transforms;
const { union } = jscad.booleans;
const { cylinder, sphere, cylinderElliptic } = jscad.primitives;

const x = 0; const y = 1; const z = 2; const w = 3;

class Pose {
  constructor(point, heading, up) {
    // Default position to origin if not provided
    this._point = point ? vec3.clone(point) : vec3.create();
    // Default heading to Y+ (0, 1, 0) if not provided
    this._heading = vec3.normalize(
      vec3.create(), 
      heading ? vec3.clone(heading) : [0, 1, 0]
    );
    // Default up to Z+ (0, 0, 1) if not provided
    this._up = up ? vec3.clone(up) : [0, 0, 1];

    // Project up onto the plane perpendicular to heading
    const dot = vec3.dot(this._up, this._heading);
    const projectedUp = vec3.subtract(
      vec3.create(),
      this._up,
      vec3.scale(vec3.create(), this._heading, dot)
    );
    // Check if up is parallel to heading 
    // (length of projectedUp near zero)
    if (vec3.length(projectedUp) &lt; 0.00001) {
      // Choose a perpendicular vector based on heading
      if (abs(this._heading[z]) &lt; 0.99999) {
        this._up = vec3.cross(
          vec3.create(), this._heading, [0, 0, 1]
        );
      } else {
        this._up = vec3.cross(
          vec3.create(), this._heading, [1, 0, 0]
        );
      }
    } else {
      this._up = vec3.normalize(vec3.create(), projectedUp);
    }
    // Ensure up is normalized
    vec3.normalize(this._up, this._up);
  }
  get point() {
    return vec3.clone(this._point);
  }
  get heading() {
    return vec3.clone(this._heading);
  }
  get up() {
    return vec3.clone(this._up);
  }
  clone() {
    return new Pose(this._point, this._heading, this._up);
  }
  transform(matrix) {
    // Transform point (w = 1)
    let v = this._point.concat(1); // Convert vec3 to vec4
    v = vec4.transform(vec4.create(), v, matrix);
    this._point = vec3.clone(v); // Convert back to vec3

    // Transform heading (w = 0)
    v = this._heading.concat(0); // Convert vec3 to vec4
    v = vec4.transform(vec4.create(), v, matrix);
    this._heading = vec3.clone(v); // Convert back to vec3

    // Transform up (w = 0)
    v = this._up.concat(0); // Convert vec3 to vec4
    v = vec4.transform(vec4.create(), v, matrix);
    this._up = vec3.clone(v); // Convert back to vec3

    return this;
  }
	getMatrix(targetPose) {
		let t = mat4.create();

		// Step 1: Translate to origin
		t = mat4.multiply(
			mat4.create(),
			mat4.fromTranslation(mat4.create(), vec3.scale(vec3.create(), this._point, -1)),
			t
		);

		// Step 2: Align heading with targetPose
		t = mat4.multiply(
			mat4.create(),
			mat4.fromVectorRotation(mat4.create(), this._heading, targetPose._heading),
			t
		);

		// Step 3: Roll around heading to align up vector
		const p = this.clone().transform(t);
		const dot = vec3.dot(
			vec3.cross(vec3.create(), p._up, targetPose._up),
			p._heading
		);
		let angle = vec3.angle(p._up, targetPose._up);
		if (dot &lt; 0) angle = -angle;

		if (Math.abs(angle) &gt; 1e-6) {
			t = mat4.multiply(
				mat4.create(),
				mat4.fromRotation(mat4.create(), angle, targetPose._heading),
				t
			);
		}

		// Step 4: Translate to targetPose.point
		t = mat4.multiply(
			mat4.create(),
			mat4.fromTranslation(mat4.create(), targetPose._point),
			t
		);

		return t;
	}
  render() {
    const vecGeom = (vector) =&gt; {
      const vectorLength = vec3.length(vector) || 1;;
      const vectorRadius = vectorLength / 10;
      const arrowLength = vectorLength / 5;
      const arrowRadius = vectorLength / 5;
      let out = union(
        cylinder({ // arrow body
          center: [0, 0, vectorLength / 2],
          height: vectorLength,
          radius: vectorRadius
        }),
        cylinderElliptic({ // arrow head
          center: [0, 0, vectorLength],
          startRadius: [arrowRadius, arrowRadius],
          endRadius: [0, 0],
          height: arrowLength
        })
      );
      out = geom3.transform(
        mat4.fromVectorRotation(
          mat4.create(),
          [0, 0, vectorLength],
          vector
        ),
        out
      );
      return out;
    };

    let g = translate(
      this._point,
      union(
        sphere({ radius: 0.2 }),
        vecGeom(this._heading),
        vecGeom(this._up)
      )
    );
    return g;
  }
  roll(angle) {
    if (angle === 0) return this;
    // Create a rotation matrix around the heading vector
    const rotationMatrix = mat4.create();
    mat4.rotate(
      rotationMatrix, rotationMatrix, angle, this._heading
    );
    // Transform the up vector using the rotation matrix (w = 0)
    const transformedUp = vec4.transform(
      vec4.create(), this._up.concat(0), rotationMatrix
    );
    this._up = vec3.clone(transformedUp);

    return this;
  }
  translate(vector) {
    this._point = vec3.add(
      vec3.create(),
      vector,
      this._point
    );
  }
}

module.exports = { Pose }; // end of file

]]></description><link>https://openjscad.nodebb.com/topic/445/applytransforms</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/445/applytransforms</guid><dc:creator><![CDATA[sopatt]]></dc:creator><pubDate>Fri, 17 Oct 2025 19:24:39 GMT</pubDate></item><item><title><![CDATA[OpenSource Autocad web based funcionalities]]></title><description><![CDATA[@patilanz Welcome,
Sorry, I didn't see this before.
DXF web editor. DXF is just a file format created by Autocad long long ago. There are many online websites that can read as well as create DXF files, including JSCAD.
Does that help?
]]></description><link>https://openjscad.nodebb.com/topic/443/opensource-autocad-web-based-funcionalities</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/443/opensource-autocad-web-based-funcionalities</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sat, 20 Sep 2025 10:57:04 GMT</pubDate></item><item><title><![CDATA[Excessively elaborate eggs etc]]></title><description><![CDATA[The booleans are working fine but the orientation of the polygons are super important. You can check the orientation your self, but one of the easiest checks if volume().
Hope that helps
]]></description><link>https://openjscad.nodebb.com/topic/444/excessively-elaborate-eggs-etc</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/444/excessively-elaborate-eggs-etc</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sat, 20 Sep 2025 10:52:25 GMT</pubDate></item><item><title><![CDATA[How to render&#x2F;preload an existing js file]]></title><description><![CDATA[@Mayank-Dogra Welcome!
There's a really simple demo in the regl-render folder. Take a look at that for an example.
]]></description><link>https://openjscad.nodebb.com/topic/446/how-to-render-preload-an-existing-js-file</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/446/how-to-render-preload-an-existing-js-file</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sat, 20 Sep 2025 10:42:05 GMT</pubDate></item><item><title><![CDATA[Release : 2025 SEP 20]]></title><link>https://openjscad.nodebb.com/topic/447/release-2025-sep-20</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/447/release-2025-sep-20</guid><pubDate>Sat, 20 Sep 2025 04:35:45 GMT</pubDate></item><item><title><![CDATA[JSCAD TEXT and Object API Add-on]]></title><link>https://openjscad.nodebb.com/topic/440/jscad-text-and-object-api-add-on</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/440/jscad-text-and-object-api-add-on</guid><pubDate>Sun, 25 May 2025 01:02:41 GMT</pubDate></item><item><title><![CDATA[Old version of rollup]]></title><description><![CDATA[@hpb-htw Super! You understand well.
Each package will have a slightly different version, as Lerna determines major/minor/fix versions by changes. The main package is never released so, the version stays the same, but should be 3.0.0.
Please take another look at utils/regl-renderer package. The demo html files are slightly different in V3.
]]></description><link>https://openjscad.nodebb.com/topic/439/old-version-of-rollup</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/439/old-version-of-rollup</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sun, 23 Feb 2025 22:09:27 GMT</pubDate></item><item><title><![CDATA[Using JScad just to display 3D-Object]]></title><description><![CDATA[@hpb-htw Nice! You might be the first person using V3.
So, V3 is currently in Alpha release. Or course, V3 is in the same GIT repository but on the V3 branch. So, you can get all the packages by checking out the branch.
git checkout V3
Again, take a look at the demos in regl-rendering
]]></description><link>https://openjscad.nodebb.com/topic/438/using-jscad-just-to-display-3d-object</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/438/using-jscad-just-to-display-3d-object</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Fri, 14 Feb 2025 22:58:56 GMT</pubDate></item><item><title><![CDATA[Modifying Variables From Imported Parametric model]]></title><description><![CDATA[@shay-cerny Welcome
This isn't exhaustive but lists some of the websites using JSCAD.
https://openjscad.xyz/dokuwiki/doku.php?id=en:user_guide_help
]]></description><link>https://openjscad.nodebb.com/topic/437/modifying-variables-from-imported-parametric-model</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/437/modifying-variables-from-imported-parametric-model</guid><dc:creator><![CDATA[z3dev]]></dc:creator><pubDate>Sun, 05 Jan 2025 08:29:12 GMT</pubDate></item><item><title><![CDATA[Release V3 Alpha : 2025 JAN 05]]></title><link>https://openjscad.nodebb.com/topic/436/release-v3-alpha-2025-jan-05</link><guid isPermaLink="true">https://openjscad.nodebb.com/topic/436/release-v3-alpha-2025-jan-05</guid><pubDate>Fri, 03 Jan 2025 02:19:44 GMT</pubDate></item></channel></rss>