|
![](/i/fill.gif) |
I found that file in another posting of Zeger, dating back to 2002! :-D
Here it is, for all those who need it for Zeger's formidable greebles.
------------------------
//Een afgeronde kader, zoals box{}, maar dan afgerond, en enkel de randen.
#macro Kader (Begin,Eind,Straal)
#local Begin=Begin*<1,1,1>;
#local Eind=Eind*<1,1,1>;
#local R=Straal;
#local B=<min(Begin.x,Eind.x),min(Begin.y,Eind.y),min(Begin.z,Eind.z)>+R;
#local E=<max(Begin.x,Eind.x),max(Begin.y,Eind.y),max(Begin.z,Eind.z)>-R;
merge { //merge, zodat het ook voor transparante materialen werkt.
#if (R > 0)
//Onderste rij
sphere {
B,R
}
sphere {
<E.x,B.y,B.z>,R
}
sphere {
<E.x,B.y,E.z>,R
}
sphere {
<B.x,B.y,E.z>,R
}
//Bovenste rij
sphere {
E,R
}
sphere {
<E.x,E.y,B.z>,R
}
sphere {
<B.x,E.y,E.z>,R
}
sphere {
<B.x,E.y,B.z>,R
}
//Onderste cilinders
cylinder {
B,<E.x,B.y,B.z>,R
}
cylinder {
B,<B.x,B.y,E.z>,R
}
cylinder {
<E.x,B.y,B.z>,<E.x,B.y,E.z>,R
}
cylinder {
<E.x,B.y,E.z>,<B.x,B.y,E.z>,R
}
//Bovenste cilinders
cylinder {
<B.x,E.y,B.z>,<E.x,E.y,B.z>,R
}
cylinder {
<B.x,E.y,B.z>,<B.x,E.y,E.z>,R
}
cylinder {
<E.x,E.y,B.z>,<E.x,E.y,E.z>,R
}
cylinder {
<E.x,E.y,E.z>,<B.x,E.y,E.z>,R
}
//Verticale cilinders
cylinder {
B,<B.x,E.y,B.z>,R
}
cylinder {
<E.x,B.y,B.z>,<E.x,E.y,B.z>,R
}
cylinder {
<B.x,B.y,E.z>,<B.x,E.y,E.z>,R
}
cylinder {
<E.x,B.y,E.z>,<E.x,E.y,E.z>,R
}
#end
}
#end
//Zoals box{}, maar dan afgerond. Gebruikt Kader()!
#macro Ronddoos(Begin,Eind,Straal)
#local Begin=Begin*<1,1,1>;
#local Eind=Eind*<1,1,1>;
#local R=Straal;
#local B=<min(Begin.x,Eind.x),min(Begin.y,Eind.y),min(Begin.z,Eind.z)>+R;
#local E=<max(Begin.x,Eind.x),max(Begin.y,Eind.y),max(Begin.z,Eind.z)>-R;
merge {
object {Kader (Begin,Eind,Straal)}
box {
B,E
}
box {
<B.x,B.y,B.z-R>,<E.x,E.y,E.z+R>
}
box {
<B.x-R,B.y,B.z>,<E.x+R,E.y,E.z>
}
box {
<B.x,B.y-R,B.z>,<E.x,E.y+R,E.z>
}
}
#end
//Beveled tekst. Geeft als resultaat een afgeronde tekst met instelbare
resolutie (bestaat uit blobs)
#macro Text (Lettertype, Tkst, R, P, T)
#local Tekst=
text {
ttf Lettertype //"starwars.ttf"
Tkst,.01,0
}
#declare Min=min_extent(Tekst);
#declare Max=max_extent(Tekst);
#local Telx=0;
#local Tely=0;
blob {
threshold T
#while (Telx<ResX)
#declare Tely=0;
#while (Tely<ResY)
#local PlaatsX=(Min.x+(Max.x-Min.x)*(Telx/ResX));
#local PlaatsY=(Min.y+(Max.y-Min.y)*(Tely/ResY));
#local Norm=<0,0,0>;
#local Loc=trace(Tekst,<PlaatsX,PlaatsY,-10>,z,Norm);
#if ((Norm.x*Norm.y*Norm.z)!=0)
sphere {
Loc,R,P
}
#end
#local Tely=Tely+1;
#end
#local Telx=Telx+1;
#end
}
#end
//Een alternatieve versie voor Atan2. Werkt ook met beiden nul.
#macro Atan (arg1,arg2)
#if (arg1=0 & arg2=0)
0
#else
atan2(arg1,arg2)
#end
#end
//Geeft het punt op plaats T van de bezier-kromme met controlepunten P1,
P2, P3 en P4
#macro Bezier (P1,P2,P3,P4,T)
#local beziera=pow(1-T,3);
#local bezierb=3*pow(1-T,2)*T;
#local bezierc=3*(1-T)*pow(T,2);
#local bezierd=pow(T,3);
#local beziere=pow(T,2);
#local bezierf=pow(1-T,2);
#local bezierg=2*(1-T)*T;
#local bezierh=bezierf-bezierg;
#local bezieri=bezierg-beziere;
#local bezierx=(beziera*P1.x + bezierb*P2.x + bezierc*P3.x + bezierd*P4.x);
#local beziery=(beziera*P1.y + bezierb*P2.y + bezierc*P3.y +
bezierd*P4.y);
#local bezierz=(beziera*P1.z + bezierb*P2.z + bezierc*P3.z + bezierd*P4.z);
<bezierx,beziery,bezierz>
#end
//De rotatie rond X en Z berekenen voor een bepaald punt op een
bezierkromme met controlepunten P1, P2, P3 en P4 op plaats T
//Ik haal deze formules van een INC-file van Michael D Johnson. Er
stond bij dat hij niet zeker is van deze formules.
//Ik dus ook niet... :-)
#macro BezierRot(P1,P2,P3,P4,T)
#local beziera=pow(1-T,3);
#local bezierb=3*pow(1-T,2)*T;
#local bezierc=3*(1-T)*pow(T,2);
#local bezierd=pow(T,3);
#local beziere=pow(T,2)
#local bezierf=pow(1-T,2);
#local bezierg=2*(1-T)*T;
#local bezierh=bezierf-bezierg;
#local bezieri=bezierg-beziere;
#local bezierx=(beziera*P1.x + bezierb*P2.x + bezierc*P3.x + bezierd*P4.x);
#local beziery=(beziera*P1.y + bezierb*P2.y + bezierc*P3.y +
bezierd*P4.y);
#local bezierz=(beziera*P1.z + bezierb*P2.z + bezierc*P3.z + bezierd*P4.z);
#local bezierdx=(-bezierf*P1.x + bezierh*P2.x + bezieri*P3.x +
beziere*P4.x);
#local bezierdy=(-bezierf*P1.y + bezierh*P2.y + bezieri*P3.y +
beziere*P4.y);
#local bezierdz=(-bezierf*P1.z + bezierh*P2.z + bezieri*P3.z +
beziere*P4.z);
#local A2=degrees(Atan(bezierdy,bezierdz));
#local A=degrees (Atan(bezierdy,bezierdx));
<A2,0,A>
#end
Post a reply to this message
|
![](/i/fill.gif) |