Aller directement à la table des matières
pre3d est une bibliothèque de visualisation
d’objets en trois dimensions.
Bravo et merci à Dean McNamee !
Voici deux exemples de visualisations, à manipuler à la souris :
CTRL
, on se déplace en $x$ et $y$SHIFT
, on se déplace en $z$CTRL
et SHIFT
, on ajuste la distance
focalefunction step() {
var dx = (-1.111 * x - y * y - z * z + 1.111 * 4.494) * 0.136;
var dy = (-y + x * y - 1.479 * x * z + 0.44) * 0.136;
var dz = (-z + 1.479 * x * y + x * z) * 0.136;
x += dx;
y += dy;
z += dz;
return {x: x, y: y, z: z};
}
D’autres exemples sont fournis sur la page officielle.
Je propose ici un tutoriel progressif, qui peut aussi servir de memento. Une certaine connaissance de la programmation Javascript (JS) est souhaitable, et une bonne maîtrise est nécessaire pour certains exemples évolués (on peut trouver quelques pistes ici).
Encore une fois, une bonne maîtrise de Javascript (JS) est nécessaire. Voir cette activité.
Le code HTML
<script src="static/pre3d/apps/repere.js"></script>
<script type="text/javascript">create_repere('pre3d-repere', 0, 0, 0);</script>
<canvas id="pre3d-repere" width="200" height="150">
Désolé, cette visualisation requiert HTML5.
</canvas>
script
charge le fichier Javascript qui définit la
visualisation (voir plus bas pour une description de ce type de fichiers).script
commande la création de la visualisation. Les
arguments servent à initialiser la position de la caméra.canvas
accueille la visualisation et ses attributs en
définissent la taille. Son id
doit correspondre au premier argument de
create_repere
ou du document.getElementById
de votre visualisation
(voir plus bas).canvas
).Rien d’exceptionnel ou de très difficile. Dans la suite de ce document, on ne reviendra sur cette partie que s’il y a vraiment du nouveau.
Le code JS
1 function create_repere(id, rx, ry, rz){
2 window.addEventListener('load', function() {
3 var screen_canvas = document.getElementById(id);
4 var renderer = new Pre3d.Renderer(screen_canvas);
5
6 renderer.ctx.lineWidth = 1;
7
8 var orig = {x: 0, y: 0, z: 0};
9
10 function draw() {
11 renderer.ctx.setFillColor(1, 1, 1, 1);
12 renderer.drawBackground();
13
14 var line = Pre3d.PathUtils.makeLine(orig, {x: 1, y: 0, z: 0});
15 renderer.ctx.setStrokeColor(1, 0, 0, 1);
16 renderer.drawPath(line);
17 var line = Pre3d.PathUtils.makeLine(orig, {x: 0, y: 1, z: 0});
18 renderer.ctx.setStrokeColor(0, 1, 0, 1);
19 renderer.drawPath(line);
20 var line = Pre3d.PathUtils.makeLine(orig, {x: 0, y: 0, z: 1});
21 renderer.ctx.setStrokeColor(0, 0, 1, 1);
22 renderer.drawPath(line);
23 }
24
25 renderer.camera.focal_length = 5;
26 DemoUtils.autoCamera(renderer, 0, 0, -7, rx, ry, rz, draw);
27 draw();
28 }, false);
29 }
function() {
et
}, false);
) définira notre visualisation. C’est un peu technique mais,
rassurez-vous, ce n’est pas la peine de comprendre les listeners pour se
servir de pre3d.canvas
, (voir ci-dessus pour la partie HTML).draw
sera appelée lors des changements de
position de la caméra.line
renderer
sont des valeurs de
position (il est rarement utile de les modifier, on pourra laisser
0, 0, -7
).draw
.draw
pour qu’il y ait quelque chose à l’écran
dès le départ.Notons que pour ce premier exemple et pour les suivants, un code couleur simple (si on connaît le format RVB) a été choisi :
pre3d
utilise les radians.
On rappelle qu’un tour complet vaut $2 \pi$ radians, soit environ $6,28$. Par proportionnalité, on a le tableau suivant :
description | degrés | radians | radians.js | valeur approchée |
---|---|---|---|---|
un tour | 360 | $2 \pi$ | 2*Math.PI |
6.283 |
un demi-tour | 180 | $\pi$ | Math.PI |
3.142 |
un quart de tour | 90 | $\frac{\pi}{2}$ | Math.PI/2 |
1.571 |
un sixième de tour | 60 | $\frac{\pi}{3}$ | Math.PI/3 |
1.047 |
un huitième de tour | 45 | $\frac{\pi}{4}$ | Math.PI/4 |
0.785 |
Elle se fait « autour de l’axe des $x$ », en amenant l’axe des $y$
vers l’axe des $z$.
Avec create_repere('pre3d-repere3', 0.785, 0, 0);
, on obtient :
On remarque que lorsque l’on glisse la figure à la souris vers la droite ou la gauche, la rotation se fait suivant l’axe des $y$ en vert et non par rapport à ce qui nous semble être la verticale.
Tentative d’explication : la souris agit sur la caméra et non sur la figure.
Explication qui est invalidée en observant que si on glisse la souris vers le haut ou le bas, la rotation ne se fait pas suivant l’axe des $x$ en rouge, mais ce qui nous semble être l’horizontale (plus probant dans l’exemple suivant).
Elle se fait « autour de l’axe des $y$ », en amenant l’axe des $z$
vers l’axe des $x$.
Avec 0, 0.785, 0
, on obtient :
Elle se fait « autour de l’axe des $z$ », en amenant l’axe des $x$
vers l’axe des $y$.
Avec 0, 0, 0.785
, on obtient :
On note qu’il faudra élucider cette histoire de glissé de figure vers la droite ou la gauche puisque dans cet exemple, on ne tourne pas autour de l’axe des $y$ (en vert).
À suivre…