Math 计算变换平面所需的旋转

Math 计算变换平面所需的旋转,math,3d,isometric,Math,3d,Isometric,我目前正在尝试在等轴测(html5画布2d上下文)中渲染多边形网格。 我的工作几乎完成了,只是我找不到正确的计算/算法来找到平面旋转 在示例中,平面A和B由2向量Ox,Oy定义 var planeA = { Ox: { x: 1, y: -2, x: 1, }, Oy: { x: 1, y: -1, z: 0, } } var planeB = { Ox: {

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

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

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具有相同的法线。

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

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

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

(请注意,订单很重要。通常,AxB≠ BxA.)

对于两个平面,叉积是(1,1,1)和(-1,0,0)

要规范化向量,请将其除以其大小。平面的法向量是(1/sqrt(3))(1,1,1)和(-1,0,0)

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

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


所以在你的例子中,你将绕着一个Ox旋转π/4得到(sqrt(2/3),0,sqrt(1/3)),然后绕着Oy旋转π/2-atan(sqrt(2))得到(1,0,0),然后绕着Oz旋转π得到(-1,0,0)。

你打算按这个顺序应用旋转吗?另外,你只需要两次旋转,而不是三次,所以你更喜欢效率还是清晰?顺序重要吗(我数学不太好…)?如果我只需要两个旋转,我可以留下一个0:D只需要一种编程计算的方法。我错了:需要三个。写一个答案…从一头牛到另一头牛的角度总是90度,有没有可能让A的牛和B的牛,同一个方向?@hope\u是冷酷的:是的,当然,但它改变了问题。我假设这些旋转是围绕坐标系的固定轴进行的,而不是嵌入在平面中的向量;对吗?如果是这样,你能绕任意向量旋转吗?