LoginSignup
0
0

More than 1 year has passed since last update.

メモ:四元数の大円

Posted at

 素人のメモ書き。
 理解していない。間違ってるかも。

 四元数には向きの自由度が3つあるので、極座標(向きの自由度が2つ)の大円を求めようとしてもLerpやSlerpだけではうまく求められない?
 一旦2本のベクトルに変換し、ベクトルのクロス積で回転軸を求め、ドット積で回転角を求める。それを使って四元数を作って、最初の四元数とかけることで大円の姿勢が得られる。

public static (Quaternion, Quaternion) GrateCircle(Quaternion q, Quaternion p)
{
    var v1 = Vector3.Transform(Vector3.UnitX, q);
    var v2 = Vector3.Transform(Vector3.UnitX, p);
    return (q,
        Quaternion.CreateFromAxisAngle(
            Vector3.Normalize(Vector3.Cross(v1, v2)),
            MathF.Acos(Vector3.Dot(v1, v2))) * q);
}

log.png

 白い線は極座標から作った四元数を直接Quaternion.Lerpに渡して補間したもの(Slerpも同様の結果)。緑の線はGrateCircleで再生成した四元数をQuaternion.Lerpに渡して補間したもの。
 Google Earthで線を引くと緑の線に近い経路をたどる。

 地図上で2点間の大圏コースを引くとかなり違和感のある形になるけど、人工衛星の軌道だと思って見てみると、そんなに違和感ない気もする。


 なんで大円を求めるのに四元数とか使ってるんだ、というツッコミは御容赦を。。。Google Earthでわかりやすいように地図を表示しているが、元々は地理関係以外で使う予定だったのでインターフェースが四元数になっている。

 地図のデータはNASAの画像を使用した
 Blue Marble: Land Surface, Shallow Water, and Shaded Topography

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0