Texture coordinates are not so obvious to understand, especially because SketchUp gives us a third "Q" coordinate but it doesn't allow us to set the third coordinate (correct me if I'm wrong). The U and V coordinates alone didn't match to the start/end of the image. We then used to divide U/Q and V/Q and Q/Q=1 and got values that made sense.

However further calculations/transformations are difficult since a projected texture appears as a quadrilateral (which would need 4×4 matrix calculation) and it's hard to keep projectively distorted textures aligned if they where not projected from the same plane.

While a projectively distorted texture appears as a quadrilateral (unregular quad) on a face in model space, when we change into texture space it's all the opposite and the texture image is a square (for texturing it doesn't matter how many pixels wide/high an image actually is). In fact, texture coordinates with Q=1 are the projection of 3 dimensional texture coordinates into the plane of the face. And Q relates to the distance how far a texture coordinate is "behind" the face, in texture space.

Every quadrilateral can be seen as a projection of a perfect rectangle of some unknown rotation in 3d space. As long as we know the Q coordinate (= the distance how far a texture coordinate is in texture space), we do not necessarily need to calculate with quadrilaterals.

That gives us three conclusions:

- We have access to the projective distortion of a texture and can even calculate the transformation matrix (by using SketchUp's own Geom::Transformation with a 3×3 matrix, see here). This allows us even to find where features/pixels of a texture are in model space!
- To quickly find out whether a texture is projectively distorted (not whether it has the "projected" property set for copy-painting), we can check whether the Q coordinate is different from 1. SketchUp's TextureWriter then bakes the distortion into an image because other softwares would maybe only support UV without Q. All other sorts of skewing/scaling (=affine transformations) produce a Q=1 and export all fine as one image file.
- (As long as the Face.position_material method ignores the third value) Depending on the use case, we should only divide the U, V, Q values by Q at the very end before applying the texture to a face.