The CSG.Connector class is intended to facilitate attaching two solids to each other at a predetermined location and orientation. For example suppose we have a CSG solid depicting a servo motor and a solid of a servo arm: by defining a Connector property for each of them, we can easily attach the servo arm to the servo motor at the correct position (i.e. the motor shaft) and orientation (i.e. arm perpendicular to the shaft) even if we don't know their current position and orientation in 3D space.
In other words Connector give us the freedom to rotate and translate objects at will without the need to keep track of their positions and boundaries. And if a third party library exposes connectors for its solids, the user of the library does not have to know the actual dimensions or shapes, only the names of the connector properties.
A CSG.Connector consist of 3 properties:
When connecting two connectors, the solid is transformed such that the <b>point</b> properties will be identical, the <b>axis</b> properties will have the same direction (or opposite direction if mirror == true), and the <b>normal</b>s match as much as possible.
Connectors can be connected by means of two methods:
A CSG solid's connectTo()
function transforms a solid such that two connectors become connected.
Alternatively we can use a connector's getTransformationTo()
method to obtain a transformation matrix which would connect the connectors. This can be used if we need to apply the same transform to multiple solids.
var cube1 = CSG.cube({radius: 10}); var cube2 = CSG.cube({radius: 4}); // define a connector on the center of one face of cube1 // The connector's axis points outwards and its normal points // towards the positive z axis: cube1.properties.myConnector = new CSG.Connector([10, 0, 0], [1, 0, 0], [0, 0, 1]); // define a similar connector for cube 2: cube2.properties.myConnector = new CSG.Connector([0, -4, 0], [0, -1, 0], [0, 0, 1]); // do some random transformations on cube 1: cube1 = cube1.rotateX(30); cube1 = cube1.translate([3.1, 2, 0]); // Now attach cube2 to cube 1: cube2 = cube2.connectTo( cube2.properties.myConnector, cube1.properties.myConnector, true, // mirror 0 // normalrotation ); // Or alternatively: var matrix = cube2.properties.myConnector.getTransformationTo( cube1.properties.myConnector, true, // mirror 0 // normalrotation ); cube2 = cube2.transform(matrix); var result = cube2.union(cube1);