PILOBOLUS VIRTUELS

Michel Bret & Marie-Hélène Tramus

février 2020



Certains liens ne seront pas actifs s´il n´y a pas de connexion internet.

Origine
Images
Contrôle
Interaction
Capteurs
Menu
Modifications
Raccourcis clavier
Options
Programme
Dysfonctionnements
Debug





























Principe

Origine
Images

Origine

Reprise par Michel Bret de l´installation Corps & graphie de Marie-Hélène Tramus (écrite en langage anyflo 1997) construisant interactivement des pillobolus.

Images





video

Contrôle


interaction
construction des mouvements
call back USER
construction des corps: modifier les fonctions build_*.



Plusieurs types de capteurs:
mouse
caméra



























Interaction

Lancement
Mode click
Paramètres
Fonction USER

Lancement

Cliquer sur:
pillobus_camera.js: caméra.
pillobus_camera_curs.js: caméra et curqeur.
pillobus_mouse.js: souris et sauvegarde des images dans le dossier imapillobus_mouse_wri.js: souris et.
pillobus_PARAM1.js: exemple de fichier PARAM1 personnalisé (modifier ce fichier). .
pillobus_shadow.js: ombres et souris.
pillobus_self.js: automappe et souris.
USER.js: utilise la fonction USER.
Remarques:
Le fichier WebCam.js est é en fonction des paramès;tres Dim1 et Dim2 passés en option à la fonction pillobolus (voir le fichier pillobolus_camera.js.
Enfoncer la touche : (deux points) pour avoir les menus.
Au lancement les paramètres par défaut sont lus dans fichier PARAM, certains paramètres peuvent être modifiés par les options.

Mode click

Un corps s´affiche, cliquer sur lui: une chaine de Generate[2] corps (option gen) ancrés au point du premier corps le plus proche du point cliqué est générée, et ainsi de suite (jusqu´à Nb_Body[1] corps), le processus est alors réinitialisé. La focale est calculée en fonction du nombre de corps nb par:
f=1+(Nb_Body[0]-1)/30;traj(25)foc(1,f)view(1)abs;
À chaque clic des trajectoires dynamiques de forces de rotation (couples) ainsi que des trajectoires d´interpolation (par rotations) des axes sont générés. La liste de description de ces trajectoires sont dans des mémoires initialisées dans la fonction build_MOVE().
Remarque
Enfoncer la touche j pour réinitialiser, la focale est réinitialisée à 1.

Paramètres

Pour accéder aux menus enfoncer la touche : (deux points).
Remarque :
Il faut quitter ce mode (en enfonçant de nouveau la touche : ou en cliquant sur CLICK) pour retrouver le mode click.
Le menu PARAM permet de modifier et sauver les paramètres.

Fonction USER

La fonction env/USER.func est un call back exécutée à chaque image si USER est actif.
env/USER.func, env/USER1.func, env/USER2.func, env/USER3.func sont différents exemples.



























Capteurs

Mouse
Caméra

Mouse

Par défaut la vitesse de déplacement de la souris est utilisée pour générer des couples de forces.
Pour générer des chaines de corps changer gen.
Régler la sensibilité de la souris avec coe

Caméra

displ: changer la taille de l´image affichée.
eps: changer la rotation en y (eps petit roty grand).
gen: générer des chaines de corps.
coe: changer la sensibilité de la caméra (augmenter pour un éclairement faible), peut être forcé dans pillobolus_camera.js par l´option cam=c.
Si est actif max g: seuil de déclenchement de la désignation.
cpt: compteur permettant de ralentir cet effet.
down: coefficient de plier.
max: nombre maximum de corps.

driver
webcam.func
Réglage de la caméra
Fichier de lancement


Option cam: les déplacements de l´image de la caméra dans une grille sont utilisées pour générer des couples de forces appliquées aux jambes, aux bras et au torse du premier corps..
Le menu DISPL (touche D) visualise la caméra.
pillobolus_camera.js lance: anyflo.exe pour la fonction pillobolus("cam") en mode caméra et le driver WebCam.exe
Ce driver, trè simple, ne suppose aucun dispositif particulier, il capte l´image de la caméra et l´envoie, via une mémoire partagée, à anyflo, en mode yes speed la dérivée première (vitesse) est envoyée.

Remarque:
pour le moment une fenêtre de dialogue Windows s´affiche, il faut cliquer sur OK (ce qui est du à une incompatibilité de VisualC++.6.0 avec le système actuel).

Réglage de la caméra

N'importe quelle web cam convient sur fond uniforme (pas d´objet trop clair).
Après avoir lancé pillobolus_camera.js
Lancer une webcam et amener son image à gauche.
En mode no speed (enfoncer la touche S), enfoncer la touche D ce qui a pour effet d´afficher l´image de la caméra dans une petite fenêtre en bas et à gauche de l´écran.
Redimensionner et déplacer l´image de la caméra de façon à ce qu´elle couvre exactement la petite fenêtre. Orienter alors la caméra de façon à ce que le spectateur y figure en pied, les mains au milieu.
Lui faire lever le bras gauche, puis le bras droite, puis pivoter et se baisser, si les réglages sont corrects le personnage doit en faire autant, sinon modifier les paramètres eps (diminuer pour augmenter le déclenchement de la rotation en y) et coe (augmenter pour augmenter la sensibilité). br>Ne pas oublier d´enfoncer la touche >S pour revenir en mode speed.
Laisser le spectateur libre de ses mouvements et expérimenter l´interaction.
En mode curseur et en amenant le spot d´un laser de pointage sur un personnage on peut construire un pillobolus dynamique de complexité limitée à Nb_Body_Max.

Fichier de lancement

Dans le fichier pillobolus_camera.js:
WshShell.Run("anyflo.exe lan=\"pillobolus((\\\"cam=2,256,128;mir;ill;inv;spe;aut;dis\\\"))\" orx=425")
2: coefficient multiplicateur de la luminance de l´image transmise (sensibilité de la cameéra).
256 est la taille de l´image captée.
128 est la taille de l´image transmise.
mir pour effet miroir.
ill pour yes illum.
inv pour INV.
spe pour SPE.
aut pour AUT.
dis pour DISPL.

Menu

HEL
DOC
BODY
MOVE
PARAM
COL
ILLUM
EXT
FOG
CLICK
INV
SELF
AUT
BACK
USER
VAR
CODE
INI
EXI

HEL

Aide. :

DOC

Ce fichier.

BODY

Paramètres des corps.

TEST

Permet de modifier le corps, se lance avec pillobolus_test.js..

MOVE

Paramètres des mouvements.
num: teste le mouvement numéro num.

HEL

aide

STAND

immobile, permet de tester les désignnations et les constructions des corps.

RAND

choix aléatoire des mouvements.

LINEAR

variation linéaire des mouvements.

CONSTANT

mouvement constant.

PARAM

Échelles
HEL
SCA
CURS
READ0
READ
WRITE
GENERATE

Aide.

Échelles

Échelles

Des échelles permettent de modifier les paramètres (enfocer la touche i pour une meilleure visibilité ) :
dila thorax leg arm: dilatation globale, du thorax, des jambes et des bras.
tran y: monter ou descendre les corps.
foc: change la focale, par exemple foc=1.5 diminue la taille des corps pour permettre d´empiler de nombreus corps.
ext,coe: coefficients d´extension.
spring rote, visc: couples des ressorts.
radius, curs: curseur en mode caméra.
ni: durée des trajectoires.
var: durée de changement de mouvement (si VAR est actif.
period: période d´affichage (1: lent, 50: rapide).
force,min,max,visc,stright: force, minimum, maximum et viscosité des mouvements, coefficient de redressements.
coe arm left right, thorax: coefficients des bras et du thorax.
limit speed: vitesse limite des rotations.
dist: distance minimum des clicks.
memory: lissage des saisies.
stand: stand by (0: immobile, 1: mobile).
roty: amplitude des rotations en y du premier corps.
roty2: amplitude des rotations en y des autres corps.
down: amplitude de plier du premier corps
inertia: inertie.
bend: angle de courbure.
bend2: vagues.
curs,radius curseur.
num: numéro du mouvement en mode MOVE.
eps réglage du déclenchement de la rotation en y du premier corps (petit +, grand -).
coe
gen

CURS

Si
g est actif modifier:
g max=Max_g[2]: seuil de génération des corps.
En mode curseur:
modifier les limites des couleurs du curseur, ou choisir ces limites red,gre,blu,whi.
memory curs: lissage du curseur.
dila curs: permet d´ajuster les déplacement du curseur.

READ0

Lit le fichier PARAM0 des paramètres par défaut.

READ

Lit le fichier PARAM des paramètres courants.

WRITE

Sauve les paramètres courants. dans le fichier PARAM

GENERATE

Génère et sauve les dichiers *.js.
ATTENTION ces fichiers seront modifiés !!!

GL

Désignation avec OpenGL.

COL

Des échelles permettent de choisir les couleurs des corps et du fond:
body r v b: couleur des corps.
back r v b: couleur du fond.
rand: couleur aléatoire autour de r,g,b.

Si INV est actif:
body inv r v b: couleur des corps.
back inv r v b: couleur du fond.

ILLUM

yes/no illum (raccourcis clavier I)..

EXT

yes/no ext (raccourcis clavier E)..

FOG

yes/no fog (raccourcis clavier F)..

CLICK

Revient au mode click (raccourcis clavier :)..

INV

Inverse le fond noit/blanc (raccourcis clavier i)..

SELF

Automappe, if faut activer ILLUM (raccourcis clavier s)..

AUT

yes/no ajustement automatique de la capture caméra, en mode DISPL la ligne verticale verte doit rester au milieu lorsque le spectateur se déplace (raccourcis clavier A)..

BACK

Variation de la couleur du fond (raccourcis clavier B)..

USER

exécute la fonction env/USER.func qui fait varier sinusoidalement la courbure entre 0 et 4.
On peut écrire autant de fonctions user que l´on veut, par exemple la fonction env/USER1.func se lance par le fichier USER1.js dans lequel figure l´option use=USER&USER1, la fonction USER1 varie la longueur des jambes du premier corps entre .5 et 1.5, les 2 fonctions USER et USER1 seront exécutées simultanément. env/USER2.func qui fait varier la courbure en fonction d´un angle.

SPE

yes/no speed camera (raccourcis clavier S).

MOU

yes/no mouse (raccourcis clavier M).

VAR

Variation automatique des paramètres.

DISPL

Si un capteur est de type caméra, visualise (raccourcis clavier D):
l´image de la caméra, la placer de façon à voir le spectateur en pied,
des cadres représentant les variations des vitesses des CG des fenêtres d´analyse,
échelles:
displ: dimension de l´image affichée,
eps
gen: nombre de corps générés à chaque click.
cam: coefficient multiplicateur de la luminance de la caméra.
max click: tempo entre 2 clicks consécutifs.

CODE

yes/no live code: écrire une ligne de code après < suivi de ENTER.
Exemple hors capteurs:
traj(50)force(1,0,0,1,0,0)rota(0,PI)vol(Right_Arm)period(1)abs

INI

Initialisation.

EXI

exit (raccourcis clavier q).



























Modifications

Corps
Mouvements
Tester des mouvements
Rotations
Couleurs
Dynamique

Corps

Cliquer sur PARAM et changer:
dila: dilatation globale.
thorax: dilatation globale.
leg: dilatation des jambes.
arm: dilatation des bras.
Des modifications plus fines nécessitent de changer le code des fonctions:
build_Thorax(), anc_Thorax()
.
build_Leg(), anc_Leg().
build_Arm(), anc_Arm().

Construction des mouvements

Dans la fonction build_MOVE()
set_name_move("nnn");    nom du mouvement.
s=string(nb);nb++;   numéro du corps.
À chaque item (thorax, left_leg, right_leg, left_arm, right_arm) sont associées des mémoires de noms item_transf_s contenant les paramètres des trajectoires associées.

Construction de mouvements dynamiques:
memory("item_rota",s)=a1,a2,...;    liste des angles.
les trajectoires associées sont de type traj(ni)force(...)rota(a1,a2,...)vol(item)period(per)abs

Exemples:
memory("thorax_rota",s)=.25*PI,-.3*PI,.25µpi;    liste des angles de la trajectoire dynamique du thorax.

Construction de mouvements cinématiques:
memory("item_rotx",s)=a1,a2,...;    liste des angles en x.
memory("item_roty",s)=a1,a2,...;    liste des angles en y.
memory("item_rotz",s)=a1,a2,...;    liste des angles en z.
memory("item_axis",s)=x1,y1,z1, x2,y2,z2,...;    liste des axes.
memory("right_leg_roty",s)=0,2*PI;   trajectoire cinématique roty de tout le corps (car right_leg est le leader de ce corps).

Construction de mouvements aléatoires
Si le nom d´une mémoire se termione par "_rand", la trajectoire correspondante sera générée aléatoirement à chacun de ses appels.

Exemples:

memory("thorax_rota_rand",s)=a11,a12, a21,a22,...;
des trajectoires dynamiques d´angles ai=rand2f (a11,a12), a2=rand2f(a21,a22),... seront générées à chaque appel.

Il suffid de modifier ces listes.

Remarque:
Toute les combinaisons de ces options sont possibles pour tous les items d´un même corps.

Tester des mouvements

Cliquer sur MOVE.
Cliquer sur num: numéro du mouvement à tester, qui est joué.
Changer les paramètres de la dynamique:
    ni: durée des mouvements.
    force: coefficient de la force des couples écercés sur les articulations, permet de contrôler la force des mouvements.
    visc: viscosité, permet de ralentir ou accélérer les mouvements.

Rotations

Modifier la fonction body_roty.
Les rotations en y sont aléatoires d´amplitude Roty[2] modifiable dans PARAM (body roty).

Couleurs

Couleur de base Col_Body=1,.4,.2;
Les couleurs des corps sont calculées dans la fonction set_col_Body().
en fonction (). numéro du corps dans Nb_Body[0].

Dynamique

Les mouvements sont générés par
traj(ni)force(...)rota(...)vol(id)period(-1)abc;
Les paramètres sont mofifiables dans PARAM:

force et viscosité sont modifiables dans
L´inertie qui est gérée dans la fonction inertia() du fichier pillobolus.func
Les limit speed rota permettent ´éviter une explosion des rotations cumulées.
roty: rotation en y des corps.
bend: courbure.
bend2: vagues.

Driver

La taille de l´image captée dim1 et l´originr x,y peuvent être modifiées dans le fichhei WebCam.js:
WshShell.Run("WebCam.exe dim1 128 x y");



























Raccourcis clavier

A AUT.
B BACK.
C CAMERA.
D DISPL.
E EXT.
F FOG.
G génèrate 1/4 corps si click;
I ILLUM.
M MOUSE.
S SPE.
a period(25) INI.
: yes/no affiche les menus.

Raccourcis clavier webcam:
c yes/no cursor: si la caméra est active un curseur suit les déplacements d´un spot dirigé vers la caméra et fait pousser un nouveau corps sur un corps intercepté.
g yes/no génération automatique des corps en fonction des variations du capteur.
j a href="#INI">INI.
h aide.
i INV.
j INI.
m yes/no miroir
p: affiche les paramètres.
       validations des menus (vert: ON, blanc: OFF).
      
q stop programme.
s yes/no self (automapping).
u yes/no call back USER.
v yes/no variation des mouvements. : yes/no cache les menus. wabcam:

Options

aut: yes AUT. aut=a: a=1 yes AUT, a=-1 no AUTO..
bac: BACK.
ben=b1,b2: fait Bend[2]=b1, Bend2[2]=b2.
cam: camera.
cur: cursor.
colcon: couleur constante.
colran=c: couleur d´aléatoire c.
dis: displ camera image.
ext: EXT.
eps=erotationen y du leader absolu Lead.
ext=e,c: coefficiets d´extension.
eye: lance interaction("totsy_eye") permettant de changer l´poeil à la souris.
foc=f: modifie la focale.
fog yes fogf.
gen: génération de n corps si click.
gen=n: génère n corps si click.
Ce nombre est dans Generate[2] mofifiable sur l´ échelle gen du menu .
ill:
ILLUM.
inv: INV.
mir=1: yes miroir, -1 no miroir (par défaut).
mou: fait Mouse=.005: rotation en y du premier corps= Mouse*(speed mouse).
mou=m: fait Mouse=m.
mou;wri: enfoncer la touche wpermet de sauver une image sous le nom VP0001.bmp.
mou;wri=n: enfoncer la touche wpermet de sauver une image sous le nom VPn.bmp.
nbi: nombre d´image sauvées (250 par défaut).
per(p): period(p) (25 par défaut).
sel: SELF.
set: appelle la fonction set_PARAM() d´initialisation des paramètrespar défaut, ce qui permet de changer le fichier PARAM en cliquant sur PARAM->WRITE (ceci ne doit être fait que si on ajoute de nouvaux paramètres, il faudra alors modifier aussi les fichier PARAMn.
spe: active le mode speed SPE.
sta: STAND.
use: USER.
use=nnn: la fonction USER est nnnuse=USER&USER1: les 2 fonctions USER et USER1 seront exécutées.
var: VAR.
wri: nom des images sauvées.
: inhibe les clics.

Programme

Driver de la caméra
Corps
Forces
Mouvements
Mémoires
Picking

Driver de la caméra

La capture de l´image de la caméra utilise un driver écrit en C.

Corps

Nb_Body[0]=numéro du derniere corps cliqué.
Nb_Body_Max: nombre maximum de corps.
Click:
       v=numéro du volume cliqué
       s=numéro du sommet cliqué sur ce volume
Un corps cliqué contient la propriété meta=D taille de ce corps, le corsp généré prend la taille .75*D et sa propriété meta=.75*D. Le premier corps a la propriété meta=D0.

Nx,Ny: nombre de sections en x et en y.

Camera: 0 (no camera), 1 (yes camera).

D: dimension de base.
Dila: taille des corps.
Dila_Thorax: taille du thorax.
Dila_Leg: taille des jambes.
Dila_Arm: taille des bras.
K_Thorax: rayon du thorax.
K_Leg: rayon des jambes.
K_Arm: rayon des bras.

Limit_Speed: limit speed rota.


Mouse: 0 (no mouse), 1 (yes mouse).

Period: période d´affichage.

Type: type de variation des mouvements:
       RAND: aléatoire
       LINE: linéaire
       CONS: constant

Forces

Force: force rota.
[Min,Max] intervalle des mij.
Visc=viscosité.
Stif: raiduer des ressorts Visc_Spr
: viscosité des ressorts
Force_Straight: force de redressement.
Vist_Straight: viscosité de redressement.
Coe_Min1,Coe_Min2
: forces minimum pour normal et speed. Bend, Bend2: angle de courbure.

Mouvements

Nb_Move: nombre de mouvements.
Nb_Vol: nombre de volumes.
Ni: durée des trajectoires.
Ni_VAR: durée de changement des mouvements.

Mémoires

Foction pillobolus.func:
memory("Mouse_m0")ini(6); lissage 0 souris
memory("Mouse_m1")ini(6); lissage 1 souris
memory("m0")ini(6); lissage 0 caméra
memory("m1")ini(6); lissage 1 caméra
memory("ax0")ini(6); lissage x0 caméra
memory("ax1")ini(6); lissage x1 caméra
memory("back_r")ini(6); lissage rouge back
memory("back_g")ini(6); lissage vert back
memory("back_b")ini(6); lissage bleu back
memory("down")ini(2); lissage baisser
Mémoires de webcam.func

Picking

La désignation se fait (en mode la souris) en cliquant sur un corps, ou (en mode curseur) en dirigeant le spot sur un corps, elle est programmée dans la fonction mouse_vol().
Une chaine de corps (en nombre Generate[2] est générée au point désigné.

Dysfonctionnements

Touches
Caméra

Touches

Une des touches:
A B C D E F I M S a c h i j m p q s u v
du clavier ont pu être involontairement enfoncées ce qui peut déclencher une action (voir Raccourcis clavier).

Caméra

Il faut une webcam dont on peut changer la taille et la position.
Il faut modifier interactivement à la souris ces paramètres de façon à amener l´image de la caméra à recouvrir exactement l´image de celle-ci dans le programme (qui apparait en bas et à gauche de l´écran).
Il faut placer le spectateur de façon à ce qu´il (ou elle) apparaisse en pied et coupé au niveau des épaules.

Il se peut que plusieurs drivers de la caméra tournent en même temps (ce qui peut être du à une sortie anormale du programme, en effet celui-ci stoppe le driver sur un exit) ce qui produit des interférences: les stopper tous et relancer pillobolus.

Debug

Il se peut, à la suite d´une erreur sévère dans une fonction, que le programme se relance sans fin; dans ce cas faire un reset de la machine, puis lancer video.js et relancer pillobolus().js un message d´erreur permettra de faire un diagnostique.