# Globalization, Unfolded 

##### A “Simple” T‑Shirt’s Surprisingly Complex Journey from Idea to Doorstep 

September 24, 2024 • Visual Feature 

By [Scott Lincicome](https://www.cato.org/people/scott-lincicome) 

# Globalization, Unfolded 

##### A “Simple” T‑Shirt’s Surprisingly Complex Journey from Idea to Doorstep 

September 24, 2024 • Visual Feature 

By [Scott Lincicome](https://www.cato.org/people/scott-lincicome) 

![Test BG for "I, T-Shirt" Globe Data Viz](/sites/cato.org/files/styles/aside_3x/public/2024-01/test-tshirt-dataviz-bg2.jpg?itok=0pbMn0ie) 

In today’s 
inter­connected world,

even the simplest products can have complicated and counterintuitive stories we never see.

Whether a microchip or potato chip, an item’s journey from idea to doorstep can involve countless people in countless places, seamlessly cooperating in a global web of suppliers.

The product’s label might *say*:

XL | Made in Mexico

100% cotton 
machine wash cold | tumble dry low | iron low

But that’s only part of the story – and a small one at that.

Let’s explore Cato’s production of a basic yet beloved wardrobe staple: 

the T‑shirt.

{
"imports": {
"three": "https://unpkg.com/three/build/three.module.js",
"three/addons/": "https://unpkg.com/three/examples/jsm/",
"three/examples/jsm/controls/OrbitControls": "https://unpkg.com/three/examples/jsm/controls/OrbitControls.js",
"three/examples/jsm/loaders/GLTFLoader": "https://unpkg.com/three/examples/jsm/loaders/GLTFLoader.js"
}
}

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

// Scene setup
const scene = new THREE.Scene();

// Camera setup
const camera = new THREE.PerspectiveCamera(45, 1,.001, 10) // field of view, aspect ratio, near, far plane
camera.position.set( 0,.4, -.9 ) // camera is +40 in z direction
camera.lookAt( 0, 0, 0 ) // camera is looking at origin

// Renderer setup
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setClearColor( 0x000000, 0 );
let container = document.getElementById('3d-shirt-container')
container.appendChild(renderer.domElement);
let setSize = () => {
	renderer.setSize(container.clientWidth, container.clientWidth);
	camera.aspect = container.clientWidth / container.clientWidth;
	camera.updateProjectionMatrix();
}
setSize()

// OrbitControls setup
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableZoom = false // disables zoom
controls.enablePan = false // disables pan
let mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) 
if(mobile){
	controls.enableRotate = false // prevents getting such scrolling on mobile
}else{
	controls.enableRotate = true
}

controls.autoRotate = true
controls.autoRotateSpeed = 1.5
controls.minPolarAngle = 1/8 * Math.PI
controls.maxPolarAngle = 7/8 * Math.PI

controls.enableDamping = true
controls.dampingFactor =.3
controls.rotateSpeed = 1

// GLTFLoader setup
const loader = new GLTFLoader();
let url = `https://www.cato.org/sites/cato.org/files/2024-07/3d-t-shirt_v06.glb`
let shirt
loader.load(
	url,// resource URL
	function ( gltf ) { // called when the resource is loaded
		shirt = gltf.scene 
		shirt.position.set(0,-.06,-.05)
		scene.add(shirt);
	},
	function ( xhr ) { // called while loading is progressing
		console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' ); 
	},
	function ( error ) { // called when loading has errors
		console.log( 'An error happened' ); 
	}
);

// Animation loop
let t = performance.now()
function animate() {
	requestAnimationFrame(animate); // adjust scale on resize and stops animation when window is closed to save memory
controls.autoRotateSpeed = 10 * (.1+2*( 1+Math.sin(-.1-Math.PI/2+2*controls.getAzimuthalAngle()) )) // front and back view rotate slower
controls.update()

	renderer.render(scene, camera);

	t = performance.now()
}

animate();

// Handle window resize
window.addEventListener('resize', () => {
	setSize()
});

As you scroll down and click through the interactive globe below, you’ll likely be surprised by just how complex this “simple” item really is, by how many people here and abroad were involved in getting the shirt to your home, and by where most of the shirt’s value actually originated.

![Test BG for "I, T-Shirt" Globe Data Viz](/sites/cato.org/files/styles/aside_3x/public/2024-01/test-tshirt-dataviz-bg2.jpg?itok=0pbMn0ie) 

Skeptics often mention “cheap T‑shirts” from abroad

as an insufficient counterweight to globalization’s supposed costs, but our T‑shirt’s journey shows that even the simplest of goods today generates economic activity far beyond its manufacture and consumption.

Its label reads:

M | Made in Guatemala

100% cotton 
machine wash cold | tumble dry low | iron low

But in truth, the shirt is made all over the world, via a web of voluntary human interactions **so complex** that no label or person could hope to describe it.

{
"imports": {
"three": "https://unpkg.com/three/build/three.module.js",
"three/addons/": "https://unpkg.com/three/examples/jsm/",
"three/examples/jsm/controls/OrbitControls": "https://unpkg.com/three/examples/jsm/controls/OrbitControls.js",
"three/examples/jsm/loaders/GLTFLoader": "https://unpkg.com/three/examples/jsm/loaders/GLTFLoader.js"
}
}

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

// Scene setup
const scene = new THREE.Scene();

// Camera setup
const camera = new THREE.PerspectiveCamera(45, 1,.001, 10) // field of view, aspect ratio, near, far plane
camera.position.set( 0,.4, -.9 ) // camera is +40 in z direction
camera.lookAt( 0, 0, 0 ) // camera is looking at origin

// Renderer setup
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setClearColor( 0x000000, 0 );

let container = document.getElementById('3d-shirt-container-final')
container.appendChild(renderer.domElement);
let setSize = () => {
	renderer.setSize(container.clientWidth, container.clientWidth);
	camera.aspect = container.clientWidth / container.clientWidth;
	camera.updateProjectionMatrix();
}
setSize()

// OrbitControls setup
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableZoom = false // disables zoom
controls.enablePan = false // disables pan
let mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) 
if(mobile){
	controls.enableRotate = false // prevents getting such scrolling on mobile
}else{
	controls.enableRotate = true
}

controls.autoRotate = true
controls.autoRotateSpeed = 1.5
controls.minPolarAngle = 1/8 * Math.PI
controls.maxPolarAngle = 7/8 * Math.PI

controls.enableDamping = true
controls.dampingFactor =.3
controls.rotateSpeed = 1

// GLTFLoader setup
const loader = new GLTFLoader();
let url = `https://www.cato.org/sites/cato.org/files/2024-07/3d-t-shirt_v06.glb`
let shirt
loader.load(
	url,// resource URL
	function ( gltf ) { // called when the resource is loaded
		shirt = gltf.scene 
		shirt.position.set(0,-.06,-.05)
		scene.add(shirt);
	},
	function ( xhr ) { // called while loading is progressing
		console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' ); 
	},
	function ( error ) { // called when loading has errors
		console.log( 'An error happened' ); 
	}
);

// Animation loop
let t = performance.now()
function animate() {
	requestAnimationFrame(animate); // adjust scale on resize and stops animation when window is closed to save memory
controls.autoRotateSpeed = 10 * (.1+2*( 1+Math.sin(-.1-Math.PI/2+2*controls.getAzimuthalAngle()) )) // front and back view rotate slower
controls.update()

	renderer.render(scene, camera);

	t = performance.now()
}

animate();

// Handle window resize
window.addEventListener('resize', () => {
	setSize()
});

canvas {
touch-action: auto!important;
}

In today’s global economy, even a “simple” T‑shirt is *anything but.*

![Globalization, Unfolded - T-Shirt Group Pic Front](/sites/cato.org/files/styles/pubs_2x/public/2024-09/globalization-unfolded-tshirtfront.jpg?itok=8dY_cIOC) 

[![Defending Globalization - logo - vertical](/sites/cato.org/files/styles/promo_block/public/2023-09/logo-list-dg2.jpg?itok=GetBkW8z)](https://www.cato.org/defending-globalization) 

##### Featured Project 

### [Defending Globalization](https://www.cato.org/defending-globalization)

Unfortunately, the most common anti‐​globalization narratives are not just inaccurate; they ignore the fundamental humanity of globalization and that, for all its foibles and missteps, global capitalism’s long‐​term direction is undeniably positive. Frustrated by the ossifying conventional wisdom that, *actually, globalization has been mostly Bad*, we set out to launch [this Cato project](https://www.cato.org/defending-globalization), which will both correct the record and offer a strong, proactive case for more global integration in the years ahead.

[More About the Project](https://www.cato.org/defending-globalization)