Hur man rita Sweet 3D-grafik för LED kuber (3 / 9 steg)
Steg 3: Gå den linjen
Rita en enda voxel är bra, men ibland vill man rita mer komplicerade saker. Det är där funktionen
L3D.line (PVector start, PVector slut, färg col)
är praktiskt. Som namnet antyder, det ritar en linje från start till slutpunkter , och drar det i den angivna färgen. Om du gillar utseendet på denna linje, du har Jack Bresenham tacka--han skrev den här fiffiga funktionen kallas Bresenhams linje algoritm som vi använder för att rita nästan varje linje i alla datorgrafik. En 3D genomförandet av Bresenhams algoritm använder för att rita i kuben.
Titta på exemplet linje i biblioteket. Det mesta är samma som vi såg i exemplet blinka . Skillnaden är i funktionen draw():
void draw() {
Background(0);
Cube.Background(0);
för (flyta theta = 0; theta < 2 * PI, theta += PI/3)
{
PVector start = nya PVector(cube.center.x+radius*cos(theta), 0, cube.center.z+radius*sin(theta));
PVector slutet = nya PVector(cube.center.x+radius*cos(theta+lineAngle), cube.side-1, cube.center.z+radius*sin(theta+lineAngle));
färg col=cube.colorMap(theta%(2*PI), 0, 2 * PI);
Cube.line (start, slut, col);
}
lineAngle +=. 05; kub biblioteket drar kuben i slutet av funktionen draw().
PoseCube() översätter och roterar grafik sammanhanget till rätt vinkel att Visa kuben.
Visas kuben centreras runt ramen grafik (0,0,0) punkten
poseCube();
}
I denna funktion, jag dra sex linjer. Start- och slutpunkterna för dessa linjer är fördelade i cirklar, parallellt med X-Z. Jag beskriva de start punkterna på en cirkel med
X=Cube.Center.x+RADIUS*cos(theta)
Z=Cube.Center.z+RADIUS*sin(theta)
Jag lägger ut slutpunkter i andra änden av kuben, i en liknande cirkel, men jag "twist" cirkeln runt Y-axeln av en kantig variabel kallas lineAngle
X =cube.center.x+radius*cos(theta+lineAngle)
Z=Cube.Center.z+RADIUS*sin(theta+lineAngle)
Jag dra sedan en linje från varje startpunkt till varje slutpunkt. Om lineAngle är 0, faller dessa linjer längs väggarna i en cylinder. Varje ram, jag öka lineAngle, och det är som om jag vrida start cirkeln i förhållande till slut cirkeln. När lineAngle blir till en multipel av 2 * PI, allt är utan snodd, och cykeln börjar igen.
En annan funktion lyfta fram här: färgkarta
Färgkartan är inbyggd i L3D bibliotek. Det tar i tre parametrar:
färg L3D.colorMap (flyta värde, flyta min, flyta max)
Den returnerar en färg av rainbow, baserat på där värdet faller i intervallet från min till max. Detta är ett enkelt sätt att lägga till stänk av färg i ett program.