跟踪对象的局部坐标空间

时间:2009-02-01 07:25:41

标签: c++ math 3d vector directx

好的,所以 - 这与我之前的问题Transforming an object between two coordinate spaces密切相关,但更直接,它应该有一个明显的答案。

对象本地坐标空间,我如何“抓住它”?假设我将Orc加载到我的游戏中,我如何以编程方式知道它的头部,左臂,右臂和原点(肚脐?)是什么?当我知道它在哪里时,我需要手动保存它,还是在DirectX API中神奇地存在?在我的另一个问题中,有人说过存储X,Y,Z方向和原点的顶点?我如何找到这些顶点?我是否可以任意选择它们,在将它们加载到我的游戏中之前将它们分配给模型?等

这不是关于坐标空间之间的转换

1 个答案:

答案 0 :(得分:4)

实际上,它是关于 在坐标空间之间进行转换

好的,您了解您可以拥有一个执行翻译或轮换的矩阵。 (或缩放。或倾斜。等等)您可以将这样的矩阵乘以点(V)以获得新的(平移/旋转/等)点。 E.g:

Mtranlate = [ 1 0 0 Tx ]   *  V = [ Vx ]   =   [ Vx + Tx ]
            [ 0 1 0 Ty ]          [ Vy ]       [ Vy + Ty ]
            [ 0 0 1 Tz ]          [ Vz ]       [ Vz + Tz ]
            [ 0 0 0 1  ]          [  1 ]       [  1      ]

围绕X / Y / Z轴旋转:

Mrotate_x = [ 1  0     0    0 ]  * V =  [ Vx ]   =   [ Vx              ]
            [ 0 cos  -sin   0 ]         [ Vy ]       [ Vy*cos - Vz*sin ]
            [ 0 sin   cos   0 ]         [ Vz ]       [ Vy*sin + Vz*cos ]
            [ 0  0     0    1 ]         [  1 ]       [  1              ]

您可以通过将矩阵相乘来组合多个操作。
例如:Mnew = Mtranslate * Mrotate_x。
(是的,订单确实很重要!)

因此,给定一个真实的基础原点,你可以转换为你的(已知的/提供的)兽人的xy位置,从那时的地形推断你的兽人的脚的z位置是什么并转化为它。现在你的全球坐标中有你的兽人的“脚”。从那里,你可能想要旋转你的兽人,使他面向一个特定的方向。

然后向上翻译(根据你的兽人模型)找到它的脖子。从颈部开始,我们可以向上翻转(也许可以旋转)以找到它的头部或者找到它的肩膀。从肩部,我们可以旋转和平移,找到肘部。从肘部我们可以旋转并平移以找到手。

兽人模型的每个组件都有一个本地参考框架。每个都与参考帧相关,其中它通过一个或多个变换(矩阵)连接。通过乘以所有局部矩阵(变换),我们最终可以看到如何从兽人的脚到他的手。

(请注意,我会为兽人制作动画,只需用他的脚x,y,z位置。否则它的工作太多了。)

你在机器人技术中看到了很多这样的东西,可以为前向运动提供一个很好的基本介绍。在机器人技术中,至少对于更简单的机器人,你有一个旋转的马达,以及一个可以翻转的肢长。然后是另一个马达。 (相比之下,人体肩关节可以同时围绕所有三个轴旋转。)

您可以look over the course HANDOUTS for CMU's Robotic Manipulation class (15-384).

也许就像他们的Forward Kinematics Intro