• Advertisement
Sign in to follow this  

How can I make a quad based on a plane?

This topic is 4502 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

If I have a plane (a, b, c, d) how can I make a unit quad from it? I know, it’s probably very simple but some help would be wonderful :) From my limited math knowledge I think I’ll have to do two cross products to get the two axes that are in the plane. Then the vertices would be something like:
( axis_1 + axis_2, axis_1 – axis_2,  -axis_1 + axis_2, -axis_1 – axis_2 )
Then there is the distance. Maybe:
dist_vec = plane.normal * plane.d
quad( axis_1 + axis_2 + dist_vec, axis_1 – axis_2 + dist_vec,  -axis_1 + axis_2 + dist_vec, -axis_1 – axis_2 + dist_vec)
Is this even close?

Share this post


Link to post
Share on other sites
Advertisement
Looks like your on the right track. I'm going to assume that your planes normal is normalized. Also I'm doing this off the top of my head But it should be correct

Pick some unit vector that's not parallel to your planes normal (Which vector you choose will change the quads rotation). Then we find the axes with 2 cross products. So axis1 = crossp(plane.normal,someunitvector) and axis2=crossp(plane.normal,axis1). Now to find the vertices of the quad we'll start with a point on the plane, then add our axes to it to get the other vertices so

vertex1 = plane.normal * plane.d;
vertex2 = vertex1 + axis1;
vertex3 = vertex1 + axis2;
vertex4 = vertex2 + axis2; //you may need to renumber these

You can shift the quad by adding the axes. for instance to center the quad over the first point add (-0.5*axis1)+(-0.5*axis2) to vertex1 before calculating vertex2.

Share this post


Link to post
Share on other sites
Sweet, that worked great.

I chose to use either 0,1,0 or 0,0,1 as the non parallel vector.
I just check to see if 0,0,1 is equal to the plane normal and if it is I use 0,1,0 instead.

Is there a better way to pick the starting vector?

I'm thinking I could generalize this to "quad from point/normal" both of which I can get from a plane. Then I can use that shift to place the quad anywhere.

Share this post


Link to post
Share on other sites
Quote:
Is there a better way to pick the starting vector?
A method that works well is to use the world axis corresponding to the component of the reference vector with the smallest absolute value. So if the vector were (-5, 4, 1), you'd cross it with (0,0,1); if it were (-9, -4, 10), you'd cross it with (0,1,0); and so on. Obviously your reference vector is normalized so the values won't be integers like that, but you get the idea.

Share this post


Link to post
Share on other sites
Quote:
Original post by Nameles
Is there a better way to pick the starting vector?


Depends on what your doing, if you can be certain a certain vector wont be used then you could just use that one. You could also use what jyk suggested.But note with your current method, you need to be careful of a plane normal being nearly equal to 0,0,1 (rounding errors and all). So you'll either need to use an epsilon based check. Or use the dot product like.


if ( dot(plane.normal, vector3(0.0,0.0,1.0)) > 0.99) //I randomly picked .99 as a number close to but smaller than 1
someunitvector = vector3(0.0,1.0,0.0);
else
someunitvector = vector3(0.0,0.0,1.0);


Share this post


Link to post
Share on other sites
With the method jyk suguest, what do you do when you have something like (0,0,1).
Just arbitrarily pick between (1,0,0) and (0,1,0)?

Share this post


Link to post
Share on other sites
Pretty much. If the quad is centered then both will produce the same vertices (different order though).

Share this post


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

  • Advertisement