Math 如何始终从特定方向旋转

Math 如何始终从特定方向旋转,math,3d,Math,3d,(提前道歉。我的数学技能和描述能力似乎暂时离开了我) 想象屏幕上有一个立方体,有两组控件。一组用于将立方体侧向旋转的控件(也称为偏航或Y,甚至Z,取决于一个人的数学倾斜度)和另一组用于上下旋转的控件(也称为俯仰或X) 我想做的是使两组sof控件始终相对于查看器/屏幕旋转立方体,而不管立方体当前如何旋转 基于矩阵或四元数的旋转的常规组合无法实现此效果,因为旋转是以串行方式应用的(每个旋转从上一个旋转停止的位置“开始”) e、 g.使用psuedo代码 combinatedRotation=Rota

(提前道歉。我的数学技能和描述能力似乎暂时离开了我) 想象屏幕上有一个立方体,有两组控件。一组用于将立方体侧向旋转的控件(也称为偏航或Y,甚至Z,取决于一个人的数学倾斜度)和另一组用于上下旋转的控件(也称为俯仰或X)

我想做的是使两组sof控件始终相对于查看器/屏幕旋转立方体,而不管立方体当前如何旋转

基于矩阵或四元数的旋转的常规组合无法实现此效果,因为旋转是以串行方式应用的(每个旋转从上一个旋转停止的位置“开始”)

e、 g.使用psuedo代码
combinatedRotation=RotateYaw(90)*rotateTech(45)
将给我一个立方体,它似乎“滚动”到一边,因为俯仰旋转也已旋转。 (或者举一个更生动的例子,
RotateYaw(180)*rotateTech(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:(显示在第一次编辑之前,因为它为编辑提供了上下文。)

在最初发布这个答案很久之后,我再次访问这个答案,我意识到我可能没有发现一个误解,即您可能对如何从每个控件应用旋转产生误解

其思想不是累积每个控件要应用的旋转,然后分别应用它们。相反,您应该立即将每个增量旋转(即每次一个滑块控件触发更改事件)应用于U、V和W向量

更具体地说,不要说,“总的来说,垂直控制移动了47°,水平控制移动了-21°”,而是将它们作为两个大的旋转来应用。这将表现出与你的问题相同的问题。相反,假设“垂直滑块只移动了0.23°”,并将U、V和W绕X轴旋转0.23°

简而言之,下面描述的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°的俯仰角(我将以X轴为中心),我们在YZ平面上旋转新的基向量,这次旋转45°:

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°旋转时非常常见)。在一般情况下,两种应用程序的顺序都与基变换不匹配


我已经没有动力了,所以我希望到目前为止的解释能让事情变得更清楚,而不是更混乱。

立方体是屏幕上唯一的对象,还是您将它作为一个例子?在这种情况下,旋转将只适用于一个对象。。。这可能是其他对象的集合,但我相信我可以毫无问题地将旋转应用于组。您能否提供前面提到的90度偏航旋转和45度俯仰旋转的示例?(我想我误解了,要么得到了相同的结果……要么确实是非常奇怪的结果)