1 update that could get you closer to the desire outcome is to set the size of the canvas like such:
canvas.width = size;
canvas.height = size;
Otherwize (most of the time), the default canvas size default to 300 and the height attribute defaults to 150, which is not power of 2s. (that is, 1, 2, 4, 8, 16, etc).
if it still cause a problem, you could use the intersected face center instead of the intersected point. Or you could also use the mouse.xy coordinate with a constant z distance based on either the camera or the object positions or both.
Hope this will help you move forward...