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