The three you'll actually meet
Point clouds power 3D scanning, photogrammetry, robotics, and laser engraving, and the format you store them in shapes everything that follows: which software opens the file, how big it is on disk, how fast it parses, and what metadata it can carry. Most workflows live in three formats, PLY, PCD, and XYZ, and each one is good at something specific.
PLY is the universal interchange format. PCD is the native format of the Point Cloud Library. XYZ is the lowest-common-denominator text format. Choosing between them is mostly about which downstream tool you are feeding.
PLY: the flexible default
PLY (the Polygon File Format, also called the Stanford Triangle Format) was developed at Stanford and has become the most widely supported point cloud format outside the PCL ecosystem. It can store points or meshes in the same container, supports ASCII and binary encoding (little-endian and big-endian), and has an unusually flexible property system: you can attach any per-point or per-face data you like through the file header. Standard properties cover x/y/z, RGB colour, surface normals, confidence, and intensity.
Its strengths are flexibility and reach. MeshLab, CloudCompare, Blender, Open3D, and almost every photogrammetry pipeline read PLY natively, and the binary mode keeps file sizes reasonable. Its weaknesses are the absence of built-in compression and a header schema flexible enough to be inconsistent across producers, so sometimes you need to inspect the header to know what is actually in a given file.
For photogrammetry output, archival, and any pipeline that crosses tool boundaries, PLY is the right default. It is also what LaserTools exports for crystal engraving and most other 3D workflows: Crystal Studio writes a dense PLY point cloud straight from your scene for subsurface laser engraving.
PCD: the PCL native
PCD (Point Cloud Data) is the native format of the Point Cloud Library, the most widely used open-source library for point cloud processing. Its header declares fixed fields per file (x, y, z, rgb packed as a single float, normals, intensity) plus a viewpoint describing where the sensor was when the cloud was captured. PCD supports ASCII, binary, and binary-compressed encodings, and the compressed binary mode is genuinely compact and reads quickly.
If you are already inside PCL, whether for robotics work, LiDAR processing, or algorithm development, PCD is the right format because everything downstream expects it. Outside PCL, support thins out quickly. MeshLab, for instance, does not read PCD natively. Two oddities to remember: RGB is stored as a packed float (fast but quirky), and PCD carries only points, not mesh data.
XYZ: text and nothing else
XYZ is the simplest format possible. One point per line, space-separated, with no header (or just optional comment lines starting with #). Most variants are x y z; some include r g b or extra properties. It is always ASCII and parseable in any language without a library.
Its appeal is universality. Anything can read it, anything can write it, and you can open it in a text editor and inspect the values directly. The cost is everything else: no compression (XYZ files for million-point clouds get huge), no metadata, no normals, and no consistent way to declare units or coordinate system. It is the right pick for quick data exchange, scripting, prototyping, and small datasets, and a poor pick for anything you need to keep around or ship at scale.
File sizes and converting between them
For a million-point cloud, expect roughly 8 MB compressed PCD, 16 MB binary PLY, and 30 MB XYZ. ASCII PLY sits between binary PLY and XYZ. Compressed PCD is the smallest by a clear margin, and XYZ is the largest by a wide one.
Conversion is straightforward. The LaserTools converters handle PLY and PCD in the browser with no signup and no upload, so files stay on your machine. CloudCompare opens all three formats and exports to any of them, with batch processing for whole directories. The Python Open3D library does the same thing programmatically with o3d.io.read_point_cloud() and o3d.io.write_point_cloud(). PCL ships its own command-line converters (pcl_converter, pcl_ply2pcd) for projects already in that toolchain.