Geometry, Transformation, and Scaling
-
Hello, during experimenting with transformation and scaling, I've got a bit stucked. I plan and planned to create a spring that would scale itself from point1 to point2. Some visual index should explain;
I want to know how to calculate pink solid new transformation, knowing current position of all 4 points, and transformation of pinksolid. -
You know where
p1
andp2
are in 3d space.
So getting the distance between them is straightforward
dist=p1.distance(p2)
You need to know the original size of the 'box' spring - easiest if you make it a 1" cube!
Otherwise adjust dist=dist/boxz ...
So you can make a scaling transformation using x=1, y=1 and z=dist
So far so good.
The box is now the right height but not yet rotated.
Make a reference plane based on p1.
planex=[p1, Y_AXIS]
We'll use this to project p2 so we get a 'flat' angle.
p2px=p2.project.to_plane(planex)
get the angle between the model axis and the vector from p1 to the projected point...
angx=X_AXIS.angle_between(p1.vector_to(p2px))
If there's a chance that p2 is below p1 test for that [compare their .z] and then make the 'angle' negative to suit [you can also do it by doing a .cross on the two vectors and checking the resultant vector's x/y/z values]
So now we have the angle needed in a rotation transformation [tr
] about p1 and the X_AXIS.
Apply that to the 'box'.
The box is still not aligned [unless p1 and p2 are axially planar].
Apply the transformation 'tr' usingp2.transform!(tr)
and repeat its projection onto a second planeplaney=[p1, X_AXIS]
Now repeat finding the 'flat' angle and make a second rotation transformation with that and the relevant axis... and now the 'box' should rotate into place...
-
<span class="syntaxdefault"><br />model </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model<br /><br /></span><span class="syntaxcomment"># Instances<br /></span><span class="syntaxdefault">base1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Base1'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /></span><span class="syntaxdefault">base2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Base2'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /></span><span class="syntaxdefault">spring </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Spring'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /><br /></span><span class="syntaxcomment"># References<br /></span><span class="syntaxdefault">base1_pt </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">4</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">7</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">base2_pt </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">vector </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> base1_pt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">vector_to</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> base2_pt </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Height Scaling<br /></span><span class="syntaxdefault">pt1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">pt2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">4</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">7</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">height </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">distance</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> pt2 </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">ratio </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> vector</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> height<br />tr_scale </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">scaling</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> ratio </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Axes<br /></span><span class="syntaxdefault">tr_orientation </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault"> ORIGIN</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> vector </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Move<br /></span><span class="syntaxdefault">pt1_on_new_plane </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">transform</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> tr_orientation </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">tr_translate </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault"> pt1_on_new_plane</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">vector_to</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> base1_pt </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Transformation<br /></span><span class="syntaxdefault">tr </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> tr_translate </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> tr_orientation </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> tr_scale<br /><br />spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">transform</span><span class="syntaxkeyword">!(</span><span class="syntaxdefault"> tr </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> </span>
-
To use ThomThom's code as a subroutine that can be called multiple times following a move of either base, you will need to return the spring to its initial position.
vector = base1_pt.vector_to( base2_pt ) # Initialize spring position tr_init = spring.transformation spring.transform! tr_init.inverse # Height Scaling
-
Tnks!
All logical and useful
Advertisement