Viewer coordinate frames/ja
座標系
現在ビューアで使われる座標系には 4 種類あります。 なお、ビューアで例外的な処理を行なうケースが 2 つあります。すなわち、描画処理ではアバター用に "World" と "W" を使い、またある種のアバター/接合処理では特定の座標系でなくアバターが基準になります。 さらに、良く使われるライブラリ (特に LLCamera と LLPrimitive) も例外的な処理を行ないます。これらの状況から直接データを取得する際は特に注意してください。
グローバル (Global)
完全に全世界にわたる座標系で、64 ビットの浮動小数点値で表現されます。これはリージョン内座標を処理する符号無し 32 ビット整数値 x, y と、そのリージョン自身のオフセット (基準点に対する位置) を基にしています。一辺が 109 リージョン以下ならば、リージョン内座標と同等に正確です。
リージョン (Region)
基準は、そのオブジェクトを "所有" するリージョンの基準点です。
エージェント (Agent)
今のところ、基準はアバターが現在居るリージョンの基準点です。これは将来もそうであるとは限りません。この座標系は、(パイプライン、可視/カメラアングルの計算といった) 描画に関わる処理でのみ使われるべきです。
ローカル (Local)
現在、上記のいずれにも当てはまらない座標系を引き受けます。一般にオブジェクトの相対位置記述で使われます。
LSL では二通りの使われ方があります:
子プリム
- (ルート プリムでなく) 子プリムは、ルート プリムを基準として配置されます。それらのグローバルな位置と角度は、ルートプリムの回転と位置両方によって影響を受けます。
装備品
- 装着されたオブジェクトは、装着ポイントを基準として配置されます。それらのグローバルな位置と角度は、アバターの位置と回転、およびそれが実行中のアニメーションによって影響を受けます。
名付けの規約
これらの座標系いずれかの値を扱う変数やクラスのメンバは全て、扱っている座標系を後置すべきです。どうかそうしてください - エラーを大幅に減らせますので。
例:
mPositionGlobal, pos_global mPositionRegion, pos_region mPositionAgent, pos_agent
変換関数
LLAgent と LLViewerRegion には、ある座標系から別の座標系へと変換を行なう変換関数があります。それらは getPos<target>From<source>() という形式を持ちます。すなわち、getPosAgentFromGlobal() ならば global 座標系から agent 座標系への変換を行ないます。
型変換
充分な精度の global 座標を実現するため、LLVector3 の 2 倍の精度を持つ LLVector3d という新しい代替クラスがあります。やや一貫性を欠きますが、さもないと GL style last-letter type convention を使うために全ての Math クラスをリネームする以外なく、それはしたくなかったからです。
Global 座標系での数理計算は LLVector3ds で行なわれるべきです。現在、Global 座標系を返す全ての関数は LLVector3ds で処理されています。唯一の例外は音声で、音声処理に渡される前に、普通の LLVector3s へ変換されます - 音声処理がアバター座標を使うようになるまでは、この通りでしょう。
LLVector3d クラスが LLVector3 クラスとの間に何ら自動的な型変換を行なわないのは意図的なものです。型変換を繰り返すのはコストがかかり、また精度も落ちてゆきますので、クラス同士の型変換では明示的に setVec() を使ってください。