How to convert a 3D point on a plane to UV coordinates?

tigrou picture tigrou · Sep 6, 2013 · Viewed 7.8k times · Source

I have a 3d point, defined by [x0, y0, z0].

This point belongs to a plane, defined by [a, b, c, d].

normal = [a, b, c], and ax + by + cz + d = 0

How can convert or map the 3d point to a pair of (u,v) coordinates ?

This must be something really simple, but I can't figure it out.

Answer

sbabbi picture sbabbi · Sep 6, 2013

First of all, you need to compute your u and v vectors. u and v shall be orthogonal to the normal of your plane, and orthogonal to each other. There is no unique way to define them, but a convenient and fast way may be something like this:

n = [a, b, c] 
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c.
v  = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it.

Now a simple dot product will do:

u_coord = dot(u,[x0 y0 z0])
v_coord = dot(v,[x0 y0 z0])

Notice that this assumes that the origin of the u-v coordinates is the world origin (0,0,0).

This will work even if your vector [x0 y0 z0] does not lie exactly on the plane. If that is the case, it will just project it to the plane.