Flattening some polygons into an arbitrary plane

Started by
4 comments, last by Jihodg 10 years, 2 months ago

Hi all,

For a visual effect, I want to flatten the XYZ coordinates of an arbitrary triangle into a 2D plane where I can then convert those to UV coordinates while maintaining a specific size/aspect ratio for the triangle.

So for instance, I have a triangle in an arbitrary plane, but I want to convert it so that it rests in plane z=0 while maintaining the dimensions of the polygon.

Is there a quick and easy way to do this? I can think of all kinds of weird methods, like picking one point on the triangle and then using distance between the points to extrapolate the same triangle with z=0, but if there's a smarter way to do it, I'd like to know!

Thanks!

Advertisement

There is no correct solution to the problem you gave us. The triangle can be anywhere in the new plane. You may for example choose one of the sides and align it with the "u=0 axis" of your plane (with one the vertices mapped to the origin).

Pick an orthonormal frame of reference in the plane where the polygon is contained. Then pick an orthonormal plane of reference in the target plane. Express each point of the polygon in the first frame of reference and plug in those same coordinates in the second frame of reference to get the transformed point.

struct Plane {

vec3 normal;

float distance;

Plane(const vec3& point, const vec3& norm) {

normal = normalize(norm);

distance = -dot(normal, point);

}

vec3 ProjectPoint(const vec3& point) {

vec3 pointOnPlane = (-normal) * distance;

float dist = dot(normal, point - pointOnPlane);

return point - dist * normal;

}

};

The constructor takes any point on the plane, and a normal.

The ProjectPoint function takes any arbitrary 3D point and returns that point projected onto the plane.

Hey uglybdavis, that's a good start to what I need!

My question would be how to involve the second plane.

For instance, I have plane1, which is the plane of the existing triangle, and the 3 points of the triangle...

...Then I have plane2, which is the plane I want the triangle rotated into (remember, I want to retain the shape of the triangle).

How would you go about converting those points from plane 1 to plane 2? Pseudocode would be most welcome!

If it is just one triangle you can simply rotate the triangle by the angle difference between the triangle plane normal and the normal of the target plane, and translate/scale if necessary... but for complex meshes there is no quick and simple way of doing an efficient uv unwrapping, except for very specific cases... maybe you could look at something like this:

http://alice.loria.fr/publications/papers/2002/lscm/lscm.pdf

This topic is closed to new replies.

Advertisement