为什么你好thar。我有一个3D模型,其3轴的起始角度是已知的。使用此模式(information found here)将这些角度转换为方向余弦矩阵:
随着时间的推移获得新的角度值,对应于模型方向的更新。要考虑这些新值,我会以这种方式更新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
答案 0 :(得分:0)
您需要做的是将元素等同于两个旋转矩阵
E_1 = Rx(dθx)Ry(dθy)Rz(dθz)
和
E_2 = Rx(dφx)Rz(dφz)Ry(dφy)
逐个元素。找到仅包含sin(dφy)
和cos(dφy)
的两个elemet,并根据tan(dφy)=...
,dθx
和dθy
将它们划分为dθz
。
我尝试用DCM给出但是我不能复制旋转序列以获得你拥有的东西。我上面的E_1
类似,但有些迹象不同。在我做的例子中,我得到了以下表达式
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)- ...
你必须根据你使用的序列来计算自己的关系。
注意:知道dφy
后,上述E_1 = E_2
等式变为
Rx(dφx)Rz(dφz) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)
为dφz
求解,然后你有
Rx(dφx) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)Rz(-dφz)
代表dφx
。