V-Ray Physical Camera focal length doesn't match FOV?

Ran into something weird trying a 3ds Max → Postshot pipeline for Gaussian Splatting and wanted to check if anyone has an explanation.
this is the pipeline I was testing:

Setup is a V-Ray Physical Camera with FOV 90° and Film Gate 36mm, rendering at 2048×2048. The modifier panel shows focal length = 17.867 mm, and cam.focal_length returns the same. But the math for FOV 90° on a 36mm gate is:

f = 36 / (2 × tan(45°)) = 18.0 mm

So 0.13mm off, which sounds like nothing, but it’s about 0.43° of FOV and that was enough to cause clearly visible depth ghosting in the trained splat (foreground sharp, anything further away doubled/tripled). Patching the focal length to 18.0 in the CSV Postshot reads fixed it completely.

API side everything looks consistent: cam.fov = 90.0, cam.film_width = 36.0, cam.specify_fov = true. So I’m not sure where the 17.867 is coming from.

Anyone know if there’s some internal sensor/aperture model I’m missing, or is this just a display bug?

Based on what I researched, that formula assumes the camera is focused on infinity. In other words, the focus distance parameter also comes into play, and the slight difference comes from it (see lens breathing).

Disable the “Targeted” option of your VRayCamera and set the value to something huge, and you’ll see that the result will be 18mm.