我目前正在尝试在等轴测(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,
}
}
我想找到α(绕Ox旋转)、β(绕Oy旋转)和γ(绕Oz旋转)应用于平面A,使平面A与平面B具有相同的法线。
首先,通过取向量的叉积,然后归一化来找到法线。
要取A和b两个向量的叉积,请使用以下公式:
Cx=Ay*Bz-Az*By
Cy=-Ax*Bz+Az*Bx
Cz=Ax*By-Ay x
(注意顺序很重要。通常情况下,Axb≠bxA。)
所以对于你的两个平面,叉积是(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+By<2>),B>z),因此旋转atan2(squrt(Bx2+By2)、B
因此,在您的示例中,您将A绕Ox旋转π/4得到(sqrt(2/3),0,sqrt(1/3)),然后绕Oy旋转pi/2-atan(sqrt)得到(1,0,0),然后围绕Oz[/b>旋转¦Β得到(-1,0,0)。