254 lines
9.6 KiB
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 "champ d'altitude", 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>
|