libtthimage/Docs/img-povhf15.html

254 lines
9.6 KiB
HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>libimage: les height_fields de POVray</title>
<link rel="stylesheet" type="text/css" href="libimage.css">
<meta name="generator" content="Vim et huile de phalange">
<meta name="keywords" content="libimage, 3d de merde, POVRAY">
</head>
<body>
<a name="top"><h1>libimage / les height_fields de POVray</h1></a>
<p align=center>
<tt>dernière mise à jour: 16 octobre 2013</tt><br>
<i>
<a href="http://tboudet.free.fr/libimage/img-povhf15.html">#</a> et
<a href="http://la.buvette.org/devel/libimage/img-povhf15.html">#</a>
</i>
</p>
<p class="menuhaut">
[<a href="libimage.html">libimage</a>]
[<a href="#fonctions">fonctions</a>]
[<a href="#traitements">traitements</a>]
[<a href="#mixages">mixages</a>]<br>
[<a href="image77.html#povray">fortran</a>]
[<a href="#bruit">bruitage</a>]
[<a href="#synth">synthèse</a>]
[<a href="#liens">liens</a>]
</p>
<p>
Pour savoir ce qu'est un <b>height_field</b>, consultez le site de
<a href="http://www.povray.org/">POVray</a>, et fouillez la doc.
Vous pouvez aussi en
<a href="http://krabulator.free.fr/exPOV/current/ex13.jpg">regarder un</a>
pour vous faire une idée...
</p>
<p>
En fait, un <b>height_field</b> est un &quot;champ d'altitude&quot;, une
sorte de matrice à deux dimensions dont chaque cellule représente une hauteur.
Cette hauteur est un nombre codé sur 15 bits, donc entre 0 et 32767.
Les gens de <a href="http://www.povray.org/">POVray</a> ont choisi, entre
autres solutions, de stocker cette altitude dans des images .TGA en mettant
les 7 bits de poids fort dans le canal rouge et les 8 bits de poids
faible dans le canal vert.
</p>
<a name="fonctions"><h2>fonctions de base</h2></a>
<dl class="proto">
<dt>int Image_hf15_plot(Image_Desc *im, int x, int y, int h);
<dd>Place un point de hauteur <b>h</b> (entre 0 et 32768) aux coordonnées
x et y. Les valeurs de <b>h</b> hors intervalle seront bornées.
<dt>int Image_hf15_height(Image_Desc *img, int x, int y);
<dd>Lecture de la hauteur du point aux coordonnées x et y. Cette hauteur est
automatiquement limitée à l'intervalle autorisé.
<dt>int Image_hf15_hf2gray(Image_Desc *src, Image_Desc *dst, int mode);
<dd>Conversion d'un height_field en une image en niveaux de gris. Le paramètre
<tt>mode</tt> n'est pas utilisé et doit être égal à 0.
<dt>int Image_hf15_rgb2hf(Image_Desc *src, Image_Desc *dst, int mode);
<dd>Conversion d'une image RGB en height_field. Le paramètre <tt>mode</tt>
n'est pas utilisé. On doit le mettre à 0. Cette fonction va probablement
évoluer dans un proche (ou lointain) avenir.
<dt>int Image_hf15_save_PGM(char *nom, Image_Desc *img, char *comment);
<dd>Sauvegarde un height_field en format
<a href="img-fichiers.html#pnm">PGM</a> ascii. Le suffixe recommandé
étant <tt>.pgm</tt>, mais vous faites comme vous voulez...
<i>Bien que le fichier soit
conforme aux spécifications du PGM, Povray n'arrive pas à le lire.
Ce bug devrait être corrigé dans la version 3.x qui est actuellement
disponible, mais je n'ai pas encore testé.</i>
</dl>
<p align=right><a href="#top">haut de page</a></p>
<a name="traitements"><h2>traitements</h2></a>
<dl class="proto">
<dt>int
Image_hf15_lissage(Image_Desc *s, Image_Desc *d, int coef, int flag);
<dd>Lissage d'un height_field. Le paramètre <tt>coef</tt> représente le
poids du point central de la matrice 3x3. Les huit autres points ont
un coefficient de 1, ce qui n'est peut-être pas idéal.
<dt>int
Image_hf15_calc_minmax(Image_Desc *img, char *txt, int *pmin, int *pmax);
<dd>Calcul des extrèmes d'un height_field. Si <tt>txt!=NULL</tt>, un message
est affiché. Si <tt>pmin</tt> et/ou <tt>pmax</tt> sont à <tt>NULL</tt>, le
résultat correspondant n'est pas retourné. <i>ah ah, no more segfault !</i>
<dt>int
Image_hf15_normalize(Image_Desc *src, Image_Desc *dst, int min, int max);
<dd>Ajustement linéaire d'un height-field afin que toutes les valeurs
soient comprises entre <tt>min</tt> et <tt>max</tt>.
<dt>int
Image_hf15_mul_add(Image_Desc *src, Image_Desc *dst, int mul, int add);
<dd> A tester plus en détails...
<dt>int Image_hf15_dilate(Image_Desc *src, Image_Desc *dst, int coef);
<dd>Dilatation d'un HF: chaque point est remplacé par le point le plus haut
de son voisinage 3x3. Cela a pour effet d'amplifier les sommets.
Le paramètre <tt>coef</tt> n'est pas utilisé, il est bon de mettre 1, pour
rester compatible avec les évolutions en projet...
<dt>int Image_hf15_erode(Image_Desc *src, Image_Desc *dst, int coef);
<dd>Opération inverse de la dilation: amplification des vallées. <tt>coef</tt>
n'est pas utilisé, mettre 1.
<dt>int Image_hf15_mult_i(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst);
<dd>Multiplication de deux height-fields, avec remise à l'échelle pour ne
pas faire de dépassements. Pas trop testé ;(
<dt>int Image_hf15_sqrt(Image_Desc *src, Image_Desc *dst);
<dd>Racine carré normalisée de l'altitude normalisée. Peu testée, mais
visuellement prometteuse.
<dt>int
Image_hf15_pow(Image_Desc *src, Image_Desc *dst, double p0w44)
<dd>En quelque sorte la fonction complémentaire de la racine carré. Et là aussi
on opère sur des valeurs normalisées.
</dl>
<p align=right><a href="#top">haut de page</a></p>
<a name="mixages"><h2>mixages</h2></a>
<p>
Bien entendu, quand on commence à faire des height-fields, on se demande
si on peut les combiner, les mélanger entre eux, faire du hfmix...
Et effectivement, c'est possible. Il y a même un
<a href="http://foo.buvette.org/bf/hf/">début de démonstration</a>
qui donne parfois de bonnes idées bien mouvantes.
</p>
<dl class="proto">
<dt>int
Image_hf15_mix(Image_Desc *s1, Image_Desc *s2, Image_Desc *d, int k);
<dd> Mélange de deux HF. Le coefficient <tt>k</tt> va de 0 à 10000, mais rien
ne vous empèche d'essayer d'autres valeurs. En principe, les débordements
sont correctement gérés.
<dt>int
Image_hf15_mult(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst);
<dd>
Multiplication de deux hf15. Il risque d'y avoir des problèmes de dépassement
de capacité dans cette fonction. Si cela vous arrive, il faut me faire
<a href="mailto:oulala@chez.com">signe</a>.
<dt>int Image_hf15_getmin(Image_Desc *s1, Image_Desc *s2, Image_Desc *d);
<dd>Recopie dans l'image de destination de la valeur minimale des deux
points correspondants dans les images s1 et s2. Il existe aussi la
fonction <tt>Image_hf15_getmax</tt> dont la sémantique est évidente.
</dl>
<p align=right><a href="#top">haut de page</a></p>
<a name="bruit"><h2>bruitages</h2></a>
<dl class="proto">
<dt>int Image_hf15_noise_0(Image_Desc *dst, int hi, int lo, int pr100);
<dd>Avec une probabilité de <tt>(pr100 % 100)</tt>, l'altitude sera mise entre
<tt>hi</tt> et <tt>lo</tt> pour tout les points de l'image.
<dt>int Image_hf15_noise_1(Image_Desc *dst, int mo, int of, int pr100);
<dd>Cette fonction déplace une atltitude de 'mo' avec un offset de 'of'.
Le paramètre 'pr100' n'est pas utilisé.
<dt>int Image_hf15_noise_2(Image_Desc *dst, int pr100, int di, int k1, int k2);
<dd>Remplacement aléatoire du point courant par un de ses proches voisins.
Le code n'est hélas pas encore vraiment optimisé.
<dt>int Image_hf15_noise_3(Image_Desc *dst, double coef, int flag);
<dd>Léger bruitage proportionnel à la hauteur du point concerné. Cette fonction
a été inventée pour la montagne de
<a href="http://foo.buvette.org/bf/pm/sonia.avi">Sonia</a>.
</dl>
<a name="synth"><h2>Synthèses</h2></a>
<p>
Nous pouvons également songer à fabriquer des height-fields à partir de
calculs divers et plus ou moins abscons. Actuellement, il y a deux fonctions
à peu près opérationnelles, mais pas encore figées.
</p>
<dl class="proto">
<dt>int Image_hf15_synth_0(Image_Desc *dst, Image_PtList *ptl);
<dd>Pas très fini, en cours de démoulage. Et vous ne savez pas ce qu'est
une <i>PtList</i> ? Voici un petit <a href="img-ptlist.html">topo</a>.
<dt>int Image_hf15_synth_fromfunc0(Image_Desc *dst, int k,
double(*func)(int x, int y, int k))
<dd>Vous avez sous la main une fonction du genre <tt>h = func(x, y)</tt> ?
Vous souhaitez la transformer en height-field ? No souçaï. Vous écrivez votre
fonction, vous créez une image des dimensions voulues, et vous utilisez
ce générateur magique, quoique pas encore fini. Son principal avantage est
de recadrer les valeurs fournies par votre fonction dans la <i>dynamique</i>
complète du hf.
</dl>
<p align=right><a href="#top">haut de page</a></p>
<a name="liens"><h2>liens</h2></a>
<ul>
<li>Il existe une <a href="image77.html#povray">interface G77</a> pour
ces fonctions.
<li><a href="http://www.povray.org/">POVray</a>, and have a look at the new
3.5 version...
<li><a href="http://pov.monde.free.fr/">Pov Monde</a> les POVeurs francophones.
<li><a href="http://tontonth.free.fr/pov/">tTh</a> fait quelques raytracings.
<li>Comment faire des <a href="img-stereo.html">images en relief</a>.
<li>un début de <a href="http://tontonth.free.fr/pov/hf/">howto</a> pour faire
des images avec les hf15s.
<li>Il y a d'autres choses étranges dans POV: les
<a href="img-df3.html">df3</a> (<i>aka</i> density files) en font partie.
</ul>
<p>
Dans un autre domaine <i>povesque</i>, si vous créez deux images en déplaçant
légerement le point de vue, vous pouvez les
<a href="img-stereo.html">combiner</a> en une image, que vous verrez en
relief avec une paire de lunettes munie des
<a href="img-stereo.html#filtres">filtres</a> adéquats.
</p>
<p align=right><a href="#top">haut de page</a></p>
<p class="footer">
Votre demande est traçante,
<a href="http://foo.bar.quux.over-blog.com/">je</a> lance mon
<a href="http://www.vim.org">Vim</a>,<br>
et je passe à l'action altitudisante.
</p>
</body>
</html>