• Advertisement
Sign in to follow this  

Flattening some polygons into an arbitrary plane

This topic is 1445 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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!

Share this post


Link to post
Share on other sites
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). 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Edited by uglybdavis

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement