Volume

볼륨

A bounding-box container that holds 3D content you can walk around and inspect from every side, unlike a flat window.

Also known as: visionOS Volume3D object container
···
js
import * as THREE from 'three';
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(42, 1, 0.1, 100);
camera.position.set(2.6, 1.8, 3.2);
camera.lookAt(0, 0, 0);
scene.add(new THREE.HemisphereLight(0xbfd4ff, 0x14141f, 1.6));
const key = new THREE.DirectionalLight(0xffffff, 1.4);
key.position.set(3, 4, 2);
scene.add(key);
const box = new THREE.LineSegments(
  new THREE.EdgesGeometry(new THREE.BoxGeometry(2.4, 2.4, 2.4)),
  new THREE.LineDashedMaterial({ color: 0x6c7bd8, dashSize: 0.12, gapSize: 0.1, transparent: true, opacity: 0.55 })
);
box.computeLineDistances();
scene.add(box);
const obj = new THREE.Mesh(
  new THREE.IcosahedronGeometry(0.85, 0),
  new THREE.MeshStandardMaterial({ color: 0xff7a59, metalness: 0.3, roughness: 0.35, flatShading: true })
);
scene.add(obj);
function resize() { renderer.setSize(innerWidth, innerHeight); camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); }
addEventListener('resize', resize); resize();
renderer.setAnimationLoop((t) => {
  obj.rotation.y = t * 0.00055;
  obj.rotation.x = Math.sin(t * 0.00035) * 0.3;
  renderer.render(scene, camera);
});

If a window is a glass sheet holding flat content, a volume is a transparent box holding content that has real depth. Users can walk around the 3D model inside, or grab and rotate it, and read it like a physical object. It's used for product mockups, characters, and terrain models.

The defining trait is a clear boundary — width, depth, and height. Content that crosses that boundary gets clipped, so it has to be scaled to fit inside. The boundary itself is usually invisible, showing only a faint outline when the volume is selected.

The demo spins a 3D object slowly inside a dashed bounding box — seeing a different face from every angle is the key difference from a window, which always shows the same flat front.

When to use

Reach for this only when the content genuinely benefits from being 3D. Don’t force inherently flat UI — buttons, text — into a volume.