309 lines
9.3 KiB
TeX
309 lines
9.3 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}
|
|
|
|
C'est peut-être ma totale méconnaissance du sujet qui m'a
|
|
fait faire une bêtise àlc, et je ne vois pas laquelle\dots
|
|
Une enquête est en préparation.
|
|
|
|
% ------------------------------------------------
|
|
%
|
|
% Fri Sep 27 14:09:45 UTC 2024
|
|
% la section sur flydram est partie dans les unused
|
|
%
|
|
|
|
%====================================================================
|
|
|
|
\section{Povray}\index{Povray}\label{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 ?
|
|
|
|
\vspace{2em}
|
|
XXX\index{XXX} expliquer le raytracing.
|
|
|
|
% -----------------------------------------------------------------
|
|
\subsection{Première scène}
|
|
|
|
Le "hello world" du raytracing, c'est la boule miroir au
|
|
dessus d'un sol à carreaux, deux éléments.
|
|
Mais nous aurons aussi besoin de lumière et d'une caméra
|
|
pour y voir quelque chose.
|
|
Respectons la tradition, et tentons un EMC\index{EMC}..
|
|
|
|
\lstinputlisting[]{code/POV/hello.pov}
|
|
|
|
Quelques explications~:
|
|
|
|
|
|
% -----------------------------------------------------------------
|
|
\subsection{Deux langages, \small{\textsl{WTF?}}} \index{wtf}
|
|
|
|
En fait, les grands fichiers que vous écrivez pour construire
|
|
vos scènes contiennent \textbf{deux} langages différents.
|
|
Le premier décrit le contenu de la scène : les objets, les
|
|
textures, les lumières, la caméra\dots
|
|
C'est pour ça qu'il est appelé SDL\index{SDL},
|
|
\textsl{Scene Dscription Language}.
|
|
Le second est plutôt un langage de
|
|
programmation\footnote{Turing complet ?}
|
|
avec des variables, des tests, des boucles, des \textsl{io},
|
|
et tout ce genre de choses.
|
|
Et les deux sont entrelacés, ce qui est une bonne chose,
|
|
même si ça conduit à du code qui pique les yeux.
|
|
|
|
% -----------------------------------------------------------------
|
|
% -----------------------------------------------------------------
|
|
|
|
\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'enregistrement des paramètres de la caméra
|
|
(préalablement calculés par de savantes mais mauvaises formules)
|
|
lors du calcul de la séquence~:
|
|
|
|
\begin{verbatim}
|
|
#if (0 = clock)
|
|
#fopen CL "WS/cam.log" write
|
|
#else
|
|
#fopen CL "WS/cam.log" append
|
|
#end
|
|
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
|
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
|
#fclose CL
|
|
\end{verbatim}
|
|
|
|
Et la seconde étape, l'exploitation avec \textsc{R},
|
|
le logiciel de statistiques (que nous verrons bientôt),
|
|
ou la visualisation
|
|
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
|
|
|
\begin{verbatim}
|
|
#!/bin/bash
|
|
|
|
FILE="WS/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.
|
|
|
|
|
|
% ------------------------------------------------
|
|
% updated Fri Sep 27 13:41:54 UTC 2024
|
|
\subsection{image\_map}
|
|
|
|
Autre composante essentielle du raytracing, le collage d'une
|
|
image sur quelque chose, comme quand vous recouvrez une
|
|
boite de Camembert\index{Camenbert} avec du papier peint
|
|
des années 50.
|
|
Il suffit d'utiliser les pixels de l'image comme pigment.
|
|
|
|
\begin{verbatim}
|
|
plane { -z,0 pigment { image_map {png "Eggs.png"} } }
|
|
\end{verbatim}
|
|
|
|
\textsl{By default, the image is mapped onto the
|
|
\textbf{x-y-plane}.
|
|
The
|
|
image is projected onto the object as though there were a
|
|
slide projector somewhere in the -z-direction.
|
|
The image
|
|
exactly fills the square area from (x,y) coordinates
|
|
(0,0) to (1,1) regardless of the image's original size in
|
|
pixels.
|
|
If you would like to change this default you may
|
|
translate, rotate or scale the pigment or texture to map
|
|
it onto the object's surface as desired.
|
|
}%
|
|
\footnote{https://wiki.povray.org/content/Reference:Image\_Map}
|
|
|
|
% ------------------------------------------------
|
|
|
|
\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.
|
|
|
|
|
|
% ------------------------------------------------
|
|
|
|
% ------------------------------------------------
|