Viewer coordinate frames/fr

From Second Life Wiki
Jump to: navigation, search

Les référentiels

Le client SL utilise 4 référentiels différents. Il existe dans le client quelques exceptions qui ne suivent pas la convention décrite ci dessous. Le programme de rendu utilise les termes « world » et « w » pour le référentiel agent et quelques programmes relatifs aux avatars et aux jointures n’indiquent pas le référentiel utilisé mais fonctionnent en référentiel agent. A noter également que les librairies communes (LLCamera & LLPrimitive en particulier) ne suivent pas cette convention. Soyez vigilant lorsque vous en extrayez ce type de valeurs.

Référentiel Global

Ce référentiel utilise le format F64, il est basé sur le système U32 de coordonnées x et y des régions auxquelles est ajouté un décalage propre à la région. Precise enough for ~1x10e9 regions on an edge with same precision as region-local coordinates.

Référentiel Régional

L’origine de ce référentiel est celui de la région possédant l’objet.

Référentiel de l’Agent

Actuellement, l’origine de ce référentiel est celui de l’agent dans sa région actuelle. Ce ne sera pas nécessairement le cas dans le futur. Ce référentiel ne devrait être utilisé que dans le code lié au rendu (pipeline, visibilité/frustum calculations)

Référentiel Local

Ce référentiel est celui employé si aucun des précédents référentiels ne convient. Il est généralement relatif au positionnement de l’objet.

Le référentiel local est utilisé de deux façons différentes :

Les prims filles

Les prims filles (prims autres que la prim racine) sont positionnées dans un référentiel local relatif à la prim racine. Leur position et leur angle globaux sont modifiés par la position et la rotation de la prim racine.

Les attachements

Les objets attachés à un avatar sont positionnés dans un référentiel local relatif à leur point d’attachement. Leur position et leur angle globaux sont affectés par la position et la rotation de l’avatar et par les animations jouées.

Convention de nom

Toutes les variables et classes utilisant des valeurs dans l’un de ces référentiels doivent être post fixées avec le référentiel qu’elles utilisent. S’il vous plait, RESPECTEZ CETTE CONVENTION car elle permet de grandement réduire le nombre d’erreurs.

Exemples:

mPositionGlobal, pos_global
mPositionRegion, pos_region
mPositionAgent, pos_agent

Les fonctions de conversion

Les fonctions LLAgent et LLViewerRegion utilisent des fonctions de conversion pour passer d’un référentiel à l’autre. Elles ont une syntaxe au format getPos<target>From

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


() – par exemple getPosAgentFromGlobal() convertit les coordonnées du référentiel global dans le référentiel de l’agent.


= Conversion de type=
En vue de gérer le système des coordonnées globales, une nouvelle classe LLVector3d a été créée pour remplacer LLVector3. Bien que ce choix paraisse, en première approche, discutable, l’unique autre alternative aurait été de réviser toutes les classes mathématiques existantes pour les adapter à la convention GL (convention du type de la dernière lettre), ce que je ne souhaitais pas faire.

A terme, toutes les fonctions mathématiques travaillant avec les coordonnées globales devraient utiliser LLVector3ds,  comme c'est le cas des fonctions renvoyant des coordonnées globales. L’unique exception est la partie audio, je travaille actuellement à son adapation au format LLVector3s avant d'extraire les fonctions du moteur audio. 
Je pense cependant que cette situation perdurera tant que le moteur audio utilisera les coordonnées de l’agent.

La classe LLVector3d n’inclut VOLONTAIREMENT aucune conversion automatique avec la classe LLVector3. La conversion inverse est coûteuse et peut potentiellement induire une perte de précision, vous devez la réaliser explicitement avec setVec().