極座標を直接回転変換する方法

前提

arduinoで自前の簡易テクスチャシステムを設計しています.
リフレッシュレートは10〜15Hz,解像度は120x50程度を想定.
今はそれの機能検証のためにUNITY上でシミュレーションしているところです.
マイコン上で動かすため,リソースがあまり使えないことが大きな前提です,

実現したいこと

球オブジェクトが回転しても天地が回転しないテクスチャをつくる
上のページにあるようにボール状のディスプレイに画像を表示しますが,ボールの回転量をセンサ(quaternionもしくはオイラー角)で取得しその回転量に合わせてテクスチャからサンプリングするuv座標を変更することで,映像的にはボールが転がっても絵は回転しない状態を出すことを目標としています.

今は素直に

  1. 球上の点p(極座標・角度)を直交座標系(直交座標・位置)に変換:p'
  2. p'を天頂からのquaternionに変換:p''
  3. p''にセンサのquaternionを合成:p'''
  4. p'''を天頂ベクトルから球上の座標(直交座標・位置)に変換:p''''
  5. p''''を極座標(角度)に変換:p'''''
  6. p'''''のφθ情報を元にテクスチャuvからpixel値を取得

と処理することでUNITY上で実現はできています.

ただマイコン等で処理したい場合,極座標から直交座標を経由して最終的に再度回転後の極座標を得ているため,すごく無駄な処理をしているように思えてなりません.
さらに角度→位置→角度とこちらも余分な経路を通っており,そのために三角関数の計算も混入して計算リソースが減る要因になってしまっています(いくつかの処理は事前に行うことができるので計算リソースは減りますが).

単純にquaternionもしくはオイラー角を使って,極座標系を直接回転できる方法はあるのでしょうか?

もしくはquaternionから極座標のφθを得る簡単な方法はないでしょうか?

もっとスマートな回答がある気がしてなりません.

こちらの分野は専門では無いため,行き詰まっています.
宇宙物理やGPS関連,CGの世界などでは当たり前のように使われてそうな気がするのですが,探してもなかなか見つかりません.

該当のソースコード

latitude-longitude - 経度/四元数までの緯度
では

q2*q1 = (cos(a/2)cos(b/2), -sin(a/2)sin(b/2), cos(a/2)sin(b/2), sin(a/2)cos(b/2))

で直接仰角・方位角であるa, bを計算できそうですが,未知数a,b(2つ)よりquaternionの式の数(4つ)の方が多いですよね.各式から算出したa,bから平均でも取るのでしょうか...

コメントを投稿

0 コメント