\section{Formatter un NVE en DASH}\label{fr:dash3d}

Dans cette section, nous décrivons comment nous préparons et stockons les données 3D de notre NVE dans un format qui soit compatible avec DASH\@.
Dans nos travaux, nous utilisons le format WaveFront OBJ pour les polygones et PNG pour les textures. Cependant, le processus s'applique aussi à d'autres formats.

\subsection{Le MPD}

Dans DASH, les informations telles que les URL des fichiers, leur résolution ou leur taille sont extraites par le client grâce à un fichier appelé \emph{Media Presentation Description, MPD}. Le client ne se base que sur ces informations pour décider quel fichier télécharger et à quel niveau de résolution.

Le MPD est un fichier XML organisé hiérarchiquement en différentes sections.
Les \emph{periods} sont le premier niveau, qui dans le cas de la vidéo, indiquent le début et la durée d'un chapitre. Cet élément ne s'applique pas dans le cas d'un NVE, et nous utilisons donc une seule \emph{period} qui contiendra toute la scène, puisque celle-ci est statique.

Chaque \emph{period} contient un ou plusieurs \emph{adaptation sets} qui décrivent des versions alternatives, formats et types de contenu. Nous utilisons les \emph{adaptation sets} pour organiser la géométrie et les textures de la scène.

\subsection{Adaptation Sets}

Quand un utilisateur navigue librement dans un NVE, le champ de vision à un moment donné ne contient qu'une partie limitée de la scène. De la même façon que DASH-vidéo partitionne une vidéo en blocs temporels, nous partitionnons les polygones en blocs spatiaux, de sorte que notre client puisse ne télécharger que les blocs nécessaires.

\textbf{Gestion de la géométrie.}\label{fr:geometry}
Nous utilisons un arbre de partitionnement de l'espace pour organiser les faces en cellules.
Une face appartient à une cellule si son barycentre est à l'intérieur de la boîte englobante correspondante.
Chaque cellule appartient à un \emph{adaptation set}.
Ainsi, l'information géométrique est étalée dans les \emph{adaptation sets} en fonction de leur cohérence spatiale, permettant au client de choisir les faces pertinentes à télécharger. Une cellule est pertinente si son intersection avec le champ de vision de l'utilisateur est non vide. Dans la figure~\ref{fr:bigpic}, les cellules pertinentes sont représentées en bleu.

Puisque notre scène 3D est principalement étalée le long d'un plan horizontal, nous séparons alternativement le modèle dans les deux directions de ce plan.

Nous créons un \emph{adaptation set} séparé pour les grandes faces (par exemple, le ciel ou le sol) puisqu'elles sont essentielles au modèle 3D et qu'elles ne rentrent pas dans les cellules. Nous considérons une face comme grande si son aire est supérieure à $a+3\sigma$ où $a$ et $\sigma$ sont respectivement la moyenne et l'écart-type des aires des faces. Dans notre exemple, ceci correspond aux 5 plus grandes faces, qui représentent $15\%$ de l'aire totale. Nous obtenons ainsi une décomposition du NVE en \emph{adaptation sets} qui partitionne la géométrie de la scène en un \emph{adaptation set} qui contient les faces les plus grandes, et d'autres qui contiennent les faces restantes.

Nous enregistrons la position de chaque \emph{adaptation set}, caractérisée par les coordonnées de sa boîte englobante, dans le MPD comme une propriété supplémentaire de l'\emph{adaptation set}, sous la forme ``\textit{$x_{min}$, largeur, $y_{min}$, hauteur, $z_{min}$, profondeur}'' (comme indiqué dans le listing 1). Ces informations sont utilisées par le client pour implémenter un streaming dépendant de la vue (Section~\ref{fr:dashclientspec}).


\textbf{Gestion des textures.}
Avec les données de géométrie, nous gérons les textures en utilisant différents \emph{adaptation sets}, indépendants de ceux de la géométrie. Chaque fichier de texture correspond à un \emph{adaptation set} différent, avec différentes \emph{representations} (voir Section~\ref{fr:representation}) qui fournissent des résolutions différentes des images. Nous ajoutons à chaque \emph{adaptation set} de texture un attribut qui décrit la couleur moyenne de la texture. Le client peut se servir de cet attribut pour dessiner une face  dont la texture n'a pas encore été téléchargée avec une couleur uniforme naturelle (voir Figure~\ref{fr:textures}).


