# Align in 3D

If you need to align two planes, you can obtain the transformation needed (which in general is a roto-translation) using:

``````Align3D(Point3D p1A, Point3D p1B, Point3D p2A, Point3D p2B, Point3D p3A, Point3D p3B)
Align3D(Plane originalFrame, Plane destinationFrame)``````

or

``Rotation(Plane plane0, Plane plane1)``

This allows for instance to superimpose two faces of two meshes like in the following example:

The code to reproduce this example is reported below.

In the first part we create two meshes:

``````// FIRST MESH
Mesh mesh1 = Mesh.CreateBox(5, 4, 7);

// SECOND MESH
Mesh mesh2 = Mesh.CreateBox(4, 3, 2);

// we transform mesh2 and move it away from mesh1
mesh2.Rotate(.1, Vector3D.AxisX);
mesh2.Rotate(.5, Vector3D.AxisY);
mesh2.Rotate(1, Vector3D.AxisZ);
mesh2.Translate(new Vector3D(4, 3, 12));
``````

Then we define a transformation that aligns the lower face of mesh2 with the upper face of mesh1.

This can be done in three different ways:

• Using Align3D and the vertices
``````Transformation rotoTranslation = new Align3D(mesh2.Vertices[0], mesh1.Vertices[4],
mesh2.Vertices[1], mesh1.Vertices[5],
mesh2.Vertices[3], mesh1.Vertices[7]);
``````
• Using Align3D and the planes
``````// plane of the upper face of mesh1
Plane plane1 = new Plane(mesh1.Vertices[4], mesh1.Vertices[5], mesh1.Vertices[7]);
// plane of the lower face of mesh2
Plane plane2 = new Plane(mesh2.Vertices[0], mesh2.Vertices[1], mesh2.Vertices[3]);

Transformation rotoTranslation = new Align3D(plane2, plane1);
``````
• Or using Rotation and the planes
``````// plane of the upper face of mesh1
Plane plane1 = new Plane(mesh1.Vertices[4], mesh1.Vertices[5], mesh1.Vertices[7]);
// plane of the lower face of mesh2
Plane plane2 = new Plane(mesh2.Vertices[0], mesh2.Vertices[1], mesh2.Vertices[3]);

Transformation rotoTranslation = new Transformation();
rotoTranslation.Rotation(plane2, plane1);
``````

And finally we apply the transformation to mesh2:

``````mesh2.TransformBy(rotoTranslation);