Skip to content
Implementation

Anneaux simples

Les anneaux sont opt-in : la lib n'en génère que si config.hasRings === true. Une fois le flag posé, body.variation.rings est calculé déterministement depuis le seed (archétype, profil, couleurs, opacité). <Body> mount automatiquement <BodyRings> ; en vanille Three.js, vous appelez buildBodyRings.

Activer un anneau

ts
const body = useBody({
  type:           'planetary',
  surfaceLook:    'bands',
  name:           'Jovian',
  radius:          1.4,
  rotationSpeed:   0.003,
  axialTilt:       0.18,
  hasRings:        true, // requis — sans ce flag, `body.variation.rings` est null
}, DEFAULT_TILE_SIZE)

En vanille Three.js

ts
import * as THREE from 'three'
import { buildBodyRings } from '@cedric-pouilleux/stellexjs/core'

if (body.variation.rings) {
  // Le builder lit ce vecteur PAR RÉFÉRENCE chaque frame pour projeter
  // l'ombre — refresh-le dans la boucle, ne le recrée pas.
  const planetWorldPos = new THREE.Vector3()

  const rings = buildBodyRings({
    radius:         body.config.radius,
    rotationSpeed:  body.config.rotationSpeed,
    variation:      body.variation.rings,
    planetWorldPos,
  })

  // Attacher le `carrier` (groupe parent) — PAS `rings.mesh` directement.
  // Le carrier hérite du tilt, spin et drag du planet group.
  body.group.add(rings.carrier)

  // dans la boucle :
  body.group.getWorldPosition(planetWorldPos)
  rings.tick(dt)
}

Deux pièges classiques

  • Attachez rings.carrier, pas rings.mesh — le carrier porte la base orientation (axe Y → plan équatorial) et la rotation propre de l'anneau.
  • planetWorldPos est obligatoire et doit être mutable (pas un nouvel objet à chaque frame) — le shader le lit par référence.

Que contient body.variation.rings ?

Une RingVariation — résolution complète de l'anneau, déterministe :

ChampRôle
archetypeForme générale (broad, dusty, narrow, shepherd…)
innerRatio / outerRatioBord intérieur / extérieur en multiples du rayon
colorInner / colorOuterGradient radial
profile8 samples d'opacité radiale
bandFreq / bandContrastMicro-bandes
dustinessMélange vers un halo diffus
keplerShearRotation différentielle (anneaux qui « tournent à leur propre vitesse »)
noiseSeedSeed du shader de bruit

Vous pouvez muter ces champs avant de passer la variation à buildBodyRings pour customiser sans toucher à la palette.

Distribué sous la licence indiquée dans le dépôt.