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