1

为什么你好。我有一个 3D 模型,其沿其 3 轴的起始角度是已知的。使用此模式将这些角度转换为方向余弦矩阵(信息可在此处找到):

DCM

随着时间的推移获得新的角度值,对应于模型方向的更新。为了考虑到这些新值,我以这种方式更新 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

4

1 回答 1

0

What you have to do is equate the elements two rotation matrices

E_1 = Rx(dθx)Ry(dθy)Rz(dθz)

and

E_2 = Rx(dφx)Rz(dφz)Ry(dφy)

in an element by element basis. Find two elemetns that contain only sin(dφy) and cos(dφy) and divide them to get tan(dφy)=... in terms of dθx, dθy and dθz.

I tried to do this with the DCM given but I cannot replicate the sequence of rotations to get what you have. My E_1 above is similar but some signs are different. In my example that I did I got the following expressions

dφy=atan( tan(dθy)/cos(dθz) )
dφz=atan( (cos(dθy)*sin(dθz))/(cos(dθy)*cos(dθz)*cos(dφy)+sin(dθy)*sin(dφy)) )
dφx=atan( (cos(dθx)*sin(dθy)*sin(dθz)+sin(dθx)*cos(dθz))/(cos(dθx)*cos(dθz)- ...

You have to work out your own relationships based on the sequences you use.

Note: that once dφy is known the above E_1 = E_2 equality becomes

Rx(dφx)Rz(dφz) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)

which is solved for dφz and then you have

Rx(dφx) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)Rz(-dφz)

for dφx.

于 2012-06-04T14:46:31.153 回答