Jump to content

  • Log In with Google      Sign In   
  • Create Account

Flattening some polygons into an arbitrary plane


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 Raptisoft   Members   -  Reputation: 171

Like
0Likes
Like

Posted 05 February 2014 - 07:56 AM

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!



Sponsor:

#2 apatriarca   Crossbones+   -  Reputation: 1772

Like
0Likes
Like

Posted 05 February 2014 - 10:06 AM

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). 



#3 Álvaro   Crossbones+   -  Reputation: 13901

Like
0Likes
Like

Posted 05 February 2014 - 10:21 AM

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.



#4 uglybdavis   Members   -  Reputation: 959

Like
2Likes
Like

Posted 05 February 2014 - 11:06 AM

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, 05 February 2014 - 11:08 AM.


#5 Raptisoft   Members   -  Reputation: 171

Like
0Likes
Like

Posted 05 February 2014 - 11:14 AM

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!



#6 Jihodg   Members   -  Reputation: 539

Like
0Likes
Like

Posted 05 February 2014 - 10:27 PM

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






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS