Flash基础理论课 第十四章 反向运动学:拖拽与伸展Ⅰ

返回“Flash基础理论课 - 目录”

第十三章介绍了一些基础的运动学以及正向与反向运动学之间的区别。前一章我们讲了正向运动学,本章就要学习与它关系紧密的反向运动学。涉及到的动作就是拖拽与伸展。

与正向运动学的例子相同,本章的例子也是从独立的关节开始建立系统。我们从单个关节开始,然后到多个关节。首先,我会给大家演示最简单的计算角度与位置的方法。只是在代码中使用基本的三角学进行大概的测算。最后,会给大家简要地介绍使用余弦定理的方法,这样计算出来的结果更加准确,但会消耗大量的计算——这就是所谓的权衡。

单物体的拖拽与伸展

前面说过,反向运动学系统可以分为两种不同的类型:拖拽与伸展。

当系统的自由端向目标点伸展时,系统的另一端——固定端,也许是动不了的,因此如果目标点位置超出了自由端运动的范围,那么自由端永远也不能到达目标点。举个例子,当我们试图抓住某个东西时,手指就朝着这个物体移动,手腕的转动会使我们的手指与目标位置越来越近,肘部,肩膀和身体其它的部分也都尽可能地伸展。有时,所有这些位置的组合将会使手指接触到物体;有时也许不行。如果物体是来回运动的,我们的肢体就要做出即时的反映不断调整位置,为了让手指能够尽可能地够到该物体。反向运动学将会告诉我们,如何设置所有这些零件的位置,达到最佳的伸展效果。

另一种反向运动学是在物体被拖拽的时候。这个例子中,自由端是被一些外部的力所拖动的。无论何时,系统其余的部分都紧随其后,它们会将自己放置到自然的可能位置上。可以想象成一个没有知觉死尸(对不起,这是我唯一能想到的)。抓住他的手然后拽着它走。

我们施加在对方手上的力,会传到手腕,肘部,肩膀,以及身体的其余部分,它们都沿着拖拽的方向移动。这个例子中,反向运动学将告诉我们所有的这些零件是如何随着拖拽组合成正确的位置。

最好的理解方法就是用例子程序加以说明,每个例子都使用一个关节。我们需要用到 Segment 这个类,因此要保证它在我们工作的工程或类路径中。

单关节伸展

对于伸展而言,所有关节都要能向目标旋转。目标,如果还没读懂我的意思,就把它想成鼠标。让关节向目标旋转,需要知道两点间 x,y 轴上的距离。然后就可以使用Math.atan2 求出该角度的弧度制。将它转换为角度制,就得到了关节的rotation。代码如下(可见 OneSegment.as):

