sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🛣️ Road Profile Builder | Generate roads, curbs and pavements easily Download

    Geometry, Transformation, and Scaling

    Scheduled Pinned Locked Moved Developers' Forum
    5 Posts 4 Posters 549 Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A Offline
      Anton_S
      last edited by

      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;
      start position
      2
      3
      I want to know how to calculate pink solid new transformation, knowing current position of all 4 points, and transformation of pinksolid.

      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        You know where p1 and p2 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' using p2.transform!(tr) and repeat its projection onto a second plane planey=[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...
        😕

        TIG

        1 Reply Last reply Reply Quote 0
        • thomthomT Offline
          thomthom
          last edited by

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

          Test Model

          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • sdmitchS Offline
            sdmitch
            last edited by

            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
            
            

            Nothing is worthless, it can always be used as a bad example.

            http://sdmitch.blogspot.com/

            1 Reply Last reply Reply Quote 0
            • A Offline
              Anton_S
              last edited by

              Tnks!
              All logical and useful 👍

              1 Reply Last reply Reply Quote 0
              • 1 / 1
              • First post
                Last post
              Buy SketchPlus
              Buy SUbD
              Buy WrapR
              Buy eBook
              Buy Modelur
              Buy Vertex Tools
              Buy SketchCuisine
              Buy FormFonts

              Advertisement