Compare commits

..

No commits in common. "032b2de00678d8698536c17d03f3daf05d63d541" and "b98e12481e7bd7d161889b5e95c14fb7a36d6503" have entirely different histories.

9 changed files with 47 additions and 38 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -17,42 +17,44 @@ body {
</p> </p>
<p align="center"> <p align="center">
<a href="https://git.fainsin.bzh/ENSEEIHT/projet-modelisation-geometrique">Lien vers le répertoire</a> <a href="https://git.inpt.fr/tocard-inc/enseeiht/porjet-modelisation-geometrique">Lien vers le répertoire</a>
</p> </p>
## Description ## Description
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. Lobjectif de ce projet était de construire, à partir des connaissances acquises durant le cours dinterpolation et dapproximation, un module sous Unity3D qui permet de réaliser un suivi de trajectoire de caméra en ne fournissant quun nombre restreint dinformations, à savoir quelques points (trois coordonnées spatiales, trois coordonnées axiales).
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. Nous avons décidé (avec l'accord de notre professeur, Julien Desvergnes) de modifier légèrement la consigne de ce projet. Nous avons opté pour le developpement d'un plugin pour un serveur [Minecraft](https://www.minecraft.net/fr-fr) [Spigot](https://www.spigotmc.org/), permettant aux joueurs de créer des travelings.
## API Spigot ## API Spigot
L'API Spigot nous permet d'interfacer avec le monde, les propriétés et les entités de notre serveur Minecraft. L'API Spigot nous permet d'interfacer avec le monde / les propriétés / les entités de notre serveur Minecraft.
É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/). Le serveur Minecraft ([paperMC](https://papermc.io/)) étant écrit en Java, nous devons utiliser ce langage de programmation pour développer notre plugin.
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. Pour développer notre plugin nous avons donc créé un environnement de developpement sous VSCode via le gestionnaire de dépendance Java: [Gradle](https://gradle.org/).
Afin d'améliorer le déploiement et le lancement du serveur Minecraft, nous avons également utilisé [Docker Compose](https://docs.docker.com/compose/). Pour compiler notre plugin nous pouvons générer une archive `.jar` via la commande `gradle jar`. Pour déployer notre plugin sur notre serveur, nous plaçons notre archive dans le dossier `plugins` de notre serveur.
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. Pour améliorer le déployment et le lancement du serveur Minecraft, nous avons de plus utilisé un [docker-compose](https://docs.docker.com/compose/).
Une fois le plugin déployé, et le serveur démarré, nous pouvons utiliser notre plugin. Si celui-ci n'est pas activé, nous pouvons utiliser la commande `/reload confirm` pour relancer les plugins.
## Choix de courbe ## Choix de courbe
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. Pour le traveling de notre caméra, nous utilisons des courbes de Bezier. Pour réaliser la courbe complète, nous faisons suivre des courbes de degrés 3.
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. La courbe finale s'apparente à une spline mais nous avons choisi ce type de modélisation car nous souhaitons que notre caméra passe exactement par certains points de contrôles (interpolation). Il est ainsi plus intuitif pour l'utilisateur de modifier la courbe.
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. Ces courbes de bézier sont générées par évaluation, nous avons fait ce choix car la subdivision semblait peu adapté à la génération d'un nombre de point précis. De plus, le temps de calcule de la courbe reste négligeable, l'optimisation temporelle que permettrait la subdivision ne serait pas perceptible.
É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. Puisque la caméra dans Minecraft ne permet pas de rotation "row", nous avons directement interpolé nos rotations selon un schéma de bézier (sans passer par des quaternions).
### Avantages / Inconvénients ### Avantages / Inconvénients
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. Grace a cette méthode, nous pouvons interpolé des points tout en gardant le contrôle sur la courbe. On arrive donc à obtenir une courbe très maléable tout en restant stable. Parcontre, le placement des points de contrôle peut devenir assez long si l'on souhaite obtenir une trajectoire très precise étant donné qu'il y a quatre points à gérer par segment.
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. Un autre point positif de cette construction est que nous avons le choix de positionner les points (grâce a une commande) de sorte que la courbe soit $C^1$.
### Démonstrations mathématiques ### Démonstrations mathématiques
@ -89,58 +91,65 @@ video {
<table> <table>
<tr> <tr>
<td> <td>
<video src="tuto.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/tuto.webm" autoplay loop controls></video>
</td> </td>
<td> <td>
<video src="circle.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/circle.webm" autoplay loop controls></video>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<video src="waterfall.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/waterfall.webm" autoplay loop controls></video>
</td> </td>
<td> <td>
<video src="island.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/island.webm" autoplay loop controls></video>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<video src="demo_show.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/demo_show.webm" autoplay loop controls></video>
</td> </td>
<td> <td>
<video src="demo_noshow.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/demo_noshow.webm" autoplay loop controls></video>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<video src="full_show.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/full_show.webm" autoplay loop controls></video>
</td> </td>
<td> <td>
<video src="full_noshow.webm" autoplay loop controls></video> <video src="https://fainsil.users.inpt.fr/content/ModéGéom/full_noshow.webm" autoplay loop controls></video>
</td> </td>
</tr> </tr>
</table> </table>
## Conclusion ## Conclusion
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. Notre interpolation fonctionne bien, nos résultats sont satisfaisants.
É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. Seul bémol, notre serveur fonctionne assez lentement par rapport au serveur.
Tandis qu'un client Minecraft tourne au minimum à 60 fps, notre serveur étant monothreadé, celui-ci "tourne" plutôt aux alentour des 20 tps. On obtient alors un rendu avec quelques secousses dans certains cas.
## Les commandes utiles ## Les commandes utiles
Voici une liste des commandes utiles pour utiliser le plugin : `/show` permet d'afficher/cacher la courbe et les points de contrôle.
- `/show` : permet d'afficher ou de cacher la courbe et les points de contrôle. `/exec [true/false] [#start] [#end]` permet de lancer le traveling en commençant à la `#start` courbe et en s'arretant à la `#end`. L'attribut `true/false` permet de se déplacer de manière plus fluide le long de la courbe (cependant il est expérimental, il n'y a pas d'interpolation des rotations).
- `/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. `/close` : ferme/ouvre la courbe et passe en mode repeat/simple.
- `/point <add|rm|set|fix> [index]` :
- `add` : ajoute un point à la suite de la courbe. `/point <add|rm|set|fix> [index]` \
- `rm` : supprime le groupe de points indiqué. `add` : ajoute un point à la suite de la courbe. \
- `set` : déplace le point indiqué. `rm` : enlève le groupe de point indiqué. \
- `fix` : modifie le point indiqué de manière à ce que la courbe soit $C^1$. `set` : déplace le point indiqué. \
- `/reset` : supprime tous les points de contrôle. `fix` : modifie le point indiqué de sorte à ce que la courbe soit $C^1$.
- `/save <file>` : sauvegarde les points de contrôle actuels dans un fichier.
- `/load <file>` : charge les points de contrôle à partir d'un fichier. `/reset` : supprime l'entièreté des points.
- `/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. `/save <file>` : permet de sauvegarder les points actuels dans un fichier.
`/load <file>` : permet de charger les points dans un fichier.
`/points` : permet de lister l'ensemble de points de contrôle éxistant.
`/runas <player> <command>` : exécute une commande à la place d'un autre joueur.

Binary file not shown.

Binary file not shown.