1

生成されたジオメトリを方向ベクトルに合わせようとしています。私の現在の問題を説明するには:

  • A = 正しく位置合わせされたジオメトリ (テスト用の三角形のみ)
  • B = 位置合わせが正しくないジオメトリ

問題の例

この三角形の例のコードでの私の現在のソリューション (このコードは、分割から始まる画面に表示されるすべてのノードに対して実行されます。GLM 数学ライブラリを使用しています):

glm::vec3 v1, v2, v3;

v1.x = -0.25f; 
v1.z = -0.25f; 

v2.x = 0.25f;
v2.z = -0.25f;

v3.x = 0.0f; 
v3.z = 0.25f;

v1.y = 0.0f;
v2.y = 0.0f;
v3.y = 0.0f;

glm::mat4x4 translate = glm::translate(glm::mat4x4(1.0f), sp.position);
glm::mat4x4 rotate = glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), sp.direction, glm::vec3(0.0f, 1.0f, 0.0f));

v1 = glm::vec4(translate * rotate * glm::vec4(v1, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);
v2 = glm::vec4(translate * rotate * glm::vec4(v2, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);
v3 = glm::vec4(translate * rotate * glm::vec4(v3, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);

点 A の方向ベクトル値:

  • x 0.000000000 フロート
  • y 0.788205445 フロート
  • z 0.615412235 フロート

点 B の方向ベクトル値:

  • x 0.0543831661 フロート
  • y 0.788205445 フロート
  • z -0.613004684 float

編集 1 (24/11/2013 @ 20:36) : A と B には関係がなく、両方とも別々に生成されます。A または B を生成する場合、位置と方向のみが既知です。

ここに投稿されたソリューションを見てきました:

しかし、ジオメトリを回転させて方向ベクトルに合わせることができませんでした。私はかなり基本的な間違ったことをしているように感じます。

どんな助けでも大歓迎です!

4

1 に答える 1

2

Aとが単位ベクトルであり、 と整列するように変換Bする回転行列が必要な場合は、(と の外積)を計算することから始めます。 は回転軸で、は必要な回転角度です。 RBAC = B x ABACarcsin(|C|)

これらから、必要な回転行列を構築できます。これglmはサポートされているようですので、これ以上説明しません。

注意: パフォーマンスが重要なコードでこれらの多くを実行している場合は、 と の既知の値を使用して自分で行列に注意して計算することで、少し速度を上げることができ|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)ます。これについては、たとえばこのディスカッションを参照してください。ルーチンはあなたの角度を取得し、すぐにそのとの計算に進みます。これは、これらが既にわかっていて操作に比較的コストがかかるため、わずかな無駄です。sin(theta)cos(theta)glmarcsin(|C|)sincos

回転がp原点以外の点に関するものである場合、 を原点へTの平行移動としp、 を見つけますX = T^-1 R T。これXはあなたが望む変換になります。

于 2013-11-24T18:45:12.840 に答える