将顶点从空间转换为另一个

时间:2013-08-20 18:17:29

标签: math vector matrix rotation

我有从顶部由单位矢量 u 定义的模型中读取的3D顶点。我需要将所有这些顶点转换为另一个空间,其中向上由单位向量 v 定义。

我知道如果原始向上方向为(0,1,0)且目标为(1,0,0),我可以对所有点使用类似于此的旋转矩阵:

x' = x*cos(-90) - y*sin(-90) = y
y' = x*sin(-90) + y*cos(-90) = -x
z' = z

where -90 is the angle from (0,1,0) to (1,0,0).

......但是到目前为止,我在试验中总结这种方法的尝试已被证明是徒劳的。

有任何建议如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果你的向上矢量是[Ux,Uy,0]:

x' = Ux*x + Uy*y
y' = Uy*x - Ux*y 
z' = z

如果你使用矩阵,你可以更好地概括它并覆盖所有任意角度。例如:

[ Ux, Uy, 0,
  Uy,-Ux, 0,
  0,  0,  1  ] 

并简单地将矢量乘以矩阵。

或者使用三个向量作为您的方向向右和向后然后您的矩阵是:

[ Rx, Ry, Rz,
  Ux, Uy, Uz, 
  Bx, By, Bz ]

并将向量乘以矩阵将如下所示:

x' = x*Rx + y*Ry + z*Rz
y' = x*Ux + y*Uy + z*Uz    
z' = x*Bx + y*By + z*Bz

在您的特定情况下,您有R = [1,0,0],U = [0,1,0]和B = [0,0,1],然后您重新定向到R = [0,-1 ,0],U = [1,0,0],B = [0,0,1]

答案 1 :(得分:0)

为了概括这一点,您可以使用角度/轴旋转规格,其中旋转角度由θ= cos -1 u v < / b> / | u || v |),轴由 r =( u / | u |)×( v / | v |)其中∙是dot product,×是{{3} }和| |是cross product。您可以使用Euclidean (L2) normquaternion formulation来实际生成线性转换。

为什么会这样?:两个单位长度向量的点积是这两个向量之间角度的余弦。两个单位长度3D矢量的叉积是与其他两个正交(垂直)的两个单位长度3D矢量之一。这两个载体的区别仅在于它们的符号 u ×b> v = - v ×b ,因此配方如果我在交叉产品中输入了错误的订单,则上面可能会出现问题。