質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

570閲覧

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

Tajmahal

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

1クリップ

投稿2022/09/29 08:46

前提

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から平均でも取るのでしょうか...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

昔の記憶を辿りながらなので、もしかしたら見当違いな回答になってしまってるかもしれないことご容赦ください。

ボールの回転量をセンサ(quaternionもしくはオイラー角)で取得

とのことから、球面座標系で考えるとしっくりくるような気がしています。
オイラー角の絶対値が取れるのか、起動からの相対値が取得できるのかは分かりませんが、現時点の角度が分かるのであれば、それを元に回転したあとの球面座標はそのまま算出できるような気もします

当時、ヘッドマウントディスプレイでどの方向を向いても球の中心を見つめるように球面座標を計算した記憶があり、視点は逆ですがそれに近いものを感じました。

蛇足:
ちなみにリソースに関してですが、Arduino用の数学関数は元々そうなっているかもしれませんが、三角関数の近似値テーブルを作っておいて、弧度法ではなく60分法で扱ってもいいかもしれません。ROMは使いますが、計算は少なくなりそうです。(私が関わってたものはそうなってました。)

投稿2022/09/29 14:08

編集2022/09/29 14:16
milkcocoa0902

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tajmahal

2022/09/30 00:41

なるほど! 視点位置が球表面であることを使うのですね. ちなみにオイラー角は絶対値に相当するものが取れるセンサです. 現在の視点姿勢(私の場合はLEDの位置)のquaternionの逆をとって元の座標系に戻してそのテクスチャ座標を求めるイメージですかね. 角度を含む回転移動なので四則演算だけで回転変換を表現できて良さそうなのですが,結果の分布はどうみても非線形なのでモヤモヤしています. quaternionで表現できればLATITUDE分は最初と最後のみ求めて間は球面線形補間で高速計算できそう....と妄想しています. 蛇足については, https://tajmahal0707.hatenablog.com/entry/2021/06/17/173711 こちらに書いたようにatan2やcosに対して参照テーブルで高速化検討しています.1.5倍から2倍くらいまでは高速化できそうです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問