算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
threejs【设计与创意】Three.js is a JavaScript library for building interactive 3D graphics in the browser with WebGL and WebGPU. Use it for 3D product configurators, data visualizations, games and creative sites: scenes, cameras, lighting, glTF model loading, performance tuning, and React Three Fiber. Trigger words: threejs, three.js, 3d, webgl, webgpu, react three fiber…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Three.js is a JavaScript library for creating interactive 3D graphics in the browser. It provides a scene graph, PBR materials, lighting, model loaders (glTF, FBX), and performance tools such as instanced rendering. React Three Fiber (R3F) is a declarative React renderer for it, with Suspense-based loading and automatic disposal.
Versions checked: three 0.186 (r186), @react-three/fiber 9.8, @react-three/drei 10.7. Things that differ from older tutorials:
three/addons/... (for example three/addons/controls/OrbitControls.js); the old three/examples/jsm/... paths and outputEncoding / Texture.encoding (removed in r152, now outputColorSpace / colorSpace) are legacy.THREE.Clock is deprecated since r182; use THREE.Timer (timer.update() then timer.getDelta()).WebGPURenderer and node materials come from three/webgpu, shaders written in TSL from three/tsl. WebGPU renderer async methods (renderAsync, computeAsync) are deprecated since r180.DRACOLoader.setDecoderConfig() is deprecated (r185); Draco will always use WASM.@react-three/fiber 9 pairs with React 19; v8 pairs with React 18. @react-three/drei 10 needs R3F 9.Scene, PerspectiveCamera (or OrthographicCamera) and WebGLRenderer, add OrbitControls, and set renderer.setPixelRatio(Math.min(devicePixelRatio, 2)). The renderer's default tone mapping is none; set toneMapping = THREE.ACESFilmicToneMapping yourself in vanilla code (R3F's <Canvas> already uses ACES Filmic and sRGB output unless flat is set).BufferGeometry) with materials (MeshStandardMaterial for PBR, MeshPhysicalMaterial for clearcoat, transmission) and set colorSpace = THREE.SRGBColorSpace on colour textures only (not normal, roughness or metalness maps).GLTFLoader for glTF/GLB. For compressed files add DRACOLoader (copy the decoder from node_modules/three/examples/jsm/libs/draco/gltf/ to your public folder and call setDecoderPath) and KTX2Loader (transcoder in examples/jsm/libs/basis/, call setTranscoderPath and detectSupport(renderer)). Compress with gltf-transform or gltfpack first.RGBELoader plus PMREMGenerator, or drei <Environment>); enable renderer.shadowMap.enabled and castShadow / receiveShadow only where needed.renderer.setAnimationLoop(fn) and use the timer delta, not a fixed step.InstancedMesh for 100+ identical objects, merge static geometry, use LOD, and call dispose() on geometries, materials and textures you remove.OrbitControls, Environment, useGLTF, ContactShadows) and @react-three/postprocessing for bloom or SSAO. useGLTF enables Draco (decoder fetched from Google's CDN) and Meshopt by default; call useGLTF.preload(url) and useGLTF.setDecoderPath(...) to self-host the decoder.npm install three
import * as THREE from 'three'
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(innerWidth, innerHeight)
renderer.setPixelRatio(Math.min(devicePixelRatio, 2))
renderer.toneMapping = THREE.ACESFilmicToneMapping
document.body.appendChild(renderer.domElement)
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 0.1, 100)
camera.position.set(2, 1.5, 3)
const controls = new OrbitControls(camera, renderer.domElement)
scene.add(new THREE.HemisphereLight(0xffffff, 0x444455, 1.2))
const draco = new DRACOLoader().setDecoderPath('/draco/')
const loader = new GLTFLoader().setDRACOLoader(draco)
loader.load('/models/sneaker.glb', (gltf) => scene.add(gltf.scene))
const timer = new THREE.Timer()
renderer.setAnimationLoop(() => {
timer.update()
scene.rotation.y += timer.getDelta() * 0.3
controls.update()
renderer.render(scene, camera)
})
User request: "Create a 3D product viewer where users can change colors and rotate the model"
npm install three @react-three/fiber @react-three/drei # React 19 project
import { Canvas } from '@react-three/fiber'
import { OrbitControls, Environment, ContactShadows, useGLTF } from '@react-three/drei'
import { useState } from 'react'
function Sneaker({ color }: { color: string }) {
const { scene, materials } = useGLTF('/models/sneaker.glb') as any
materials.body.color.set(color)
return <primitive object={scene} />
}
useGLTF.preload('/models/sneaker.glb')
export function Configurator() {
const [color, setColor] = useState('#e63946')
return (
<>
<Canvas camera={{ position: [2, 1.5, 3], fov: 45 }}>
<Environment preset="studio" />
<Sneaker color={color} />
<ContactShadows position={[0, -0.5, 0]} opacity={0.5} blur={2.5} />
<OrbitControls makeDefault enablePan={false} />
</Canvas>
{['#e63946', '#1d3557', '#2a9d8f'].map((c) => (
<button key={c} style={{ background: c }} onClick={() => setColor(c)} aria-label={c} />
))}
</>
)
}
Result: a rotatable shoe with studio lighting and a soft shadow; clicking a swatch recolours the body material. Material names depend on the model; inspect them with console.log(materials) first.
User request: "Visualize global data points on an interactive 3D globe"
SphereGeometry(1, 64, 64) with an earth texture (colorSpace = SRGBColorSpace).InstancedMesh: mesh.setMatrixAt(i, matrix), then mesh.instanceMatrix.needsUpdate = true.TubeGeometry along a QuadraticBezierCurve3 and animate a dash by updating the material's texture offset in the animation loop.OrbitControls with autoRotate = true; user dragging pauses it.Result: thousands of markers render in one draw call, with arcs and a globe that auto-rotates until the user takes over.
Clock, outputEncoding or examples/jsm imports in new code.geometry.dispose(), material.dispose(), texture.dispose(); R3F disposes JSX-created objects for you.