绘制由多个小部件组成的复杂模型,最关键的问题是如何处理模型的整体移动,以 及各个小部件间的相对移动。这一节就来研究这个问题。 首先,考虑一下人类的手臂: 从肩部到指尖,包括上臂(肘以上).前臂(肘以下)、手掌和手指,如图9.2所示。
手臂的每个部分可以围绕关节运动,如图9.2所示:
绘制机器人手臂这样一个复杂的模型,最常用的方法就是按照模型中各个部件的层次顺序,从高到低逐一绘制,并在每个关节上应用模型矩阵。 比如,在图9.2中,肩关节、肘关节、腕关节,指关节都有各自的旋转矩阵。
注意,三维模型和现实中的人类或机器人不一样, 它的部件并没有真正连接在-起。 如果直接转动上臂,那么肘部以下的部分,包括前臂.手掌和手指,只会留在原地,这 样手臂就断开了。所以,当上臂绕肩关节转动时,你需要在代码中实现“肘部以下部分 跟随上臂转动"的逻辑。具体地,上臂绕肩关节转动了多少度,肘部以下的部分也应该 绕肩关节转动多少度。
当情况较为简单时,实现“部件A转动带动部件B转动"可以很直接,只要对部件 B也施以部件A的旋转矩阵即可。比如,使用模型矩阵使上臂绕肩关节转动30度,然 后在绘制肘关节以下的各部位时,为它们施加同一个模型矩阵,也令其绕肩关节转动30 度,如图9.3所示。这样,肘关节以下的部分就能自动跟随上臂转动了。
如果情况更复杂一些,比如先使上臂绕肩关节转动30度,然后使前臂绕肘关节转10度, 那么对肘关节以下的部分,你就得先施加上臂绕肩关节转动30度的矩阵(可称为“肩关节模型矩阵"),然后再施加前臂绕肘关节转动10度的矩阵。 将这两个矩阵相乘,其结果可称为“肘关节模型矩阵”, 那么在绘制肘关节以下部分的时候,直接应用这个所谓的“肘关节模型矩阵”(而不考虑肩关节,因为肩关节的转动信息已经包含在该矩阵中了) 作为模型矩阵就可以了。 按照上述方式编程,三维场景中的肩关节就能影响肘关节,使得上臂的运动带动前臂的运动; 反过来,不管前臂如何运动都不会影响上臂。这就与现实中的情况相符合了。