Vector 旋转所有点以与向量对齐

Vector 旋转所有点以与向量对齐,vector,rotation,Vector,Rotation,我有一个向量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),给定v(1,1,0) 我在unity3d的左手轴系统中工作,y是垂直的 我目前的方法是,使用v=(vx,vy,vz)和x,y,z作为要旋转的点 float vx = 1; float vy =

我有一个向量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),给定v(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;

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

      ( t1  t2  t3 )
f =   ( u1  u2  u3 )
      ( w1  w2  w3 )
其中,w:=v/| v |,t,u,w是成对正交的,且| t |=| u |=| w |=1


选择t和u取决于你想做什么,但是如果你只需要任何t和u,通过3d获得一些。

我找到了答案,通过取(0,0,1)的叉积来找到旋转轴,然后使用它作为旋转轴,角度是向量(0,0,1)和(vx,vy,vz)之间的角度


在三维空间中,您所描述的仅定义为一个自由度。这是一个问题吗?