0

ベクトル v = (x,y,z) があり、ポイント (x,y,z) = (0,0,sqrt(x^2 + y^2 + z^) となるようにすべてのポイントを回転させたい2). つまり、ベクトル v の方向を z 軸にし、これが成り立つようにすべての点を回転させたいのです。

ポイント (1,1,0) を (0,0,sqrt(2)) に移動し、ポイント (0,0,1) を (-1/(sqrt(2))) に移動します。 1/sqrt(2),0) (1,1,0) の平均が与えられます。

私は、yが垂直であるunity3dの左手軸システムで作業しています。

私の現在の方法はこれで、 v = (vx,vy,vz) と x,y,z を回転させるポイントで使用します。

float vx = 1;
float vy = 1;
float vz = 0;



float c1 = -vz/(sqrt(vx*vx + vz*vz));
float c2 = -sqrt(vx*vx + vz*vz)/sqrt(vx*vx + vy*vy + vz*vz);
float s1 = -vx/(sqrt(vx*vx + vz*vz));
float s2 = -vy/sqrt(vx*vx + vy*vy + vz*vz);


float rx = x * c1  + y*s1*s2 - z*s1*c2;
float ry = x * 0 + y*c2 + z * s2;
float rz = x * s1 - y*s2*c1 + z*c1*c2;
4

2 に答える 2

0

私は答えを見つけました。(0,0,1)の外積をとって回転軸を見つけ、これを回転軸として使用します。角度はベクトル(0,0,1)と(vx、vy)の間の角度です。 、vz)。

http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle

于 2012-08-01T14:59:03.967 に答える
0

fv =(0,0,1), |の 3x3 行列fを探しています。× |=| fx |; これは必要

      ( t1  t2  t3 )
f =   ( u1  u2  u3 )
      ( w1  w2  w3 )

ここでw := v / | v |、および t、u、w はペアワイズ直交であり、| t |=| あなた|=| w |=1。

tとuの選択は、何をしたいかによって異なりますが、t と uだけ必要な場合は、3 次元の外積を介して取得します。

于 2012-07-30T21:18:27.543 に答える