1

好的,所以 - 这与我之前的问题在两个坐标空间之间转换一个对象密切相关,但更直接,它应该有一个明显的答案。

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

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

4

1 回答 1

4

实际上,它是关于坐标空间之间的转换

好的,您了解您可以拥有一个进行平移或旋转的矩阵。(或缩放。或倾斜。等)您可以将这样的矩阵乘以一个点(V)以获得新的(平移/旋转/等)点。例如:

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 位置。否则工作量太大。)

你会在机器人技术中看到很多这样的东西,它们可以为正向运动学提供一个很好的基本介绍。在机器人技术中,至少对于更简单的机器人来说,你有一个旋转的电机和一个可以平移的肢体长度。然后还有另一个马达。(相比之下,人的肩关节可以同时围绕所有三个轴旋转。)

您可以查看CMU 机器人操作课程 (15-384)的课程讲义。

也许像他们的Forward Kinematics Intro一样。

于 2009-02-01T09:42:07.050 回答