2021-06-28 17:51:43 +11:00
\chapter { Graphisme}
2024-09-16 12:26:04 +11:00
\label { chap:graphisme}
2021-06-28 17:51:43 +11:00
2024-09-16 12:26:04 +11:00
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}
2024-09-29 05:25:02 +11:00
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.
2021-09-17 03:53:40 +11:00
2021-06-28 17:51:43 +11:00
% ------------------------------------------------
2024-09-29 05:25:02 +11:00
%
% Fri Sep 27 14:09:45 UTC 2024
% la section sur flydram est partie dans les unused
%
2020-11-13 11:35:31 +11:00
2024-09-29 05:25:02 +11:00
%====================================================================
2020-11-13 11:35:31 +11:00
2024-09-29 05:25:02 +11:00
\section { Povray} \index { Povray} \label { Povray}
2021-10-05 07:24:01 +11:00
2024-09-29 05:25:02 +11:00
\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 ?
2021-06-28 17:51:43 +11:00
2024-09-29 05:25:02 +11:00
\vspace { 2em}
XXX\index { XXX} expliquer le raytracing.
2021-10-05 07:24:01 +11:00
2024-09-29 05:25:02 +11:00
% -----------------------------------------------------------------
\subsection { Première scène}
2021-10-05 07:24:01 +11:00
2024-09-29 05:25:02 +11:00
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} ..
2021-10-05 07:24:01 +11:00
2024-09-29 05:25:02 +11:00
\lstinputlisting [] { code/POV/hello.pov}
2021-10-05 07:24:01 +11:00
2024-09-29 05:25:02 +11:00
Quelques explications~:
2021-10-31 00:54:36 +11:00
2024-09-29 05:25:02 +11:00
% -----------------------------------------------------------------
\subsection { Deux langages, \small { \textsl { WTF?} } } \index { wtf}
2021-06-28 17:51:43 +11:00
2024-09-29 05:25:02 +11:00
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.
2021-06-28 17:51:43 +11:00
2024-09-29 05:25:02 +11:00
% -----------------------------------------------------------------
% -----------------------------------------------------------------
2021-06-28 17:51:43 +11:00
2021-09-17 03:53:40 +11:00
\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.
2024-09-29 05:25:02 +11:00
La première étape est l'enregistrement des paramètres de la caméra
(préalablement calculés par de savantes mais mauvaises formules)
2021-09-17 03:53:40 +11:00
lors du calcul de la séquence~:
\begin { verbatim}
#if (0 = clock)
2024-09-29 05:25:02 +11:00
#fopen CL "WS/cam.log" write
2021-09-17 03:53:40 +11:00
#else
2024-09-29 05:25:02 +11:00
#fopen CL "WS/cam.log" append
2021-09-17 03:53:40 +11:00
#end
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
" ", LatX, " ", LatY, " ", LatZ,"\n ")
#fclose CL
\end { verbatim}
2024-09-29 05:25:02 +11:00
Et la seconde étape, l'exploitation avec \textsc { R} ,
le logiciel de statistiques (que nous verrons bientôt),
ou la visualisation
2023-11-30 00:12:03 +11:00
de ces données avec l'indémodable gnuplot\index { gnuplot} ~:
2021-09-17 03:53:40 +11:00
\begin { verbatim}
#!/bin/bash
2024-09-29 05:25:02 +11:00
FILE="WS/cam.log"
2021-09-17 03:53:40 +11:00
TMPF="/dev/shm/cam.data"
IMAGE="graphe.png"
2021-09-22 22:17:46 +11:00
tail -360 $ { FILE } | sort - n > $ { TMPF}
2021-09-17 03:53:40 +11:00
gnuplot << _ _ EOC_ _
2024-09-29 05:25:02 +11:00
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
2021-09-17 03:53:40 +11:00
_ _ EOC_ _
display "$ { IMAGE } " &
\end { verbatim}
2021-09-22 22:17:46 +11:00
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
2024-09-29 05:25:02 +11:00
la commande \texttt { tail} au début du script. Ensuite les deux clauses
2021-09-22 22:17:46 +11:00
\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.
2022-01-30 08:46:41 +11:00
% ------------------------------------------------
2024-09-29 05:25:02 +11:00
% updated Fri Sep 27 13:41:54 UTC 2024
2022-01-30 08:46:41 +11:00
\subsection { image\_ map}
2024-09-29 05:25:02 +11:00
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}
2022-06-10 06:08:46 +11:00
2022-01-30 08:46:41 +11:00
% ------------------------------------------------
\subsection { height\_ field}
Les champs d'altitude... Toute une histoire...
\begin { verbatim}
#declare Champ_ Altitude = object
{
height_ field {
2022-06-24 12:19:32 +11:00
png "WS/hf5.png" gamma 1.8
}
2022-01-30 08:46:41 +11:00
pigment { color Cyan }
scale 2
}
\end { verbatim}
2022-06-24 12:19:32 +11:00
Le paramètre \texttt { gamma} est injustement méconnu.
2022-06-10 06:08:46 +11:00
% ------------------------------------------------
\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);}
2023-11-30 00:12:03 +11:00
Vous noterez au passage le fort degré alcolique de ce délicieux Corbière que je
2022-06-10 06:08:46 +11:00
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);}
2022-06-24 12:19:32 +11:00
Par contre, on va obtenir un résultat bien classique~:
2022-06-10 06:08:46 +11:00
\textsl { The numbers are uniformly distributed, and have values between
0.0 and 1.0,}
2022-06-24 12:19:32 +11:00
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}
2022-06-10 06:08:46 +11:00
2021-10-05 07:24:01 +11:00
% ------------------------------------------------
\subsection { Trucs à voir}
2024-03-11 12:20:47 +11:00
Des bouts de code piochés à droite et à gauche...
2021-10-05 07:24:01 +11:00
\begin { verbatim}
#declare VIRGINIA =
2022-01-30 08:46:41 +11:00
transform {
2021-10-05 07:24:01 +11:00
matrix < 1, 1, 0,
0, 1, 0,
0, 0, 1,
0, 0, 0 >
}
2022-01-30 08:46:41 +11:00
box { 0, 1
transform { VIRGINIA}
2021-10-05 07:24:01 +11:00
}
\end { verbatim}
2024-03-11 12:20:47 +11:00
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}
2023-03-21 10:16:54 +11:00
% ================================================
\section { Avec Fortran}
2024-09-16 12:26:04 +11:00
plplot\index { plplot} est une des pistes à explorer.
2023-03-21 10:16:54 +11:00
2021-09-17 03:53:40 +11:00
2021-06-28 17:51:43 +11:00
% ------------------------------------------------
% ------------------------------------------------