我有从顶部由单位矢量 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).
......但是到目前为止,我在试验中总结这种方法的尝试已被证明是徒劳的。
有任何建议如何解决这个问题?
答案 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) norm或quaternion formulation来实际生成线性转换。
为什么会这样?:两个单位长度向量的点积是这两个向量之间角度的余弦。两个单位长度3D矢量的叉积是与其他两个正交(垂直)的两个单位长度3D矢量之一。这两个载体的区别仅在于它们的符号 u ×b> v = - v ×b ,因此配方如果我在交叉产品中输入了错误的订单,则上面可能会出现问题。