2

直線上に 2 つの 3D ポイント (非対称オブジェクトの上部と下部) があり、オイラー角 (x、y、z 軸に沿った回転) を見つけたいと考えています。

例: OpenGL の次のコードのリバース エンジニアリングが必要です。以下はシナリオを示すための単なる例です。

//Translation
glTranslated(p1.x, p1.y, p1.z);

//Rotation
glRotatef(rot.x, 1.0f, 0.0f, 0.0f);
glRotatef(rot.y, 0.0f, 1.0f, 0.0f);
glRotatef(rot.z, 0.0f, 0.0f, 1.0f);

// Draw the object ALONG Y-AXIS
p2 = DrawMyObject(); //p2 is top of my object

状況によっては、p1 と p2 しか取得できず、オイラー角 (x、y、z 軸に沿った回転) を知る必要があります。どのように?

これは私が試したもので、答えは (Rx, Ry, Rz): (4, -3, -11),

cv::Point3d p1, p2;
p1.x = 0.0525498;
p1.y = 0.0798909;
p1.z = -1.20806;

p2.x = 0.0586557;
p2.y = 0.111226;
p2.z = -1.20587;

double dx, dy, dz;
double angle;

dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;

angle = std::atan2(dy, dz); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dy, dz): "<<int(90 - angle);

angle = std::atan2(dx, dz); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dz, dx): "<<angle;

angle = std::atan2(dy, dx); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dy, dx): "<<int(angle -90);

std::cout<<std::endl;

特にYに沿った回転はまったく正しくありません。p1 と p2 は両方とも y 軸に沿って回転しているときに y 軸にあると思うので、問題は次のとおりです。次に、可能な最善の解決策は何ですか?

4

1 に答える 1

1
  1. コメントに記載されているように、オブジェクトの 3 番目のポイントまたは一定のワールド空間ベクトルが必要です。一定のベクトルを使用すると、特定のアプリケーションとそのベクトルに対するラインの向きによってジンバルの問題が発生する可能性があることに注意してください。
  2. 直交正規化された 3x3 回転行列を作成します。
    1. Grahm-Schmit 法を使用して、次の最初の 2 行を直交正規 化します。
      • u1 = p2 - p1
      • u2 = p3 - p1 (または定数ベクトル)
      • グラムシュミットを適用すると、これらのベクトルは 3x3 行列の最初の 2 行になります。
    2. 行列の 3 行目は、最初の 2 行の外積です。
  3. 結果の行列をオイラー角に分解します。
于 2012-06-26T15:13:46.503 に答える