Ghost of Tsushima
Breathtaking landscapes and art direction. One of my favorite game worlds.
Parameters
120
Display
Camera
const geometryGroup = scene.geometry.group();
const dimensionsGroup = scene.dimensions.group();
const GRAY = "#a5a5a5";
const grayFillId = scene.addHatchFill(GRAY);
const grayStroke = GRAY;
const RED = "#a40000";
const redFillId = scene.addHatchFill(RED, 0.5);
const redStroke = RED;
const dimensionsOffset = 30;
scene.draw((p) => {
const { radius } = p;
const scaleFactor = radius / initialRadius;
geometryGroup.scale(scaleFactor, scaleFactor);
const thickness = initialRadius / 5;
const outerRadius = initialRadius;
const innerRadius = initialRadius - thickness;
const ringPath = geometryGroup.path({
stroke: grayStroke,
fill: grayFillId,
});
ringPath
// outer circle
.moveToAbs(-outerRadius, 0)
.arcTo(outerRadius * 2, 0, outerRadius, true)
.arcTo(-outerRadius * 2, 0, outerRadius, true)
// inner circle
.moveToAbs(-innerRadius, 0)
.arcTo(innerRadius * 2, 0, innerRadius, true)
.arcTo(-innerRadius * 2, 0, innerRadius, true)
.close();
const polygonsPath = geometryGroup.path({
stroke: redStroke,
fill: redFillId,
});
const baseWidth = (initialRadius / 2.5) * 2;
polygonsPath
// bottom triangle
.moveToAbs(-baseWidth / 2, (-baseWidth / 2) * 0.75)
.lineTo(baseWidth / 2, baseWidth / 2)
.lineTo(baseWidth / 2, -baseWidth / 2)
.lineTo(-baseWidth, 0)
// top triangle
.moveToAbs(-baseWidth / 2, 0)
.lineTo(baseWidth / 2, baseWidth / 2)
.lineTo(baseWidth / 2, -baseWidth / 2)
.lineTo((-baseWidth / 2) * 0.6, 0)
.lineTo((-baseWidth / 2) * 0.4, (baseWidth / 2) * 0.4)
.lineTo((-baseWidth / 2) * 0.4, (-baseWidth / 2) * 0.4)
.close();
const dimensions = dimensionsGroup.dimension();
dimensions
.moveToAbs(radius + dimensionsOffset, -radius)
.tick(Math.PI / 2)
.lineTo(0, radius * 2)
.tick(Math.PI / 2)
.textAt(5, -radius, `Ø ${radius}mm`, "start")
// title
.moveToAbs(0, 0)
.textAtAbs(
0,
200,
`"Honor died on the beach" - Jin Sakai`,
"middle",
"title",
);
});