(事先道歉。我的数学技能和说明的权力似乎已经离开我的那一刻)想象一下,屏幕上的立方体,两组控制。 控件一组旋转立方体一边到另一边(又名偏航或Y甚至取决于一个人的数学倾向Z)和另一组的控制来上下转动(又名间距或X)。
我想要做的就是让这个两个集SOF控件总是相对旋转立方体到浏览器/屏幕不论立方体当前如何旋转。
因为旋转得到以串行方式应用(每个旋转从那里上一个不放过“开始”),无论是矩阵或基于四元数旋转的常规组合不会达到这种效果。
例如随着的伪代码combinatedRotation = RotateYaw(90) * RotatePitch(45)
将给出我出现因为俯仰转动已被旋转,以及被“滚动”到一侧的立方体。 (或者更生动的例子RotateYaw(180) * RotatePitch(45)
会产生在那里出现的间距在反向工作到屏幕立方体)
可有人要么点我或关系提供正确的方式,使两个旋转彼此独立的效果,这样不论立方体当前如何旋转,偏航和变桨作品“预期”到屏幕上的控制?
编辑3:这只是发生在我身上了以下解决方案,而正确的,过于复杂。 您可以通过方向矩阵旋转矩阵相乘,简单计算新的方向达到同样的效果:
M = R * M
虽然这个问题不相关,这也将正确处理未由纯粹的旋转方向矩阵,也包含平移,倾斜,等等。
(编辑3结束)
你需要包括你的对象的局部坐标系的当前旋转轴的变换矩阵。 然后应用旋转到矩阵。
在数学方面,你开始与单位矩阵如下:
M = [1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
该矩阵包括三个载体,U,V和W,代表 - 在世界坐标 - 你的对象的局部坐标系的三个单位向量:
M = [Ux Vx Wx 0]
[Uy Vy Wy 0]
[Uz Vz Wz 0]
[0 0 0 1]
当你想旋转对象,旋转, 原地每个向量。 换言之,独立地应用旋转到每个U,V和W的基质内。
渲染时,简单地套用M用单转化为你的对象。 (如果你想知道,不适用的旋转本身;只是矩阵)
编辑2:(第一编辑前显示的,因为它为它提供上下文。)
在重新审视这个答案它最初发布后不久,我意识到,我可能没有上,你可能有关于如何从每个控制应用旋转而产生的误解回升。
我们的想法是不累积到每个控制所施加的转动,并分别应用它们。 相反,你应该立即申请每个增量旋转(即每次你的滑块控件之一时触发change事件)到U,V和W的载体。
为了把这个更具体而言,不要说,“总体而言,垂直控制移动47°且水平控制移动-21°”,并应用它们作为两个大圈。 这将表现出激发你的问题同样的问题。 取而代之的是,比方说,“垂直滑块刚搬0.23°”,和旋转U,V和W约0.23°的X轴。
总之,90°偏转,随后45以下说明°间距可能不是你想要的。
编辑:按照要求,这里的90°偏转的情况如何,然后在实践中45°俯仰平移出...
既然你开始与单位矩阵,基础载体将只是你的世界单位向量:
U = [1] V = [0] W = [0]
[0] [1] [0]
[0] [0] [1]
以应用90°偏航,绕Z轴每个基矢量(反映我的数学倚),这几乎是微不足道的:
U = [0] V = [-1] W = [0]
[1] [ 0] [0]
[0] [ 0] [1]
因此,90°偏转后,变换矩阵将是:
M = [0 -1 0 0]
[1 0 0 0]
[0 0 1 0]
[0 0 0 1]
此矩阵施加到受试者将实现绕Z.所需旋转90°
为了再经45°适用45°俯仰(我会好好待绕X轴),我们在YZ平面内旋转,我们的新的基础载体,这个时候:
U = [0 ] V = [-1] W = [ 0 ]
[0.7] [ 0] [-0.7]
[0.7] [ 0] [ 0.7]
因此,新的变换矩阵是:
M = [0 -1 0 0]
[0.7 0 -0.7 0]
[0.7 0 0.7 0]
[0 0 0 1]
如果您乘两个旋转起来:
Yaw(90)*Pitch(45) = [0 -1 0 0]*[1 0 0 0] = [0 -0.7 0.7 0]
[1 0 0 0] [0 0.7 -0.7 0] [1 0 0 0]
[0 0 1 0] [0 0.7 0.7 0] [0 0.7 0.7 0]
[0 0 0 1] [0 0 0 1] [0 0 0 1]
Pitch(45)*Yaw(90) = [1 0 0 0]*[0 -1 0 0] = [0 -1 0 0]
[0 0.7 -0.7 0] [1 0 0 0] [0.7 0 -0.7 0]
[0 0.7 0.7 0] [0 0 1 0] [0.7 0 0.7 0]
[0 0 0 1] [0 0 0 1] [0 0 0 1]
你会发现,所述第二形式是一样的通过操纵基础矢量产生的变换矩阵,但是这仅仅是一个巧合(和90°和45°旋转时混合起来相当常见的一种)。 在一般情况下,应用程序的顺序都不匹配的基础上变换。
我已经没力气的,所以我希望解释至今让事情更清晰,不泥泞。