[Plugin] Perpendicular Face Tools (UPDATED 26-03-09)
-
You compete for the "A day, a Plug" ?
Amazing one
Waiting updatesPs What append when your list of Sub menu plugins will be more big than the screen?
Does exist scroll for this state?
My little scrolling black triangles are come back! (for the normal Plugins menu)
so no limitation of numerous plugins! -
Very good implementation.
To get the face to 'orient' consistently the following could be considered...
Circle - not so important to get 'square', but if it has few segments it'd be best if a vertex were at the lowest point in Z ? If face is 'flat' in Z then make vertex minimal in Y. It's relatively easy to find locations of all of circle's vertices and pick one and rotate (transform) the circle face about its centre axis so its Z (or Y) is minimal OR make the edge 'horizontal' - both vertices have same Z (or Y).
Square - it's best to make one edge 'horizontal' so both of its vertices [start & end points] have same Z. If it's 'flat' in Z then make an edge's vertices equal in their Y. Followme can still skew the square along 3D paths but at least it'll start right.
Custom-face - if the custom-face is originally drawn 'flat' you can find its rotation around the Z axis - pick any edge and get its vertices' angle relative to say X axis. Then apply the equivalent rotation transformation to the line-end-aligned copy. That way you can determine the starting rotation of the face by rotating the original before using your tool - that would also let you have a rotated square 9diamond) as the custom-face if desired...
You currently take 'sp1' as the center of the face's bounding-box - which is the easiest, and probably the best way - having selectable 'sp1' on the original seems too awkward. You can always move the grouped face when it's perpendicular to the selected path end; you can also rotate it later too, before the Followme is done...
.
-
Chris
Just plain thank you.
dte
-
Nice, thanks.
-
Hey thanks everyone! I'm glad you like it.
@Tig, I would love to implement all of that. I just need to make sure I understand it I think I can figure out how to make the circle work out so its lowest z is always a vertex. For the square, my code draws it always flat on the YZ axis and then rotates it once to be perpendicular. Would I just set another rotation transformation to then level the botom edge and top edge to be horizontal? Or does that have to be built into the original transformation? I could probably pull it off as a second transformation, but I am not sure how to make it be part of the first. I'll have to make a SketchUp model of how that should work. And the custom face I think I see what you mean to get orientation first, then use that after it is placed to re-orient it so that the x axis on the original is horizontal in the copy. Again, I think I can do that, assuming I can apply two rotation transformations to a group.
All right, no promises, but I will try to take on these changes and see if I can get a more predictable orientation system working. If its easy, it shouldn't take more than a day or two. If it gives me fits, then.......If you hven't noticed, moving,rotating, scaling are not my forte. They require some serious math thinking that I am not trained in. But I am trained in 3d. So as long as I can visualize it, I hopefully can figure out how to implment it. Thanks for the GREAT suggestions Tig!,
Chris
-
Rotate it after it's placed onto the vertex. You know the rotation axis as it's the line you are perpendicualr to...
.
-
Brilliant!
-
Chris,
A big thank you again for your generosity. Nice work!
Ben
-
Thanks guys. Tig, that makes sense. For some reason I was imaging a transformation as something that erases previous transformations effects once applied. So apply one transformation and it does that. Apply another and it jumps back to the original state before the first transformation and then applies the new transformation. I see now that its not like that (thank goodness). Seems silly I was confused since on hte custom face part I apply a translation first and then a rotation. I should have realized that transformations do not erase the effects of the previous transformation. So yes, I like the methods you describe to always have an edge horizontal. That seems quite logical.
Would there be a demand to have the custom face option accept more than one face? I know some of my profiles I use often include 3 or different faces that I want to use. So perhaps I'll try and make it accept multiple faces as long as they are co-planar.
Also I need to make it work when clicking on an edge, not just an end point. Some instances, like when the path makes a completed loop like a circle, there are no endpoints to use. So I'll get that into my next update. Maybe a toolbar too. I think I've got some extra time today during class
Chris
-
awsome chris!! a time saver, the essence of ruby ... now try some UV mapping scripts .... my biggest current peeve in SU (there are so many)
-
MALAISE
-
seems somebody understands! great tool and more as I expected
-
ok, I'm struggling to get the rotations to work. I'm working on the square first. I can get it to rotate nicely around the z-axis. But I have not figured out a way to determine exactly how much to rotate it to get it where I want. I think this is just my lack of general mathematical knowledge. So can anyone offer some help with this? The image shows a mock-up of the problem. The square is what I am rotating on the labeled centerpoint. Chord AB needs to align with chord CD. But chord AB is not supplied. It is the vector made of 2 points where the y values are equal and its length is equal to AB.
I'm sure that explanation makes no sense. Hopefully someone out there can read between the lines and figure out what I'm actually asking. Thanks,
Chris
-
could you not just align one of the sides to vertical (z)?
-
No, it doesn't show it well, but the sides are often not vertical. The alignment needs to make the top and bottom lie on planes that are "flat", but the sides are not necessarily vertical.
-
Thank you Chris A very useful script, am using it right now
-
Thanks Chris.
-
Chris,
Thanks for the usefull ruby !
erikB -
Your response hasn't gone un-noticed Tig. I thank you immensely for it. I'm still working on implementing it I think there is a small flaw in that I don't point C either. I think I know how to get it, so thats good. In fact, it is essentially what you provided with the "cosine rule". Thanks for that! That is currently what I'm working at. I had one method, but it was rather convoluted and started to fall apart for some reason, so I think it must not have been sound. This new method feels much more mathematically correct. I'll let you know how it goes. Hopefully within a few hours. Thanks sooo much for your help and ideas,
Chris
-
To rotate the square you have more than enough info. You don't actually need point-D.
You want to rotate it about the centre-point [let's call it point-O] - so you know that too.
You know point-A and point-C as you have them initially or have just calculated them already.
Now find the angle between the two vectors O->A and O->C.***
Select all of the square's edges (face will go with them?) and make a rotation-transformation about point-O by that angle: using the normal to the square's face as the axis of rotation...Points A and C, and points B and D will then be coincident...
"new vector"
v = [x,y,z]
vector1 = Geom::Vector3d.new(v)Where v [x,y,z] is obtained from the sum of the two points v = (pointO - pointA) etc
you might also want to ".normalize" the vector(s)...
Find vector2 (O->C) the same way...
"angle_between vectors"
The angle_between method is used to compute the angle (in radians) between this vector and another vector.
Syntax
angle = vector1.angle_between(vector2)
Arguments
vector2 - a Vector3d object
Return Value
angle - an angle (in radians)
Example
vector1 = Geom::Vector3d.new(x,y,z)
vector2 = Geom::Vector3d.new(xx,yy,zz)angle = vector1.angle_between(vector2)
###########
A bit more complicated to my mind is doing it with the 'cosine rule',
here it is though - you can easily find the length 'AC'
you have the other two points and can use 'AC = pointA.distance(pointC)' method for that.
You also know the circle's Radius - or can easily get it from the square's side dim.
Angle = Math::acos((RadiusRadius + RadiusRadius - ACAC) / (2Radius))
Note: if Angle > 90 degrees (pi/2) then it's negative...
.
Advertisement