好的,所以 - 这与我之前的问题Transforming an object between two coordinate spaces密切相关,但更直接,它应该有一个明显的答案。
对象本地坐标空间,我如何“抓住它”?假设我将Orc加载到我的游戏中,我如何以编程方式知道它的头部,左臂,右臂和原点(肚脐?)是什么?当我知道它在哪里时,我需要手动保存它,还是在DirectX API中神奇地存在?在我的另一个问题中,有人说过存储X,Y,Z方向和原点的顶点?我如何找到这些顶点?我是否可以任意选择它们,在将它们加载到我的游戏中之前将它们分配给模型?等
这不是关于坐标空间之间的转换
答案 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。