← Fiestas y NavidadObjeto 3Dfogon/corona-navidena
Corona navideña
Arrastrá para girarlo// «Corona navideña» · gpt-6-sol (medium)
// A Christmas wreath standing upright facing front (-y): a thick ring of dark and bright green pine branches with a few red berries and small pine cones, and a big red velvet bow at the bottom with two long ribbon tails. It stands on a small wooden easel.
// Wooden easel, set behind the wreath.
const wood = "#a86a36", woodLight = "#d39858", woodDark = "#754626";
line(24, 32, 30, 15, 31, 0, 2, wood);
line(24, 32, 30, 33, 31, 0, 2, wood);
line(24, 35, 25, 24, 38, 0, 2, woodDark);
line(24, 31, 29, 16, 30, 1, 0, woodLight);
line(24, 31, 29, 32, 30, 1, 0, woodLight);
box(15, 27, 8, 33, 33, 10, wood);
box(15, 27, 10, 33, 28, 10, woodLight);
box(13, 29, 0, 18, 34, 1, woodDark);
box(30, 29, 0, 35, 34, 1, woodDark);
// Thick, solid pine wreath. Its circular opening stays clear.
const greens = ["#174b2e", "#206b37", "#298345", "#36a452", "#48b85b"];
for (let x = 5; x <= 43; x++) {
for (let z = 8; z <= 46; z++) {
const radial = Math.hypot(x - 24, z - 27);
for (let y = 16; y <= 30; y++) {
const tube = Math.hypot(radial - 12.7, (y - 23) * 1.05);
if (tube > 4.5) continue;
let shade = y < 21 ? 2 : y > 26 ? 0 : 1;
if (z > 29 && y < 24) shade++;
if (tube > 3.6 && rand() < 0.40) shade++;
if (rand() < 0.11) shade = Math.max(0, shade - 1);
set(x, y, z, greens[Math.min(4, shade)]);
}
}
}
// Little overlapping sprays give the ring its pine-branch silhouette.
for (let i = 0; i < 235; i++) {
const a = rand() * Math.PI * 2;
const radius = 11.0 + rand() * 4.2;
const x = 24 + Math.cos(a) * radius;
const z = 27 + Math.sin(a) * radius;
const y = 16.5 + rand() * 3;
const lean = (rand() - 0.5) * 2.5;
const length = 1.5 + rand() * 2.3;
const tipX = x + Math.cos(a) * length - Math.sin(a) * lean;
const tipZ = z + Math.sin(a) * length + Math.cos(a) * lean;
const green = rand() < 0.36 ? "#55bd62" : rand() < 0.52 ? "#37a34d" : "#227e3f";
line(x, y, z, tipX, y - 0.6, tipZ, rand() < 0.35 ? 1 : 0, green);
if (i % 3 === 0) {
line(x, y, z, x - Math.sin(a) * 2, y - 1, z + Math.cos(a) * 2, 0, "#49af56");
}
}
// Glossy berry clusters dotted around the front.
for (const [x, z] of [
[14, 35], [34, 37], [38, 27], [11, 25], [31, 15], [18, 41]
]) {
sphere(x, 14, z, 1.4, "#a61728");
sphere(x + 2, 15, z - 1, 1.3, "#d82636");
sphere(x + 1, 13, z + 2, 1.2, "#ef3845");
set(x, 12, z + 1, "#ff9b98");
set(x + 2, 13, z, "#ffaaa3");
}
// Small pine cones with chunky, warm-brown scales.
for (const [x, z] of [[17, 19], [36, 32], [22, 42], [9, 31]]) {
ellipsoid(x, 15, z, 1.7, 1.5, 2.6, "#754426");
sphere(x, 13, z - 1, 1, "#a9703a");
set(x - 1, 13, z + 1, "#c18a50");
set(x + 1, 13, z + 1, "#c18a50");
set(x, 13, z + 2, "#d6a161");
}
// Two long velvet ribbon tails, with notched ends.
for (const side of [-1, 1]) {
for (let z = 3; z <= 15; z++) {
const center = 24 + side * (3 + (14 - z) * 0.42);
for (let x = Math.round(center - 2); x <= Math.round(center + 2); x++) {
if (z <= 5 && Math.abs(x - center) < 0.7 && z < 6) continue;
for (let y = 13; y <= 15; y++) {
set(x, y, z, y === 13 ? "#e43b47" : "#ae172b");
}
}
set(Math.round(center - side), 12, z, "#f66a68");
}
}
// Plush bow loops, folds, and a prominent central knot.
ellipsoid(19, 14, 16, 5.5, 2.5, 3.8, "#a7192c");
ellipsoid(29, 14, 16, 5.5, 2.5, 3.8, "#a7192c");
ellipsoid(18.5, 12, 16.6, 4.5, 1.5, 2.8, "#e83243");
ellipsoid(29.5, 12, 16.6, 4.5, 1.5, 2.8, "#e83243");
ellipsoid(17, 10.8, 16, 1.9, 0.7, 1.5, "#8e142a");
ellipsoid(31, 10.8, 16, 1.9, 0.7, 1.5, "#8e142a");
line(16, 11, 18, 21, 11, 19, 0, "#ff7776");
line(27, 11, 19, 32, 11, 18, 0, "#ff7776");
ellipsoid(24, 10, 16, 2.6, 2, 3.1, "#ae172c");
ellipsoid(24, 9, 16.5, 2.1, 0.8, 2.5, "#ec4350");
line(23, 8, 18, 25, 8, 18, 0, "#ff8580");import { draw } from "./assets/voxel";
import { coronaNavidena } from "./assets/corona-navidena";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, coronaNavidena, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add corona-navidena
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["corona-navidena"] })
# Queda en client/assets/corona-navidena.ts
# https://fogon.page/object/corona-navidena