Viewer coordinate frames/fr
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<source>() – 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().