【问题标题】:Calculate rotation needed to transform plane计算变换平面所需的旋转
【发布时间】:2012-11-14 16:53:57
【问题描述】:

我目前正在尝试在等距(html5 画布 2d 上下文)中渲染多边形网格。
除了找不到正确的计算/算法来找到平面旋转之外,我的工作几乎完成了。

在示例中,我有由 2 个向量 Ox, Oy 定义的平面 A 和 B

var planeA = {
    Ox: {
        x: 1,
        y: -2,
        x: 1,
    }, Oy: {
        x: 1,
        y: -1,
        z: 0,
    }
}

var planeB = {
    Ox: {
        x: 0,
        y: 1,
        x: 0,
    }, Oy: {
        x: 0,
        y: 0,
        z: -1,
    }
}

我想找到 alpha(围绕 Ox 旋转)、beta(围绕 Oy 旋转)和 gamma(围绕 Oz 旋转)应用于平面 A 以使平面 A 与平面 B 具有相同的法线。

【问题讨论】:

  • 您打算按该顺序应用轮换吗?另外,你只需要两个轮换,而不是三个轮换,所以你更喜欢效率还是清晰?
  • 顺序重要吗(我数学不太好……)?如果我只需要两次旋转,我可以留下一个零:D 只是想要一种以编程方式计算的方法。
  • 我错了:需要三个。写一个答案...
  • 从 Ox 到 Oy 的角度总是 90 度

标签: math 3d isometric


【解决方案1】:

首先,通过向量的叉积找到法线,然后进行归一化。

要取两个向量 AB 的叉积,请使用以下公式:

Cx = Ay*Bz - Az*By子>
Cy = -Ax*Bz + Az*Bx
Cz = Ax*By - Ay*Bx

(注意顺序很重要。一般来说,AxBBxA。)

所以对于您的两个平面,叉积是 (1,1,1) 和 (-1,0,0)。

要对向量进行归一化,请将其除以其大小。所以你的飞机的法线向量是 (1/sqrt(3))(1,1,1) 和 (-1,0,0)。

现在将向量旋转到另一个向量(我假设你有atan2(),并且你有右手定则):

1.绕Ox:旋转使A进入XZ平面,旋转atan2(Ay, Az )。
2.围绕 Oy: 旋转以获得正确的 phi(与 Oz 的角度)。 PhiB 是 atan2(sqrt(Bx2+By2) , Bz),所以旋转 atan2(sqrt(Bx2+By2 ), Bz) - atan2(Ax, Az)
3.绕 Oz: 旋转以获得正确的“经度”,旋转 atan2(By, Bx) - atan2(Ay, Ax).

因此,在您的示例中,您将 A 围绕 Ox 旋转 π/4 以获得 (sqrt(2/3), 0, sqrt(1/3)),然后围绕 Oy π/2 - atan(sqrt(2)) 得到 (1,0,0),然后围绕 Oz π 得到 (-1,0,0)。

【讨论】:

  • 是否可以使A的Ox, Oy与B的Ox, Oy的方向相同?
  • @hope_is_grim:是的,当然,但它改变了问题。我假设这些旋转是围绕坐标系的固定轴进行的,而不是嵌入平面中的向量;那是对的吗?如果是这样,您可以围绕任意向量进行旋转吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2013-02-14
  • 2014-10-04
相关资源
最近更新 更多