279 lines
8.0 KiB
TeX
279 lines
8.0 KiB
TeX
\chapter{Graphisme}
|
|
\label{chap:graphisme}
|
|
|
|
Voici quelques notes en vrac sur divers logiciels
|
|
ou bibliothèques de fonctions qui permettent
|
|
de faire des dessins et des images\dots
|
|
|
|
Nous verrons ici (dans le désordre) SDL, Povray, Flydraw, Fortran,
|
|
et peut-être d'autres dans un avenir incertain.
|
|
Mais il en existe d'autres~:
|
|
Gnuplot (page \pageref{chap:gnuplot}),
|
|
\texttt{gif89a} (page \pageref{chap:gif89a}),
|
|
le dessin (page \pageref{chap:dessin}),
|
|
les images (page \pageref{chap:image}) et
|
|
les photos (page \pageref{chap:photos})\dots
|
|
|
|
Le sujet est vaste, en fait.
|
|
|
|
% ------------------------------------------------
|
|
% nouveau : Tue Sep 3 11:14:13 UTC 2024
|
|
|
|
\section{SDL2} \index{SDL} \label{sdl}
|
|
|
|
\begin{quote}
|
|
Simple DirectMedia Layer est une bibliothèque de développement multiplateforme conçue pour fournir un accès de bas niveau à l'audio, au clavier, à la souris,
|
|
aux joysticks et à la vidéo (via OpenGL/Direct3D/Metal/Vulkan).
|
|
\end{quote}
|
|
|
|
\textbf{Attention}, à l'heure\footnote{Wed Sep 4 00:40:42 UTC 2024} qu'il est,
|
|
j'utilise une version assez ancienne\footnote{Mais je vais me soigner\dots},
|
|
donc
|
|
ce que vous allez lire à propos de SDL doit être pris avec des pincettes.
|
|
D'autre part, la version \textbf{3} est sortie depuis un certain temps,
|
|
mais beaucoup de logiciels n'ont pas encore fait la transition.
|
|
Nous allons rester pour le moment avec la version 2.
|
|
|
|
\subsection{Afficher la version}
|
|
|
|
Et puisque on parle de version, ils ont pris une approche vraiment
|
|
interessante (dont je devrais d'ailleurs m'inspirer) dans le cas de
|
|
l'édition de lien dynamique.
|
|
|
|
\begin{verbatim}
|
|
SDL_version compiled;
|
|
SDL_version linked;
|
|
SDL_VERSION(&compiled);
|
|
SDL_GetVersion(&linked);
|
|
printf("We compiled against SDL version %d.%d.%d ...\n",
|
|
compiled.major, compiled.minor, compiled.patch);
|
|
printf("But we linked against SDL version %d.%d.%d.\n",
|
|
linked.major, linked.minor, linked.patch);
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
% ------------------------------------------------
|
|
|
|
\subsection{Mon premier "bug"}
|
|
|
|
C'est en essayant quelques fonctions de la SDL dans le but de faire
|
|
un dégradé\footnote{On a toujours besoin de dégrader...} de couleurs
|
|
que je suis tombé sur une anomalie que je n'arrive pas (encore)
|
|
a m'expliquer.
|
|
|
|
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
|
|
|
|
Mias c'est peut-être ma totale méconnaissance du sujet qui m'a
|
|
fait faire une bêtise àlc\dots
|
|
|
|
% ------------------------------------------------
|
|
|
|
\section{Flydraw}\index{Flydraw}
|
|
|
|
Comment faire des dessins en écrivant des lignes de codes ?
|
|
|
|
\begin{quote}
|
|
flydraw is a drawing tool based on an interpreter which parses a
|
|
language featuring rich graphic primitives; it uses libgd to output
|
|
GIF, JPEG, or PNG\index{PNG} files.
|
|
\end{quote}
|
|
|
|
\lstinputlisting{code/dessiner.fly}
|
|
|
|
Pour le moment, les résultats ne sont pas encourageants~:
|
|
\begin{verbatim}
|
|
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
|
|
bad_parms -100000
|
|
tth@fubar:~/Documents/TetaTricks/code$
|
|
\end{verbatim}
|
|
|
|
Mais en s'obstinant un peu au \textsl{cargocult}, il
|
|
s'avère que la documentation et le code semble ne sont
|
|
pas d'accord. Et les messages d'erreur trop
|
|
cryptiques pour moi. Donc, on y arrive.
|
|
|
|
\begin{figure}[h]
|
|
\begin{center}
|
|
\includegraphics[scale=0.75]{code/flydraw}
|
|
\caption{Flydraw}
|
|
\end{center}
|
|
\end{figure}
|
|
|
|
Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra
|
|
de contourner ces petits désagréments, et de rédiger quelques exemples
|
|
d'utilisation amusants.
|
|
|
|
% package source
|
|
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz
|
|
|
|
%====================================================================
|
|
|
|
\section{Povray}\index{Povray}
|
|
|
|
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
|
|
existe depuis plus de trente ans. C'est un lointain descendant
|
|
de DKBtrace. Mais le raytracing, c'est quoi ?
|
|
|
|
\subsection{Caméra}
|
|
|
|
Vous avez des problèmes pour caler les mouvement de la caméra ?
|
|
Vous avez deux trajectoires (mal) calculées pour la
|
|
\texttt{location} et le \texttt{look\_at}, et rien ne tombe
|
|
en face de l'objectif ? Voici une approche de solution.
|
|
|
|
La première étape est l'enregistrerement des paramètres de la caméra
|
|
lors du calcul de la séquence~:
|
|
|
|
\begin{verbatim}
|
|
#if (0 = clock)
|
|
#fopen CL "cam.log" create
|
|
#else
|
|
#fopen CL "cam.log" append
|
|
#end
|
|
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
|
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
|
#fclose CL
|
|
\end{verbatim}
|
|
|
|
Et la seconde étape, l'exploitation, ou plutôt la visualisation
|
|
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
|
|
|
\begin{verbatim}
|
|
#!/bin/bash
|
|
|
|
FILE="cam.log"
|
|
TMPF="/dev/shm/cam.data"
|
|
IMAGE="graphe.png"
|
|
tail -360 ${FILE} | sort -n > ${TMPF}
|
|
gnuplot << __EOC__
|
|
set term png size 720,720
|
|
set output "${IMAGE}"
|
|
set ytics 2
|
|
set xtics 2
|
|
set grid front
|
|
set title "Rush Camera"
|
|
plot "${TMPF}" using 2:4 title "Cam", \
|
|
"${TMPF}" using 5:7 title "Lat" with dots
|
|
__EOC__
|
|
display "${IMAGE}" &
|
|
\end{verbatim}
|
|
|
|
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
|
|
la commande\texttt{tail} au début du script. Ensuite les deux clauses
|
|
\textsl{using 2:4 / 5:7} permettent de sélectionner les deux
|
|
coordonnées X et Z, dans le repère POVray, qui n'est pas le même que
|
|
celui de Gnuplot.
|
|
|
|
|
|
% ------------------------------------------------
|
|
\subsection{image\_map}
|
|
|
|
XXX \index{XXX}
|
|
|
|
% ------------------------------------------------
|
|
|
|
\subsection{height\_field}
|
|
|
|
Les champs d'altitude... Toute une histoire...
|
|
|
|
\begin{verbatim}
|
|
#declare Champ_Altitude = object
|
|
{
|
|
height_field {
|
|
png "WS/hf5.png" gamma 1.8
|
|
}
|
|
pigment { color Cyan }
|
|
scale 2
|
|
}
|
|
\end{verbatim}
|
|
|
|
Le paramètre \texttt{gamma} est injustement méconnu.
|
|
|
|
% ------------------------------------------------
|
|
|
|
\subsection{Random} \index{ramdom}
|
|
|
|
C'est un peu différent de ce à quoi les programmeurs « classiques »
|
|
sont habitués\footnote{Voir le random du C page \pageref{c-random}}.
|
|
Avant de pouvoir obtenir des nombres aléatoires, il faut créer et
|
|
initialiser un générateur~:
|
|
|
|
\texttt{\#declare RND = seed(13.37);}
|
|
|
|
Vous noterez au passage le fort degré alcolique de ce délicieux Corbière que je
|
|
déguste en ce moment même.
|
|
Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler}
|
|
que l'on vient d'obtenir~:
|
|
|
|
\texttt{\#local foo = rand(RND);}
|
|
|
|
Par contre, on va obtenir un résultat bien classique~:
|
|
\textsl{The numbers are uniformly distributed, and have values between
|
|
0.0 and 1.0,}
|
|
|
|
Pourquoi nous faut-il plusieurs générateurs ? La réponse est dans
|
|
la documentation\footnote{\texttt{https://wiki.povray.org/}}~:
|
|
\textsl{Multiple random generators are very useful in situations where you use
|
|
rand() to place a group of objects, and then decide to use rand()
|
|
in another location earlier in the file to set some colors or place
|
|
another group of objects.
|
|
Without separate rand() streams, all of your objects would move
|
|
when you added more calls to rand().
|
|
This is very annoying.}
|
|
|
|
Ce qui nous conduit vers une autre question. Les PRNG sont des machines
|
|
déterministes. C'est à dire qu'à conditions identiques au départ,
|
|
nous aurons toujours la même séquence en sortie.
|
|
|
|
... \index{XXX}
|
|
|
|
|
|
% ------------------------------------------------
|
|
|
|
\subsection{Trucs à voir}
|
|
|
|
Des bouts de code piochés à droite et à gauche...
|
|
|
|
\begin{verbatim}
|
|
#declare VIRGINIA =
|
|
transform {
|
|
matrix < 1, 1, 0,
|
|
0, 1, 0,
|
|
0, 0, 1,
|
|
0, 0, 0 >
|
|
}
|
|
box { 0, 1
|
|
transform {VIRGINIA}
|
|
}
|
|
\end{verbatim}
|
|
|
|
Pour faire un vaisseau spatial (Thomas de Groot dans povray.binaries.images)
|
|
|
|
\begin{verbatim}
|
|
// the color bleeding is done by emission color:
|
|
material {
|
|
texture {
|
|
pigment {rgb <0.50, 1.00, 1.00>}
|
|
finish {
|
|
specular 0 roughness 0.001
|
|
emission rgb <0.50, 1.00, 1.00>*5
|
|
diffuse 1
|
|
reflection {0} conserve_energy
|
|
}
|
|
}
|
|
}
|
|
\end{verbatim}
|
|
|
|
|
|
% ================================================
|
|
|
|
\section{Avec Fortran}
|
|
|
|
plplot\index{plplot} est une des pistes à explorer.
|
|
|
|
|
|
% ------------------------------------------------
|
|
|
|
% ------------------------------------------------
|