quatMul: Quaternion Multiplication Operations
Hamilton Product for Rotation Composition
The quatMul function implements the Hamilton product between two quaternions, enabling rotation composition. This operation combines two rotations into a single equivalent rotation, following the non-commutative algebra of quaternion multiplication.
Mathematical Definition: For quaternions and :
Properties:
- Non-commutative:
- Associative:
- Rotation composition: Applying then equals applying
The quatMulScalar function provides scalar multiplication for quaternion scaling operations.
Rotation Chain Composition
This example demonstrates sequential quaternion multiplication creating complex rotation sequences. Each multiplication step adds another rotation layer to the transformation chain.
Live Editor
const fragment = () => { const cellPos = uv.mul(4) const cell = cellPos.floor() const local = cellPos.fract().sub(0.5) const hash = cell.x.mul(127.1).add(cell.y.mul(311.7)).sin().mul(43758.5).fract() const timeOffset = hash.mul(6.28) const baseQ = quatIdentity() const rotX = vec4(timeOffset.add(iTime).mul(0.5).sin(), 0, 0, timeOffset.add(iTime).mul(0.5).cos()) const rotY = vec4(0, timeOffset.add(iTime.mul(0.7)).sin(), 0, timeOffset.add(iTime.mul(0.7)).cos()) const rotZ = vec4(0, 0, timeOffset.add(iTime.mul(0.3)).sin(), timeOffset.add(iTime.mul(0.3)).cos()) const step1 = quatMul(baseQ, rotX.normalize()) const step2 = quatMul(step1, rotY.normalize()) const final = quatMul(step2, rotZ.normalize()) const transform = quat2mat3(final).mul(vec3(local, hash)) const field = transform.length().mul(6).sin().abs() const color = vec3(field, field.mul(0.8), field.mul(0.5)) return vec4(color, 1) }