Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: d07cf796a2
Fetching contributors…

Cannot retrieve contributors at this time

155 lines (115 sloc) 5.667 kB
\documentclass[10pt]{article}
\usepackage{times}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{parskip}
\usepackage{multicol}
\usepackage{url}
\hyphenation{RotateX SetRotationX}
\begin{document}
\title{IFT3355 - Rapport TP1}
\author{Vincent Foley-Bourgon (FOLV08078309) \\
Eric Thivierge (THIE09016601)}
\maketitle
\section{Description du problème}
À partir du squelette d'un projet dans lequel il existe du code pour:
\begin{itemize}
\item Manipuler des vecteurs
\item Manipuler des matrices
\item Effectuer des transformations sur des objets visuels
\item Organiser des objets visuels dans une hiérarchie
\item Afficher une surface d'eau
\end{itemize}
nous devons écrire le code pour ajouter un objet bateau et des objets
bouées. Voici les spécifications pour le bateau:
\begin{itemize}
\item Il doit posséder une coque qui est le base du bateau
\item Deux roues avec des palmes qui s'animent selon le mouvement du
bateau
\item On doit pouvoir contrôler son orientation gauche/droite avec le
clavier
\item On doit pouvoir contrôler son mouvement avant/derrière avec le
clavier
\item Son mouvement doit être influencé par celui de l'eau
\end{itemize}
Pour les bouées, voici leurs spécifications:
\begin{itemize}
\item Elles doivent posséder un drapeau qui change de couleur lors
d'un collision avec le bateau ou avec une autre bouée
\item Leur mouvement doit être influencé par celui de l'eau
\item Elles doivent pouvoir être déplacés en les poussant avec le
bateau. De plus, une bouée poussée par le bateau peut pousser une
autre bouée.
\end{itemize}
\section{Techniques utilisées}
\subsection{Détection des collisions bateau/bouée}
Afin de détecter une collision entre le bateau et une bouée, nous
avons adapté l'algorithme de Cohen-Sutherland (TBRL). Dans un plan
commun (celui du bateau), on calcule le code TBRL du centre de la
bouée par rapport au bateau. Nous vérifions ensuite si la distance
entre le centre de la bouée et le bord du bateau est plus petite que
le rayon de la bouée. Si c'est le cas, on repousse la bouée (par une
translation) pour qu'elle soit à une distance égale à la moitié de la
longueur (ou largeur) du bateau plus le rayon de la bouée.
\subsection{Détection des collisions bouée/bouée}
Pour détecter s'il existe une collision entre deux bouées, on calcul
la distance entre leur deux centres et si cette distance est moins que
la somme de leur rayon, alors il y a collision. On effectue une
répulsion des deux bouées dans des directions opposées.
Un bogue existe dans cette implantation; si deux boués se touchent
lorsque qu'elles sont créées, leur drapeau sera allumé. Comme ce cas
ne risque de pas se produire très souvent, nous avons accepté cette
défaillance afin de garder notre code plus simple.
\subsection{Transformations}
La plupart des transformations des objets constituant le bateau et les
bouées sont faites par des multiplications de matrices. Une exception
importante est le calcul de la translation du bateau vers l'avant et
l'arrière qui est calculé coordonné par coordonné. Voir la section
\ref{dir-bateau} pour plus d'informations.
\section{Problèmes et solutions}
\subsection{Ordre des transformations}
Nous avions des problèmes d'affichage dû à la multiplication dans le
mauvais ordre des matrices de translation, de rotation et de mise à
l'échelle. Utiliser l'ordre \emph{TRS} a réglé le problème.
\label{dir-bateau}
\subsection{Direction du bateau}
Initialement, nous avions effectué un déplacement du bateau en faisant
une translation $[0, 0, dist]$. Nous nous sommes vite aperçu qu'en
faisant cela, le bateau avançait toujours dans la même direction.
Clairement problématique!
Nous savions que les informations de rotation se trouvaient dans la
matrice de transformation du bateau, mais ne savions pas de quelle
façon les extraire. Nous avons donc résolu le problème en gardant en
mémoire, dans une variable d'instance, l'angle courant. On peut
ensuite calculer la bonne translation avec la formule suivante:
\[
[dt\cos(angle), 0, dt\sin(angle)]
\]
Une amélioration possible consisterait à trouver comment utiliser les
informations de rotation dans la matrice de transformation.
\subsection{Tangage du bateau}
Afin de suivre le mouvement des vagues, nous avions initialement
utilisé l'approche suivante: nous calculions la hauteur en trois
points de la coque (trois coins) et calculions les angles et faisions
la rotation selon ces angles. Cette technique fonctionnait, mais le
mouvement du bateau n'était pas naturel.
Nous avons donc utilisé la normale de la vague se trouvant sous le
centre de la coque pour calculer l'angle. Cela donne un mouvement
beaucoup plus naturel. Nous avons également diminué la vitesse du
bateau pour que le mouvement sur les vagues soit moins saccadé.
\subsection{Décollage des bouées}
Tout comme le bateau, les bouées doivent être doucement bercées par le
rythme des vagues. À notre grande surprise, les bouées avaient plutôt
l'air de faire du break dance sur l'eau avant de s'envoler pour ne
jamais plus réapparaître.
Ce phénomène s'explique du fait qu'on utilisait les méthodes
\emph{RotateX} plutôt que \emph{SetRotationX}; les angles étaient
additionnés, ce qui causait les mouvement erratiques des bouées.
\section{Références}
Trigonometry, Wikipedia, \url{http://en.wikipedia.org/wiki/Trigonometry}
Linear algebra, Wikipedia, \url{http://en.wikipedia.org/wiki/Linear_algebra}
\end{document}
Jump to Line
Something went wrong with that request. Please try again.