opUnion: Boolean Union Operation
Geometric Composition for Distance Field Combination
The opUnion
operations perform boolean union by combining multiple SDF shapes into unified geometry. This creates merged effects where shapes blend together, enabling complex geometric compositions through additive modeling.
Mathematical Foundation
Basic union uses the minimum distance between shapes:
Smooth union creates seamless transitions using interpolation:
Function Variants
Function | Parameters | Description |
---|---|---|
opUnion | d1 , d2 | Sharp boolean union |
opUnionSmooth | d1 , d2 , k | Smoothed union with blending factor |
opUnionSmoothVec4 | d1 , d2 , k | Smooth vec4 union with material info |
Implementation Demonstration
ライブエディター
const fragment = () => { const up = vec3(0, 1, 0) const eps = vec3(0.01, 0, 0) const eye = rotate3dY(iTime).mul(vec3(4)) const sdf = Fn(([p]: [Vec3]) => { const sphere = sphereSDFRadius(p.add(vec3(-0.5, 0, 0)), 0.7) const cube = cubeSDF(p.add(vec3(0.5, 0, 0)), 0.6) return opUnion(sphere, cube) }) const march = Fn(([eye, dir]: [Vec3, Vec3]) => { const p = eye.toVar() const d = sdf(p).toVar() Loop(16, ({ i }) => { If(d.lessThanEqual(eps.x), () => { const dx = sdf(p.add(eps.xyy)).sub(d) const dy = sdf(p.add(eps.yxy)).sub(d) const dz = sdf(p.add(eps.yyx)).sub(d) const normal = vec3(dx, dy, dz).normalize() const light = vec3(2, 4, 3).sub(p).normalize() const diffuse = normal.dot(light).max(0.1) return vec4(vec3(diffuse.mul(0.8).add(0.2)), 1) }) p.addAssign(d.mul(dir)) d.assign(sdf(p)) }) return vec4(0) }) const z = eye.negate().normalize() const x = z.cross(up) const y = x.cross(z) const scr = vec3(uv.sub(0.5), 2) const dir = mat3(x, y, z).mul(scr).normalize() return march(eye, dir) }