Difference between revisions of "Koordinatenbezugssysteme im Viewer"
(→Conversion functions: translated) |
|||
Line 34: | Line 34: | ||
</pre> | </pre> | ||
= | = Konvertierungsfunktionen = | ||
In LLAgent | In LLAgent und LLViewerRegion sind Konvertierungsfunktionen zur Umwandlung von einem Bezugssystem in ein anderes implemetiert. Sie haben eine Syntax der Form getPos<Ziel>From<Quelle>() - zum Beispiel konvertiert getPosAgentFromGlobal() vom globalen in das Agent Bezugssystem. | ||
= Type conversion = | = Type conversion = |
Revision as of 05:27, 21 August 2010
Koordinaten Bezugssysteme
Es gibt derzeit vier verschiedene Bezugssysteme, die im Viewer verwendet werden. Beachten Sie bitte, dass es einige Fälle gibt, in denen der Programmcode im Viewer diesen Konventionen NICHT folgt: Der Code, der im Rendering verwendet "World" und "W" für den Agent und Teile des Character/Verbinden Codes haben kein Bezugssystem festgelegt, aber das wird im Agent definiert. Auch allgemeine Bibliotheken (LLCamera und LLPrimitive im speziellen) verwenden die Konventionen auch NICHT. Seien Sie besonders vorsichtig, wenn Sie Werte direkt aus diesen heraus verwenden.
Global
Absolutes globales Koordinatenbezugssystem, im F64 Format angegeben. Das ist vom U32 Format der x und y Koordinaten der Angaben der Region plus dem Offset der Region abgeleitet. Es ist genau genug, um ~109 Regionen mit der gleichen Genauigkeit übereinander auszurichten, wie es mit lokalen Regionenkoordinaten möglich wäre.
Region
Der Ausgangspunkt ist der Ursprung der Region, die das Objekt "besitzt".
Agent
Derzeit ist der Bezugspunkt der Ursprung der Region, in der sich der Agent momentan befindet. DAS BEDEUTET NICHT UNBEDINGT, dass das auch in Zukunft so sein wird. Dieser Bezugspunkt sollte nur für Programmcode verwendet werden, der im Zusammenhang mit dem Rendering steht (Renderpipeline, Sichtbarkeits-/Frustumberechnungen)
Lokal
Derzeit ein Sammelbegriff für Bezugssysteme, die nicht eines der oben erklärten sind. Im Allgemeinen die Positionierung relativ zu einem Objekt.
In LSL wird das lokale Bezugssystem auf zwei Arten genutzt:
Childprims
- Childprims (nicht Rootprims) werden lokal zum Rootprim positioniert; ihre globale Position und Winkel werden durch Beides, die Rotation und Position des Rootprims beeinflusst.
Attachments
- Objekte, die angezogen werden, werden lokal zum Tragepunkt positioniert; ihre globale Position und Winkel werden durch Beides, die Rotation und Position des Avatars und den abgespielten Animationen beeinflusst.
Namenskonventionen
ALLE Variablen/Klassenmitglieder, die mit Werten aus einem dieser Bezugssysteme zu tun haben, sollten in Namen nachgestellt das Bezugssystem haben, das verwendet wird. BITTE tun Sie das - es hilft großartig dabei, Fehler zu vermindern.
Zum Beispiel:
mPositionGlobal, pos_global mPositionRegion, pos_region mPositionAgent, pos_agent
Konvertierungsfunktionen
In LLAgent und LLViewerRegion sind Konvertierungsfunktionen zur Umwandlung von einem Bezugssystem in ein anderes implemetiert. Sie haben eine Syntax der Form getPos<Ziel>From<Quelle>() - zum Beispiel konvertiert getPosAgentFromGlobal() vom globalen in das Agent Bezugssystem.
Type conversion
In order to support the high-precision global coordinates, there is a new class LLVector3d, standing for LLVector3, double precision. It's somewhat inconsistent, but the only other alternative was renaming ALL of the math classes to use the GL style last-letter type convention, which I wasn't up to doing.
ALL math being done in global coordinates should be done using LLVector3ds. Currently, all functions which return global coordinates do so in LLVector3ds. The ONLY current exception to this is audio, which I am converting to regular LLVector3s before handing them off to the audio engine - I guess this will be the case until we convert the audio engine to use agent coords.
The LLVector3d class DELIBERATELY does not have ANY form of automatic type-conversion between it and the LLVector3 class. Since conversion back and forth isn't cheap (and potentially loses precision), you have to explicitly do a setVec() on the other class to convert back and forth.