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) 给定 av 为 (1,1,0)。

我在unity3d的左手轴系统中工作,其中y是垂直的。

我目前的方法是这样,使用 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

您正在寻找fv =(0,0,1), |的3x3 矩阵f x |=| 外汇|; 这需要

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

其中w := v / | v |, 和 t, u, w 是成对正交且 | t |=| |=| w |=1。

选择tu取决于您想做什么,但如果您只需要任何tu,请通过 3d cross product获得一些。

于 2012-07-30T21:18:27.543 回答
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 回答