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"