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

360 lines
12 KiB
HTML
Raw Normal View History

2022-05-24 16:46:07 +00:00
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>rapport</title>
<style>
html {
line-height: 1.5;
font-family: Georgia, serif;
font-size: 20px;
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 1em;
}
h1 {
font-size: 1.8em;
}
}
@media print {
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
font-size: 85%;
margin: 0;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
</style>
<script defer=""
src="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.js"></script>
<script>document.addEventListener("DOMContentLoaded", function () {
var mathElements = document.getElementsByClassName("math");
var macros = [];
for (var i = 0; i < mathElements.length; i++) {
var texText = mathElements[i].firstChild;
if (mathElements[i].tagName == "SPAN") {
katex.render(texText.data, mathElements[i], {
displayMode: mathElements[i].classList.contains('display'),
throwOnError: false,
macros: macros,
fleqn: false
});
}}});
</script>
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.css" />
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<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>
<div style="
text-align:justify;
max-width:800;
margin-left: auto;
margin-right: auto;
">
<p align="center">
<a href="mailto:laurent.fainsin@etu.inp-n7.fr">Laurent Fainsin</a>
<a href="mailto:damien.guillotin@etu.inp-n7.fr">Damien Guillotin</a>
</p>
<h2 id="description">Description</h2>
<p>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).</p>
<p>Nous avons décidé (avec laccord de notre professeur, Julien
Desvergnes) de modifier légèrement la consigne de ce projet. Nous avons
opté pour le developpement dun plugin pour un serveur <a
href="https://www.minecraft.net/fr-fr">Minecraft</a> <a
href="https://www.spigotmc.org/">Spigot</a>, permettant aux joueurs de
créer des travelings.</p>
<h2 id="api-spigot">API Spigot</h2>
<p>LAPI Spigot nous permet dinterfacer avec le monde / les propriétés
/ les entités de notre serveur Minecraft.</p>
<p>Le serveur Minecraft (<a href="https://papermc.io/">paperMC</a>)
étant écrit en Java, nous devons utiliser ce langage de programmation
pour développer notre plugin.</p>
<p>Pour développer notre plugin nous avons donc créé un environnement de
developpement sous VSCode via le gestionnaire de dépendance Java: <a
href="https://gradle.org/">Gradle</a>.</p>
<p>Pour compiler notre plugin nous pouvons générer une archive
<code>.jar</code> via la commande <code>gradle jar</code>. Pour déployer
notre plugin sur notre serveur, nous plaçons notre archive dans le
dossier <code>plugins</code> de notre serveur.</p>
<p>Pour améliorer le déployment et le lancement du serveur Minecraft,
nous avons de plus utilisé un <a
href="https://docs.docker.com/compose/">docker-compose</a>.</p>
<p>Une fois le plugin déployé, et le serveur démarré, nous pouvons
utiliser notre plugin. Si celui-ci nest pas activé, nous pouvons
utiliser la commande <code>/reload confirm</code> pour relancer les
plugins.</p>
<h2 id="choix-de-courbe">Choix de courbe</h2>
<p>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.</p>
<p>La courbe finale sapparente à 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 lutilisateur de modifier la courbe.</p>
<p>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 dun
nombre de point précis. De plus, le temps de calcule de la courbe reste
négligeable, loptimisation temporelle que permettrait la subdivision ne
serait pas perceptible.</p>
<p>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).</p>
<h3 id="avantages-inconvénients">Avantages / Inconvénients</h3>
<p>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 lon souhaite obtenir une
trajectoire très precise étant donné quil y a quatre points à gérer par
segment.</p>
<p>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 <span class="math inline">C^1</span>.</p>
<h3 id="démonstrations-mathématiques">Démonstrations mathématiques</h3>
<p>Les polynomes de Bernstein sont definit comme étant :</p>
<p><span class="math inline">\displaystyle B_k^n(t) = \binom{n}{k} t^k
(1 - t)^{n-k}</span></p>
<p>Le <span class="math inline">i^{ème}</span> tronçon de courbe est
alors définit par :</p>
<p><span class="math inline">\displaystyle S_i(t) = \sum_{k=0}^{n}
P_i^k\ B_k^n(t)</span></p>
<p>Pour garder le caractère <span class="math inline">C^1</span> de la
courbe, il faut donc que la dérivé en <span class="math inline">1</span>
du <span class="math inline">i^{ème}</span> tronçon soit égale à la
dérivé en <span class="math inline">0</span> du <span
class="math inline">i^{ème}+1</span>.</p>
<p>Soit, <span class="math inline">\displaystyle S_i&#39;(1) = S_{i +
1}&#39;(0)</span></p>
<p>avec, <span class="math inline">\displaystyle S_i&#39;(t) = n
\sum_{k=0}^{n - 1} (P_i^{k + 1} - P_i^k)\ B_k^{n - 1}(t)</span></p>
<p>Ce qui fait :</p>
<p><span class="math inline">\displaystyle n (P_i^{n} - P_i^{n - 1}) = n
(P_{i + 1}^{1} - P_{i + 1}^{0})</span></p>
<p>Le résultat <span class="math inline">\displaystyle P_i^{n} - P_i^{n
- 1} = P_{i + 1}^{1} - P_{i + 1}^{0}</span> se traduit géométriquement
par lalignement et léquidistance des points de contrôle à lancre à la
quelle ils sont ratachés.</p>
<h2 id="démonstrations">Démonstrations</h2>
<style>
video {
max-width: 100%;
}
</style>
<table>
<tr>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/tuto.webm" autoplay loop controls>
</video>
</td>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/circle.webm" autoplay loop controls>
</video>
</td>
</tr>
<tr>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/waterfall.webm" autoplay loop controls>
</video>
</td>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/island.webm" autoplay loop controls>
</video>
</td>
</tr>
<tr>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/demo_show.webm" autoplay loop controls>
</video>
</td>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/demo_noshow.webm" autoplay loop controls>
</video>
</td>
</tr>
<tr>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/full_show.webm" autoplay loop controls>
</video>
</td>
<td>
<video src="https://fainsil.users.inpt.fr/content/ModéGéom/full_noshow.webm" autoplay loop controls>
</video>
</td>
</tr>
</table>
<h2 id="conclusion">Conclusion</h2>
<p>Notre interpolation fonctionne bien, nos résultats sont
satisfaisants.</p>
<p>Seul bémol, notre serveur fonctionne assez lentement par rapport au
serveur. Tandis quun 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.</p>
<h2 id="les-commandes-utiles">Les commandes utiles</h2>
<p><code>/show</code> permet dafficher/cacher la courbe et les points
de contrôle.</p>
<p><code>/exec [true/false] [#start] [#end]</code> permet de lancer le
traveling en commençant à la <code>#start</code> courbe et en sarretant
à la <code>#end</code>. Lattribut <code>true/false</code> permet de se
déplacer de manière plus fluide le long de la courbe (cependant il est
expérimental, il ny a pas dinterpolation des rotations).</p>
<p><code>/close</code> : ferme/ouvre la courbe et passe en mode
repeat/simple.</p>
<p><code>/point &lt;add|rm|set|fix&gt; [index]</code><br />
<code>add</code> : ajoute un point à la suite de la courbe.<br />
<code>rm</code> : enlève le groupe de point indiqué.<br />
<code>set</code> : déplace le point indiqué.<br />
<code>fix</code> : modifie le point indiqué de sorte à ce que la courbe
soit <span class="math inline">C^1</span>.</p>
<p><code>/reset</code> : supprime lentièreté des points.</p>
<p><code>/save &lt;file&gt;</code> : permet de sauvegarder les points
actuels dans un fichier.</p>
<p><code>/load &lt;file&gt;</code> : permet de charger les points dans
un fichier.</p>
<p><code>/points</code> : permet de lister lensemble de points de
contrôle éxistant.</p>
<p><code>/runas &lt;player&gt; &lt;command&gt;</code> : exécute une
commande à la place dun autre joueur.</p>
</div>
</body>
</html>