projet-modelisation-geometr.../docs/rapport.md

147 lines
6.9 KiB
Markdown
Raw Normal View History

<h1 align="center">
Projet de Modélisation Géométrique<br>
Création et suivi de trajectoire de caméras<br>
Option longue 1
</h1>
2022-05-24 16:59:55 +00:00
<style>
body {
text-align: justify;
max-width: 60rem;
}
</style>
2022-05-24 16:46:07 +00:00
<p align="center">
<a href="mailto:laurent.fainsin@etu.inp-n7.fr">Laurent Fainsin</a> &mdash;
<a href="mailto:damien.guillotin@etu.inp-n7.fr">Damien Guillotin</a>
</p>
2022-05-24 16:54:41 +00:00
<p align="center">
2023-06-27 19:01:13 +00:00
<a href="https://git.fainsin.bzh/ENSEEIHT/projet-modelisation-geometrique">Lien vers le répertoire</a>
2022-05-24 16:54:41 +00:00
</p>
## Description
2023-06-27 19:01:13 +00:00
L'objectif de ce projet était de construire un module sous Unity3D permettant de réaliser un suivi de trajectoire de caméra en utilisant des techniques d'interpolation et d'approximation. Le module devait être capable de fonctionner avec un nombre restreint d'informations, c'est-à-dire quelques points spécifiques comprenant trois coordonnées spatiales et trois coordonnées axiales.
2023-06-27 19:01:13 +00:00
Après avoir obtenu l'accord de notre professeur, Julien Desvergnes, nous avons décidé de modifier légèrement les consignes du projet. Nous avons choisi de développer un plugin pour le serveur [Minecraft](https://www.minecraft.net/fr-fr) [Spigot](https://www.spigotmc.org/), permettant aux joueurs de créer des trajets de caméra animés.
## API Spigot
2023-06-27 19:01:13 +00:00
L'API Spigot nous permet d'interfacer avec le monde, les propriétés et les entités de notre serveur Minecraft.
2023-06-27 19:01:13 +00:00
Étant donné que le serveur Minecraft ([PaperMC](https://papermc.io/)) est écrit en Java, nous avons utilisé ce langage de programmation pour développer notre plugin. Pour cela, nous avons créé un environnement de développement sous VSCode en utilisant le gestionnaire de dépendances Java appelé [Gradle](https://gradle.org/).
2023-06-27 19:01:13 +00:00
Pour compiler notre plugin, nous générons une archive `.jar` en exécutant la commande `gradle jar`. Pour déployer notre plugin sur le serveur, nous plaçons simplement cette archive dans le dossier `plugins` du serveur.
2023-06-27 19:01:13 +00:00
Afin d'améliorer le déploiement et le lancement du serveur Minecraft, nous avons également utilisé [Docker Compose](https://docs.docker.com/compose/).
2023-06-27 19:01:13 +00:00
Une fois le plugin déployé et le serveur démarré, nous pouvons l'utiliser. S'il n'est pas activé, il suffit d'exécuter la commande `/reload confirm` pour redémarrer les plugins.
## Choix de courbe
2023-06-27 19:01:13 +00:00
Pour le déplacement de notre caméra, nous utilisons des courbes de Bézier. Nous utilisons des courbes de degré 3 pour obtenir une courbe complète.
2023-06-27 19:01:13 +00:00
La courbe finale ressemble à une spline, mais nous avons choisi ce type de modélisation car nous voulions que notre caméra passe précisément par certains points de contrôle (interpolation). Cela rend la modification de la courbe plus intuitive pour l'utilisateur.
2023-06-27 19:01:13 +00:00
Nous générons ces courbes de Bézier par évaluation, car la subdivision ne semblait pas adaptée à la génération d'un nombre précis de points. De plus, le temps de calcul de la courbe reste négligeable, et les gains de performance obtenus avec la subdivision ne seraient pas perceptibles.
2023-06-27 19:01:13 +00:00
Étant donné que la caméra dans Minecraft ne permet pas de rotation "row", nous avons directement interpolé les rotations en utilisant une courbe de Bézier sans passer par des quaternions.
### Avantages / Inconvénients
2023-06-27 19:01:13 +00:00
Cette méthode nous permet d'interpoler des points tout en gardant le contrôle sur la courbe. Nous parvenons ainsi à obtenir une courbe très flexible tout en restant stable. Cependant, le placement des points de contrôle peut prendre du temps si l'on souhaite obtenir une trajectoire très précise, car il faut gérer quatre points par segment.
2023-06-27 19:01:13 +00:00
Un autre avantage de cette approche est que nous pouvons positionner les points de manière à obtenir une courbe $C^1$ en utilisant une commande spécifique.
2022-05-24 16:46:07 +00:00
### Démonstrations mathématiques
Les polynomes de Bernstein sont definit comme étant :
2022-05-24 12:19:27 +00:00
$\displaystyle B_k^n(t) = \binom{n}{k} t^k (1 - t)^{n-k}$
Le $i^{ème}$ tronçon de courbe est alors définit par :
2022-05-24 12:19:27 +00:00
$\displaystyle S_i(t) = \sum_{k=0}^{n} P_i^k\ B_k^n(t)$
Pour garder le caractère $C^1$ de la courbe, il faut donc que la dérivé en $1$ du $i^{ème}$ tronçon soit égale à la dérivé en $0$ du $i^{ème}+1$.
2022-05-24 12:19:27 +00:00
Soit,
2022-05-24 12:19:27 +00:00
$\displaystyle S_i'(1) = S_{i + 1}'(0)$
avec,
$\displaystyle S_i'(t) = n \sum_{k=0}^{n - 1} (P_i^{k + 1} - P_i^k)\ B_k^{n - 1}(t)$
Ce qui fait :
2022-05-24 12:19:27 +00:00
$\displaystyle n (P_i^{n} - P_i^{n - 1}) = n (P_{i + 1}^{1} - P_{i + 1}^{0})$
Le résultat $\displaystyle P_i^{n} - P_i^{n - 1} = P_{i + 1}^{1} - P_{i + 1}^{0}$ se traduit géométriquement par l'alignement et l'équidistance des points de contrôle à l'ancre à la qu'elle ils sont ratachés.
## Démonstrations
2022-05-24 12:19:27 +00:00
<style>
video {
max-width: 100%;
}
</style>
<table>
<tr>
<td>
2023-06-27 19:01:13 +00:00
<video src="tuto.webm" autoplay loop controls></video>
</td>
<td>
2023-06-27 19:01:13 +00:00
<video src="circle.webm" autoplay loop controls></video>
2022-05-24 12:19:27 +00:00
</td>
</tr>
<tr>
<td>
2023-06-27 19:01:13 +00:00
<video src="waterfall.webm" autoplay loop controls></video>
2022-05-24 12:19:27 +00:00
</td>
<td>
2023-06-27 19:01:13 +00:00
<video src="island.webm" autoplay loop controls></video>
2022-05-24 12:19:27 +00:00
</td>
</tr>
<tr>
<td>
2023-06-27 19:01:13 +00:00
<video src="demo_show.webm" autoplay loop controls></video>
2022-05-24 12:19:27 +00:00
</td>
<td>
2023-06-27 19:01:13 +00:00
<video src="demo_noshow.webm" autoplay loop controls></video>
</td>
</tr>
<tr>
<td>
2023-06-27 19:01:13 +00:00
<video src="full_show.webm" autoplay loop controls></video>
</td>
<td>
2023-06-27 19:01:13 +00:00
<video src="full_noshow.webm" autoplay loop controls></video>
2022-05-24 12:19:27 +00:00
</td>
</tr>
</table>
## Conclusion
2023-06-27 19:01:13 +00:00
Notre interpolation fonctionne bien et nous sommes satisfaits des résultats obtenus. Cependant, nous avons remarqué un problème de performances au niveau de notre serveur par rapport au client Minecraft.
2023-06-27 19:01:13 +00:00
Étant donné que notre serveur est monothreadé, il fonctionne à environ 20 ticks par seconde (tps), tandis qu'un client Minecraft tourne au minimum à 60 images par seconde (fps). Cette différence de vitesse peut entraîner quelques secousses dans certains cas lors du rendu.
## Les commandes utiles
2023-06-27 19:01:13 +00:00
Voici une liste des commandes utiles pour utiliser le plugin :
- `/show` : permet d'afficher ou de cacher la courbe et les points de contrôle.
- `/exec [true/false] [#start] [#end]` : lance le traveling en commençant à la position `#start` et en s'arrêtant à la position `#end`. L'attribut `true/false` permet un déplacement plus fluide le long de la courbe (expérimental, sans interpolation des rotations).
- `/close` : ferme ou ouvre la courbe et passe en mode repeat/simple.
- `/point <add|rm|set|fix> [index]` :
- `add` : ajoute un point à la suite de la courbe.
- `rm` : supprime le groupe de points indiqué.
- `set` : déplace le point indiqué.
- `fix` : modifie le point indiqué de manière à ce que la courbe soit $C^1$.
- `/reset` : supprime tous les points de contrôle.
- `/save <file>` : sauvegarde les points de contrôle actuels dans un fichier.
- `/load <file>` : charge les points de contrôle à partir d'un fichier.
- `/points` : affiche la liste de tous les points de contrôle existants.
- `/runas <player> <command>` : exécute une commande à la place d'un autre joueur.