如何总是从一个特定的方向旋转(How to always rotate from a particu

2019-09-26 13:48发布

(事先道歉。我的数学技能和说明的权力似乎已经离开我的那一刻)想象一下,屏幕上的立方体,两组控制。 控件一组旋转立方体一边到另一边(又名偏航或Y甚至取决于一个人的数学倾向Z)和另一组的控制来上下转动(又名间距或X)。

我想要做的就是让这个两个集SOF控件总是相对旋转立方体到浏览器/屏幕不论立方体当前如何旋转。

因为旋转得到以串行方式应用(每个旋转从那里上一个不放过“开始”),无论是矩阵或基于四元数旋转的常规组合不会达到这种效果。

例如随着的伪代码combinatedRotation = RotateYaw(90) * RotatePitch(45)将给出我出现因为俯仰转动已被旋转,以及被“滚动”到一侧的立方体。 (或者更生动的例子RotateYaw(180) * RotatePitch(45)会产生在那里出现的间距在反向工作到屏幕立方体)

可有人要么点我或关系提供正确的方式,使两个旋转彼此独立的效果,这样不论立方体当前如何旋转,偏航和变桨作品“预期”到屏幕上的控制?

Answer 1:

编辑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°旋转时混合起来相当常见的一种)。 在一般情况下,应用程序的顺序都不匹配的基础上变换。

我已经没力气的,所以我希望解释至今让事情更清晰,不泥泞。



文章来源: How to always rotate from a particular orientation
标签: math 3d