POV-Ray : Newsgroups : povray.advanced-users : Getting data out of a mesh2 : Re: Getting data out of a mesh2 Server Time
6 Oct 2024 13:38:56 EDT (-0400)
  Re: Getting data out of a mesh2  
From: Stephen Klebs
Date: 22 Feb 2007 12:20:01
Message: <web.45ddd03ce66b4216977978930@news.povray.org>
I wrote these macros ages ago as a kind of poor-man's uv-map. They basically
fit one triangle to another in 3D space. Hope they work for you.

/* -------------------- Fit Macro -------------------------------

   Macro takes 6 vectors: 3 points (P1, P2, P3) on object to move, P;
   3 points (Q1, Q2, Q3) for position to move it to.

  There are two versions of this macro. The rotation method is slower but
  more precise than the matrix formula derived from John van Sickle.
*/

/*------------- [1] Rotation Method ------------------*/
#macro Normal (V1, V2, V3) vcross(V2-V1, V3-V1); #end

#macro XAngle (X, Y)
 #local q = sqrt((X*X) + (Y*Y));
  #if (q = 0)
    #local aX = 0;
  #else
    #local aX = acos(X / q);
  #end
  #if (Y < 0)
    #local aX = (2*pi) - aX;
  #end
  aX
#end

#macro Fit1 (P1, P2, P3, Q1, Q2, Q3)
  #local deg = 180/pi;
  #local nP = Normal (P1, P2, P3)
  #local nQ = Normal (Q1, Q2, Q3)

  //----- Translate to Origin -------
  #local tP = -P1;
  #local tQ = -Q1;
  #local P2 = P2 + tP;
  #local Q2 = Q2 + tQ;

  //--------- Rotate Y------------
  #local aP = XAngle(nP.x, nP.z) * deg;
  #local aQ = XAngle(nQ.x, nQ.z) * deg;
  #local nP = vaxis_rotate(nP, y, aP);
  #local nQ = vaxis_rotate(nQ, y, aQ);
  #local P2 = vaxis_rotate(P2, y, aP);
  #local Q2 = vaxis_rotate(Q2, y, aQ);

  //---------- Rotate Z-----------
  #local bP = -XAngle(nP.x, nP.y) * deg;
  #local bQ = -XAngle(nQ.x, nQ.y) * deg;
  #local P2 = vaxis_rotate(P2, z, bP);
  #local Q2 = vaxis_rotate(Q2, z, bQ);

  //---------- Rotate X-----------
  #local XAngleP = XAngle(P2.z, P2.y) * deg;
  #local XAngleQ = XAngle(Q2.z, Q2.y) * deg;
  #local cQ = -(XAngleQ - XAngleP);

  translate  tP
  rotate     aP*y
  rotate     bP*z
  rotate     cQ*x
  rotate    -bQ*z
  rotate    -aQ*y
  translate -tQ
#end

/*------------- [2] Matrix Method ------------------*/
#macro Fit2 (pA, pB, pC, pD, pE, pF)
  #local vXa = (pB-(pA));
  #local vYa = (pC-(pA));
  #local vZa = vcross(vXa, vYa);

  #local vXb = (pE-(pD));
  #local vYb = (pF-(pD));
  #local vZb = vcross(vXb, vYb);

  #local sDET = vdot(vZa,vcross(vXa,vYa));

  //-- Values for the inverted matrix:
  #local vCX = vcross(vYa, vZa)/sDET;
  #local vCY = vcross(vZa, vXa)/sDET;
  #local vCZ = vcross(vXa, vYa)/sDET;

  // These two steps take the triangle at (A,B,C) and move it to
(<0,0,0>,x,y).
  translate -(pA)
  matrix < vCX.x, vCY.x, vCZ.x,
           vCX.y, vCY.y, vCZ.y,
           vCX.z, vCY.z, vCZ.z,
               0,     0,     0 >

  // This matrix takes the triangle at (<0,0,0>,x,y) and moves it to
(D,E,F).
  matrix < vXb.x, vXb.y, vXb.z,
           vYb.x, vYb.y, vYb.z,
           vZb.x, vZb.y, vZb.z,
            pD.x,  pD.y,  pD.z >
#end

/*---------------------------------------------------------------*/
#macro Fit (P1, P2, P3, Q1, Q2, Q3)
  Fit1 (P1, P2, P3, Q1, Q2, Q3)
#end


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.