Créer une scène LOD multi-modèles sur eCorpus

Création d’une scène à niveaux de détails dynamique sur eCorpus.

En utilisant la branche dédiée.

Dépendances

Ce guide utilise curl, nodejs et bash.

Installer gltf-transform et ecorpus-tools.

Exemple

Remplacer $INPUT_DIR, $USERNAME, $PASSWORD et $SCENE_NAME dans le script suivant:

#!/bin/bash
set -euo pipefail

qualities=(thumb low medium high)
sizes=('256' '512' '1024' '2048')
colors=('#ff6666' '#ffaaaa' '#aaaaff' '#aaffaa')
mkdir -p dist


TMP=$(mktemp -d -p "$(pwd)")
trap "rm -rf '$TMP'" EXIT




###
# Utilities
###
warn(){
  echo "  $1" >&2
}

fail(){
  echo "$1" >&2
  exit 1
}

optimize(){
  local file="$1"
  local name="$(basename "$file" ".glb")"
  local quality="$2"
  local output="dist/${name}_${quality}.glb"
  count=1

  transform(){
    local cmd="$1"
    shift

    local input="$1"
    shift
    if [ "$input" = "last" ] ; then
      input="$TMP/${name}_${count}.glb"
    fi

    local output="$1"
    shift
    if [ "$output" = "next" ] ; then
      output="$TMP/${name}_$((++count)).glb"
    fi
    npx gltf-transform "$cmd" "$input" "$output" $@
  }

  transform prune "$file" "next"
  transform weld "last" "next"
  transform reorder "last" "next"
  transform resize  "last" "next" --height "$(texture_size "$quality")" --width "$(texture_size "$quality")"
  #colorize models to highlight quality levels for debug purposes
  #npx ec colorize --color "$(texture_color "$quality")" "$TMP/${name}_${count}.glb" "$TMP/${name}_$((++count)).glb"
  transform uastc "last" "next" --slots "{normalTexture,occlusionTexture,metallicRoughnessTexture}" --level 4 --rdo --rdo-lambda 4 --zstd 18
  if [ "$quality" == "high" ]; then
    echo "generate high quality texture"
    transform simplify "last" "next" --ratio 0.5 --error 0.0005 --lock-border
    transform etc1s "last" "next"  --quality 230
  elif [ "$quality" == "medium" ]; then
    echo "generate medium quality texture"
    transform simplify "last" "next" --ratio 0.1 --error 0.001 --lock-border
    transform etc1s "last" "next"  --quality 200
  elif [ "$quality" == "low" ]; then
    transform simplify "last" "next" --ratio 0 --error 0.002 --lock-border
    transform etc1s "last" "next"  --quality 180
  elif [ "$quality" == "thumb" ]; then 
    transform simplify "last" "next" --ratio 0 --error 0.01 --lock-border
    transform uastc "last" "next"
  fi

  transform meshopt "last" "$output" --level medium --quantization-volume scene
}

texture_size(){
  local quality="$1"
  for (( i=0; i<${#qualities[@]}; i++ )); do
    if ! [ "${qualities[$i]}" == "$quality" ]; then
    continue
    fi
    echo "${sizes[$i]}"
    return 0
  done
  fail "Texture not found for $quality"
}

texture_color(){
  local quality="$1"
  for (( i=0; i<${#qualities[@]}; i++ )); do
    if ! [ "${qualities[$i]}" == "$quality" ]; then
    continue
    fi
    echo "${colors[$i]}"
    return 0
  done
  fail "Color not found for $quality"
}

export_file(){
  local size


  for quality in ${qualities[@]} ; do
    echo "Exporting $name $quality"
    optimize "$1" "$quality"
  done
}

find "$INPUT_DIR" -name "*.glb" -print0 | while IFS= read -r -d $'\0' file; do

  name="$(basename "$file" ".glb")"
  export_file "$file"
done

#Upload scenes
for q in thumb low medium high ;do
  echo "Upload $q"
  ec upload -u "$USERNAME:$PASSWORD" -t http://localhost:8000 -q "$q" "$SCENE_NAME" dist/*_$q.glb
done

echo "DONE"