package {
 import flash.display.Sprite;
 import flash.events.Event;
 public class OneSegment extends Sprite {
  private var segment0:Segment;
  public function OneSegment() {
   init();
  }
  private function init():void {
   segment0 = new Segment(100, 20);
   addChild(segment0);
   segment0.x = stage.stageWidth / 2;
   segment0.y = stage.stageHeight / 2;
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  private function onEnterFrame(event:Event):void {
   var dx:Number = mouseX - segment0.x;
   var dy:Number = mouseY - segment0.y;
   var angle:Number = Math.atan2(dy, dx);
   segment0.rotation = angle * 180 / Math.PI;
  }
 }
}

图 14-1 所示,运行结果。测试一下观察关节是如何跟随鼠标的。即使关节离得很远,它都像是快要抓住鼠标一样。


图14-1 单个关节向鼠标伸展

时间: 2024-11-05 14:49:19

Flash基础理论课 第十四章 反向运动学:拖拽与伸展Ⅰ的相关文章

Flash基础理论课 第十四章 反向运动学:拖拽与伸展Ⅱ

返回"Flash基础理论课 - 目录" 抓住一个物体 下一个例子,还要重新用到 Ball 类,把它加入到我们的工程或类路径中.然后为小球创建一些新的变量,用于移动.注意这段代码建立在最后一个例子的基础上,我们只需要加入: private var ball:Ball; private var gravity:Number = 0.5; private var bounce:Number = -0.9; 在init 方法中,创建一个 Ball的实例并加入显示列表. private func

Flash基础理论课 第十六章 3D线条与填充Ⅰ

返回"Flash基础理论课 - 目录" 第十五章我们介绍了3D,但只是将物体置于3D空间中,设置大小与位置.物体实际上还是2D的.这就像老的3D游戏中,我们可以绕着某个物体或人物走,这些对象会转过来面对我们.这些物体或人物并不是真正的会转过来 -- 只是看上去是这样的,因为它们都是2D 物体,那是我们看到它唯一的一个视角. 本章,我们将真正地在 Flash中创建3D 模型.具体说来有创建并使用3D 点,线条,填充以及立体图形.学习完本章,大家就可以任意在三维空间中创建各种形状,并对它们

Flash基础理论课 第十九章 实用技巧 Ⅲ

返回"Flash基础理论课 - 目录" 实用公式 统领全书,我们已经有了各种运动和效果的公式.我已经提取出了最实用和最常用的公式.方程.以及代码的摘录,并将它们列在本章的最后.我认为将它们放到同一个地方应该对大家非常有帮助,因此我将这些我认为最需要的内容放到一起作为整体的一个参考资料.我将会在这一页夹上书签. 第三章 基础三角函数的计算: 角的正弦值 = 对边 / 斜边 角的余弦值 = 邻边 / 斜边 角的正切值 = 对边 / 邻边 弧度转换为角度以及角度转换为弧度: 弧度 = 角度

Flash基础理论课 第十九章 实用技巧 Ⅰ

返回"Flash基础理论课 - 目录" 现在您已经来到了最后一章.我将所有想要介绍的一些小东西都放在了这一章,它们不太合适放在其它地方,或者说与前面章节的主线有些脱离. 本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点. 由于这些课题都是比较零碎的概念,所以我没有办法将这些许许多多的内容组织起来.因此每一节都是一个独立的单元.好了,不多说了,让我们开始吧. 布朗(随机)运动 先讲讲历史.一天,一个名叫罗伯特-布朗(Robert Brown)的植物学家正在观察一滴

Flash基础理论课 第十五章 3D基础Ⅰ

返回"Flash基础理论课 - 目录" 前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了.现在,将它们带入到下一个等级. 创建 3D 图形总是那么另人兴奋.新加入的这个维度似乎将物体真正地带入到了生活中.如何在Flash 中实现 3D 在无数的书籍和教学软件中都有介绍.但是我不打算跳过这些内容,我们会很快地将所有基础的知识讲完.随后,将前面章节中讨论的运动效果放到三维空间中.说得详细些,将给大家介绍速度,加速度,摩擦力,反弹,屏幕环绕,缓动,弹性运动,坐标旋转

Flash基础理论课 第十二章 粒子引力与万有引力Ⅰ

返回"Flash基础理论课 - 目录" 很高兴到晋级到了这一章.前面的章节总体来说都是些交互的运动.先让物体运动起来,再让物体与环境产生交互,随后与用户交互,最后是物体之间的交互.本章将详细地为大家介绍物体之间的交互,并带有一定距离的.说具体些,我们将学习粒子,重力(与前面有些不同),弹性运动(还是它!)以及大名鼎鼎的Node Garden.让我们开始吧! 粒子(Particles) 说明一下我们所指的粒子是什么意思.出于本章的目的,粒子只就是一个独立的单位,通常会伴有着几个(或多个)

Flash基础理论课 第十九章 实用技巧 Ⅱ

返回"Flash基础理论课 - 目录" 基于计时器与时间的动画 到目前为止本书的所有例子都是通过把运动代码放到onEnterFrame 方法中并将它赋给一个enterFrame 事件的处理函数来实现的.我一直认为这是最简单的一种方式,因为帧的概念在 Flash 中根深蒂固,它就是给我们准备的:我猜我们大多都习以为常了. 然而,对于那些从非 Flash 编程环境转来的朋友,对于这种模式可能并不习惯.对于他们来说,时序动画模型(使用Interval 或 Timer)似乎可以更加精准地控制动

Flash基础理论课 第十六章 3D线条与填充 Ⅲ

返回"Flash基础理论课 - 目录" 建立其它形状的模型 恭喜各位!您已经掌握了旋转立方体.现在我们可以去建立所有种类的形状了.只要先将它们绘制在方格纸上,标出点和三角形,再将放入数组即可.这张图可以帮助我们用几种视角绘出物体,旋转后可以看到每个面以及在三角形上标出的点.本节提供了一些其它的图形作为起点. 金字塔形 下面是3D 金字塔形的代码(可以在Pyramid.as中找到).首先是点: points[0] = new Point3D( 0, -200, 0); points[1]

Flash基础理论课 第十六章 3D线条与填充Ⅱ

返回"Flash基础理论课 - 目录" 运用三角形 运用三角形有许多好处--或许比我知道的还多,我们这里只做简单的介绍介绍.首先,运用三角形我们能够确定多边形的所有顶点都在一个平面上,因为一个三角形定义一个平面.如果大家还不确定为什么它很重要,那么我们就拿字母 E 的例子来说,随机地改变一些点的 z 值.这时可能会得到一些有趣的结果,这些结果也很快会变成不可预想或不可预知的. 其次,使用三角形,在绘制复杂的形状时,可能会很简单.例如,考虑一下图 16-8. 图16-8 更加复杂的 3D