1

我目前正在尝试在等距(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 具有相同的法线。

4

1 回答 1

2

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

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

C x = A y *B z - A z *B y
C y = -A x *B z + A z *B x
C z = A x *B y - A y *B x

(注意顺序很重要。一般来说,A x BB x A。)

因此,对于您的两架飞机,叉积是 (1,1,1) 和 (-1,0,0)。

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

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

1. 绕 O x旋转:为了让A进入 XZ 平面,旋转 atan2(A y , A z )。2. 围绕 O y
旋转:以获得正确的 phi(与 O z的角度))。Phi B是 atan2(sqrt(B x 2 +B y 2 ), B z ),所以旋转 atan2(sqrt(B x 2 +B y 2 ), B z ) - atan2(A x , A z )
3。绕 O z旋转:要获得正确的“经度”,旋转 atan2(B y, B x ) - atan2(A y , A x )。

因此,在您的示例中,您将A围绕O x旋转π/4 以获得 (sqrt(2/3), 0, sqrt(1/3)),然后围绕O y旋转π/2 - atan(sqrt(2 )) 得到 (1,0,0),然后在O z附近乘 π 得到 (-1,0,0)。

于 2012-11-16T18:10:56.400 回答