2

私はkinectとofxopeniを使っています。実世界の座標に点群がありますが、カメラの傾きを相殺するためにそれらの点を回転させる必要があります。床面から必要なすべての情報が得られるはずですが、軸と回転角度を計算する方法がわかりません。

私の最初のアイデアは...

ofVec3f target_normal(0,1,0);
ofVec3f vNormal; //set this from Xn3DPlane floorPlane (not shown here)
ofVec3f ptPoint; //as above

float rot_angle = target_normal.angle(vNormal);

for(int i = 0; i < numPoints; i++){

   cloudPoints[i].rotate(rot_angle, vNormal, ptPoint); //align my points to normal is (0 1 0)                               

}

これは、あまりにも単純すぎたようです。私はさまざまな記事を調べてきましたが、おそらくクォータリオンまたは回転行列が関係していることがわかりますが、どこから始めればよいかわかりません。関連する記事へのポインタや、軸と回転角度を取得するための最良の手法は何ですか? ofQuarterion または openni 関数を使用して非常に簡単に実行できると想像していますが、実装方法がわかりません。

一番

サイモン

4

1 に答える 1

1

私は ofxopeni を使ったことはありませんが、これは私ができる最良の数学的説明です。

TBN マトリックス (tangent、bitangent、normal) を使用して、ある軸セットから別の軸セットに任意のデータ セットを回転できます。ここで、TB と N は新しい軸セットです。したがって、法線のデータは既にありますが、接線を見つける必要があります。あなたの Xn3DPlane が接線を提供しているかどうかはわかりませんが、もしあればそれを使用してください。

バイタンジェントは、法線とタンジェントの外積によって与えられます。

 B = T x N

TBN は次のようになります。

TBN = { Tx ,Ty ,Tz,
        Bx, By, Bz,
        Nx, Ny, Nz }

これにより、新しい軸セットでデータが回転しますが、平面にも原点があるため、平行移動します。

A = {1 , 0 , 0, 0,    { Tx , Ty , Tz , 0,   
     0,  1,  0, 0,      Bx , By , Bz , 0,    
     0,  0,  1, 0,  x   Nx , Ny , Nz , 0, 
     -Px,-Py,-Pz,1}      0 ,  0 ,  0 , 1}    

// The multiply the vertex, v, to change it's coordinate system.
v = v * A

この段階まで進むことができれば、すべてのポイントを新しい座標系に変換できます。注意すべきことの 1 つは、法線が z 軸に整列されていることです。y 軸に整列させたい場合は、TBN マトリックスの N と B を入れ替えます。

編集: 最終的な行列計算が少し間違っていました。修理済み。

TBN 計算。

于 2011-08-18T00:37:54.960 に答える