\subsection{Représentations\label{fr:representation}}
Chaque \emph{adaptation set} peut contenir une ou plusieurs \emph{representations} de la géométrie ou des textures, à différent niveaux de détail (par exemple, avec un nombre différent de faces).
Pour la géométrie, la résolution est hétérogène, et appliquer une représentation multi-résolution est pénible : l'aire des faces varie de $0.01$ à plus de $10K$, sans tenir compte des faces extrêmes.
Pour les scènes texturées, il est commun d'avoir des données hétérogènes puisque l'information peut être stockée soit sous forme de géométrie, soit sous forme de texture. Anisi, gérer un compromis entre géométrie et textures est plus adaptable que gérer une combinaison multi-résolution.
Pour chaque texture, nous générons des résolutions successives en divisant par 2 la hauteur et la largeur, en s'arrêtant lorsque l'image a une taille inférieure à $64 \times 64$.
La Figure~\ref{fr:textures} montre l'utilisation des textures comparée à l'affichage avec une seule couleur par face.

\begin{figure}[th]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=1\textwidth]{assets/dash-3d/average-color/full-res.png}
        \caption{Avec textures haute résolution}
    \end{subfigure}
    \begin{subfigure}[b]{0.45\textwidth}
        \includegraphics[width=1\textwidth]{assets/dash-3d/average-color/no-res.png}
        \caption{Avec les couleurs moyennes}
    \end{subfigure}
    \caption{Rendu du modèle avec différents styles de textures\label{fr:textures}}
\end{figure}

\subsection{Segments}
Pour permettre l'accès aléatoire au contenu au sein d'un \emph{adaptation set} de géométrie, nous groupons les faces en \emph{segments}. Chaque \emph{segment} est ensuite encodé en un fichier OBJ, qui peut être requêté individuellement par le client. Nous partitionnons les faces d'un \emph{adaptation set} en ensembles de $N_s$ faces, en triant les faces par aires décroissantes, et en plaçant ensuite les $N_s$ faces successives dans un \emph{segment}. Ainsi, le premier \emph{segment} contient les faces les plus grandes et le dernier les faces les plus petites. Pour les textures, chaque \emph{representation} contient un \emph{segment} unique.

\begin{figure}
    \lstset{
    language=xml,
    tabsize=3,
    %frame=lines,
    %caption={MPD description of a geometry adaptation set, and a texture adaptation set. %\CMTGM{do we really want to show 2 representations for geometry as we argue that a single resolution/representation is a good choice ? -> Should we rather show a texture adaptation set ?}\CMTTF{Here is an interesting part of MPD, do what you think is best.} The supplemental property values are the bounding box coordinates of the adaptation set.
    caption={Description d'un \emph{adaptation set} de géométrie, et un de texture, dans le MPD\@. %\CMTGM{do we really want to show 2 representations for geometry as we argue that a single resolution/representation is a good choice ? -> Should we rather show a texture adaptation set ?}\CMTTF{Here is an interesting part of MPD, do what you think is best.} The supplemental property values are the bounding box coordinates of the adaptation set.
    },
    label=fr:geometry-as-example,
    frame=single,
    rulesepcolor=\color{gray},
    xleftmargin=0pt,
    framexleftmargin=0pt,
    keywordstyle=\color{blue}\bf,
    commentstyle=\color{OliveGreen},
    stringstyle=\color{red},
    numbers=none,
    breaklines=true,
    showstringspaces=false,
    basicstyle=\scriptsize\ttfamily,
    emph={%
        MPD,
        Period,
        AdaptationSet,
        Representation,
        BaseURL,
        SegmentBase,
        Initialization,
        Role,
        SupplementalProperty,
        SegmentList,
        SegmentURL,
        Viewpoint
    },emphstyle={\color{DarkGreen}}}
    \lstinputlisting[language=XML]{assets/dash-3d/geometry-as.xml}\label{fr:MPD}
\end{figure}

