为什么你好。我有一个 3D 模型,其沿其 3 轴的起始角度是已知的。使用此模式将这些角度转换为方向余弦矩阵(信息可在此处找到):
随着时间的推移获得新的角度值,对应于模型方向的更新。为了考虑到这些新值,我以这种方式更新 DCM:
newDCM = oldDCM * newanglesDCM
我想要什么以及如何做:现在是棘手的部分。我实际上只想要旋转矩阵的 Y 分量。为了在我的模型上应用运动,我需要将它展平,这样运动矢量就不会在空中或在地面上。为此,我只需从旋转矩阵中拉回 3 个角度并创建一个角度为 [0 Y 0] 的新角度。
我遇到的问题:当对模型应用旋转时,DCM 会更新。当检测到运动时,我将运动向量 [0 Yvalue 0] 乘以已展平的 DCM(根据前面的解释)。当瞬时旋转在 X 和 Z 分量中具有空值或接近空值时,结果非常好。但是一旦模型处于 X 和 Z 具有显着值的情况下,模型运动的“方向”就会出错。如果我应用旋转使其返回“只有 Y”的情况,它会再次开始变好。
可能出了什么问题:要么我的方向余弦矩阵是错误的,要么我用来展平矩阵的技术完全是愚蠢的。
感谢您的帮助,如果您能帮我解决这个问题,我将不胜感激!格雷格。
编辑:根据要求的示例
我的模型有 3 轴 X、Y 和 Z。这定义了模型静止时的 XYZ 约定。在起点 t0,我知道角度 dAx、dAy 和 dAz,它们允许我将模型从其原始配置旋转到它在 t0 处的配置。如果这让您感到困扰,假设模型在 t0 时处于静止状态,这没关系。
我创建 DCM 就像在图像中解释的那样(如果它从静止开始,让它成为一个单位矩阵)。
不时地对模型应用旋转。这些旋转也由 dAx、dAy 和 dAz 组成。因此,我通过将旧矩阵乘以新生成的矩阵来更新旋转矩阵 (DCM):newDCM = oldDCM * newanglesDCM。现在假设我希望模型在网格上从一个点移动到另一个点。例如,将网格想象成一条街道。无论模型是面向天空、侧面还是前面,我都希望运动是相同的:在路边,而不是在空中升起或潜入地面。如果我保持旋转矩阵原样,应用 [0 Y 0] 旋转将使它转到我不希望它去的地方。因此,我尝试通过展平 DCM 来找到我原来的旧 XZ 框架。然后我仍然有 Y 分量,所以我知道模型在街上的哪个位置移动。
想象一个角色,他的头是模特,走在外面。如果他看着建筑物的窗户并走路,他不会在空中走到窗户 - 他会走到建筑物的脚下。这正是我想做的:D