【问题标题】:Translate vertices from space to another将顶点从空间转换到另一个
【发布时间】:2013-08-20 18:17:29
【问题描述】:

我有从模型中读取的 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).

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

有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: math vector matrix rotation


    【解决方案1】:

    为了概括这一点,您可以使用角度/轴旋转规范,其中旋转角度由 θ = cos-1(uv / |u||v|) 轴由 r = (u/ |u|)×(v/|v|) 其中∙是dot product,×是cross product和| |是Euclidean (L2) norm。您可以使用quaternion formulationrotation matrix 来实际生成线性变换。

    为什么会这样:两个单位长度向量的点积是这两个向量之间夹角的余弦值。两个单位长度 3D 矢量的叉积是与其他两个正交(垂直)的两个单位长度 3D 矢量之一。这两个向量仅在符号上有所不同,使得 u×v = -v×u,所以公式如果我在交叉产品中弄错了订单,上面可能会出现符号问题。

    【讨论】:

    • 我需要的一切似乎都有。谢谢!
    • @SimoErkinheimo 很高兴我能帮上忙。
    【解决方案2】:

    如果你的向上向量是 [ 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]

    【讨论】:

    • 我正在寻找概括:点 p(x0, y0, z0) 在空间中定义,向上向量是 U(x1, y1, z1) 我需要将点转换为空间其中向上向量是 V(x2, y2, z2)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多