1

我有从模型中读取的 3D 顶点,该模型的向上方向由单位向量u定义。我需要将所有这些顶点转换到另一个空间,该空间的向上方向由单位向量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).

...但到目前为止,我为开始提到的案例推广这种方法的尝试被证明是徒劳的。

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

4

2 回答 2

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  ] 

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

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

[ 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]

于 2013-08-20T18:41:20.787 回答
0

为了概括这一点,您可以使用角度/轴旋转规范,其中旋转角度由 θ = cos -1 ( u ∙<b>v / | u || v |) 给出,轴由r = ( u /| u |)×( v /| v |) 其中∙是点积,×是叉积,| | 是欧几里得 (L2) 范数。您可以使用四元数公式旋转矩阵来实际生成线性变换。

为什么会这样:两个单位长度向量的点积是这两个向量之间夹角的余弦。两个单位长度 3D 矢量的叉积是与另外两个正交(垂直)的两个单位长度 3D 矢量之一。这两个向量仅在符号上有所不同,因此u × v = - v × u,因此如果我在叉积中的顺序错误,上述公式可能会出现符号问题。

于 2013-08-20T18:47:48.787 回答