Flash_向量教程.pdf_第1页
Flash_向量教程.pdf_第2页
Flash_向量教程.pdf_第3页
Flash_向量教程.pdf_第4页
Flash_向量教程.pdf_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Flash 向量教程 这是一篇老而经典的教程 记得越看到后面越头疼 每次都没坚持看完 本次打 算看完并翻译完 教程目录教程目录 Flash 向量 0 序言 Flash 向量 1 点和向量 Flash 向量 2 长度和法线 Flash 向量 3 加法和投影 Flash 向量 4 速度和加速度 Flash 向量 5 相交 Flash 向量 6 弹性 Flash 向量 7 球和线 Flash 向量 8 球和角 Flash 向量 9 球和球 Flash 向量 10 高速运动的球 Flash 向量 11 两个高速运动的球 Flash 向量 12 球和圆弧 翻译 整理 更多Flex Air Flash As Fms 电子书请访问 FLASH向量 1 点和向量 基础 向量从哪儿来 如果您曾经试着开发过一些游戏 那么很可能你已经尝试过放置和 移动舞台上的MovieClip 那么您肯定知道每个影片剪辑有2个坐 标 x和y 因此 可以这样来定义舞台上的每一个点 非常好 仅仅用这一行代码 我们就声明并且创建了一个对象 p 而且 我们还赋予了它2个属性 x 和 y 现在你就可以根据需 要 随时访问它的属性 如 之后 就会得到 点对象p的x属性为10 y属性为5 然后 你就 可以构建一个MovieClip 并把MovieClip放置到这个坐标 当然 您不一定要构建并放置MovieClip 即便没有MovieClip 所有的数 学逻辑仍然可以正常工作 我们只是用MovieClip来说明问题罢 了 不过 通常在真正的游戏中 还是得有点东西在舞台上移动 的 否则会是一个编码非常好 但玩起来很沉闷的游戏 一定要注意 Flash使用的Y坐标方向是反的 在大多数人的宇宙观 里面 Y坐标的正方向是抬头向上 但Flash偏偏喜欢低头向下 之前 我们已经创建了1个点对象 我们可以看到它可以在舞台上 现在 是时候做点有难度的东西了 我们创建2个点对象 或许你还没有发现 其实你已经构建了你的第一个向量 不要觉得 不好意思哦 对于任何人来说 他们都可能在不知不觉中构建了向 量 向量 正如你所看到的 可以用2个点来构建 点p0称为起 点 点p1称为终点 正如我们所感知的一样 向量是有方向的 向 量p0 p1和向量p1 p0是不一样的 它们很相似 他们有同样 的长度和同样的点 但是它们的方向相反 这样 一个形式比较良 好的向量声明方式就光荣诞生了 1 p x 10 y 5 1 2 p x p y 1 2 p0 x 10 y 5 p1 x 12 y 6 1 2 3 4 v p0 x 10 y 5 p1 x 12 y 6 我们可以用图来表示这个向量和它的点 现在 你可能在想 这太容易了 你也可能在想 这咖啡的口味 很奇怪哦 但我们还没有结束呢 矢量也可以用起点和方向分量来 表示 也许你会想 等等 终点呢 不要把它忘了哦 放心 我 们待会儿会需要它的 那么现在 不用终点 我们如何来声明向量 呢 看起来有点眼熟吧 他的确和我们先前构建的向量是一摸一样的 起点相同 x方向的分量是2 y方向的分量是1 他的意义是 从 点 10 5 出发 向右走2步 向下走1步 不要不相信哦 他 结束的位置就是p1 事实上 向量的终点 可以根据它的起点 和x y方向的分量计算得出 如果你用的起点和终点的形式来表示向量 也可以这样来计算出x方 向和y方向的分量 从现在开始 每当谈及向量 我们就会想到它有2个点p0和p1 每 个点都有x y坐标 而向量有x y分量 如果你用起点和向量来表示物体的移动 这时候 向量就被赋予了 不同的称谓 常见的有 速率 速度 运动 位移 不要让 这些名字给迷惑了 他们只不过是在x y方向上移动物体而已 基础 向量有什么 对于每个向量来说 它已经拥有2个点和x y方向分量 这似乎足 以让它感到满足和快乐 但是 它还有更多有用的属性哦 每个向 量都有长度 长度其实是向量的起点与终点之间的距离 因为我们 已经知道向量的x y方向的分量 我们可以很容易的计算出它的长 度 这其实就是勾股定理 中国称为勾股定理 于公元前1000年发现 国外称为毕达哥拉斯定理 于公元前500年发现 x分量的平方 加y分量的平方 再取平方根 使用向量的一个好处是 你不需要使用角度或者sin等复杂的三角函 数 但是 我知道很多人是喜欢角度的 我们需要能将向量转化成 1 2 3 4 5 v p0 x 10 y 5 vx 2 vy 1 1 2 3 v p1 v p1 x v p0 x v vx v p1 y v p0 y v vy 1 2 v vx v p1 x v p0 x v vy v p1 y v p0 y 1 v len Math sqrt v vx v vx v vy v vy 角度 长度 的形式 幸运的是 这个操作还不是很麻烦 是的 到目前为止 所有的东西还不是很麻烦 你可能知道 flash比较喜欢用弧度来衡量角的大小 所以如果你想 让影片剪辑总是朝着运动矢量的方向前进 您需要将弧度 radians 转换成度 degrees 有时候 你知道角度和长度 要通过这些来计算向量 你可能不知 道怎么办 不用担心 你很快就可以学会 它实际上不是非常的复 杂 注意 这次我没有用 简单 这个词 基础 什么是向量的归一化 注 原作者虽然用英文写作 但把normal这个单词 理解为 正 常 这是应该是不对的 在数学中 称为 归一化 每个向量都可以被归一化 长度为1的向量 称为归一化向量 将x y分量除以向量的长度 我们得到了单位向量 和普通的向量 一样 归一化的向量也可以分解为x和y方向的分量 单位向量的长 度为1 这一点你可以测试一下 真的 你可以用勾股定理来计 算dx dy对应的向量长度 如果你懒于测试 而直接相信我说的 那当然更好 归一化的向量只告诉了我们方向信息 而不包含距离 信息 就好比当你跟人家说 地铁站往这走 这句话包含了方向 信息 但是没有包含有多远的信息 做除法的时候一定要小心 不要除以0 向量的长度可以为0 而且 为0的时候仍然是一个向量 但是没有办法归一化 所以向量做归一 化操作时 一定要检查向量的长度是否为0 在flash中 除以0 返 回的将是 Infinity 向量有 法线 法线是指与向量垂直的向量 如果你还记得角度的 话 那么法线就是将向量旋转90度 因为向量是有方向的 所以法 线就会有2条 分别称为左法线和右法线 假如你起身站起来 我知 道其实你现在正坐着在阅读文章 你可能想坐下来 但偶尔站起来 一下有利于身体健康 你面向的方向有一个向量 然后 你向2边 展开双手 此时你的左右手就好比左右法线 右法线和左法线这样计算 最后 我制作了一个小的flash 你可以到处拖动那个点 然后观察 向量的变化 1 angle Math atan2 v vy v vx 1 angledeg angle 180 Math PI 1 2 v vx v len Math cos angle v vy v len Math sin angle 1 2 v dx v vx v len v dy v vy v len 1 2 3 4 v rx v vy v ry v vx v lx v vy v ly v vx 黑色是向量 蓝色是单位向量 绿色是右法线 红色是左法线 你 可以下载fla源文件 基础 处理向量的乘法 1个单独的向量 在很多的时候 让你觉得已经足够的智能和强大 去应付这个世界上的各种问题 然而事实上 你很少只需要1个向 量 通常 你需要使用2个 3个甚至更多的向量 所以管理多个向 量是非常重要的 否则它们会脱离你的控制 要知道和一个失控的 向量战斗不是一件好玩的事情 首先 多数情况下 有多个向量影响物体 一个例子就是重力 当 物体本身在移动 用一个向量表示 而重力会把物体往下拉 重 力和其他的力一样 可以用一个向量来表示 此时就有2个向量 你 需要找到2个向量的综合效果 以确定物体到底该怎么移动 为了 将2个向量加起来 你需要把他们的分量加起来 如果你有更多的向量 你可以用同样的办法 把它们都加起来 向量的投影 有时候我们非常需要知道2个向量的方向关系 他们到底是把我们的 物体往同一个方向牵引 还是一东一西呢 我们将2个向量的x分量相乘 y分量相乘 然后在相加 得到结 果dp 称为 向量v1和向量v2的点乘 dp并不是一个向量 而是 一个数字 如果是正数 那么2个向量的方向是相同的 夹角小 于90度 如果是负数 那么2个向量的方向是相反的 夹角大 于90度 下面说下2个向量的投影问题 将向量在其他任意的坐标系 向 量v2和它的发现构成了一个坐标系 里面进行转换是非常有用的 这样投影的分量就可以单独变化 计算v1在v2上的投影的办法是 向量的投影也是一个向量 我们先计算出2个向量的点乘 再乘以向 量v2的归一化向量 就得到了投影 以下是我制作的一个关于投影向量的例子 你可以四处拖动那些 1 2 3 resultv resultv vx v1 vx v2 vx resultv vy v1 vy v2 vy 1 dp v1 vx v2 vx v1 vy v2 vy 1 2 proj vx dp v2 dx proj vy dp v2 dy 点 以观察投影分量的变化 黑线是向量v1 蓝线是向量v2以及它的法线 绿线和红线分别 是v1在v2和v2的法线上的投影 你可以下载fla源文件 FLASH向量 2 长度和法线 基础 向量有什么 对于每个向量来说 它已经拥有2个点和x y方向分量 这似乎足 以让它感到满足和快乐 但是 它还有更多有用的属性哦 每个向 量都有长度 长度其实是向量的起点与终点之间的距离 因为我们 已经知道向量的x y方向的分量 我们可以很容易的计算出它的长 度 这其实就是勾股定理 中国称为勾股定理 于公元前1000年发现 国外称为毕达哥拉斯定理 于公元前500年发现 x分量的平方 加y分量的平方 再取平方根 使用向量的一个好处是 你不需要使用角度或者sin等复杂的三角函 数 但是 我知道很多人是喜欢角度的 我们需要能将向量转化成 角度 长度 的形式 幸运的是 这个操作还不是很麻烦 是的 到目前为止 所有的东西还不是很麻烦 你可能知道 flash比较喜欢用弧度来衡量角的大小 所以如果你想 让影片剪辑总是朝着运动矢量的方向前进 您需要将弧度 radians 转换成度 degrees 有时候 你知道角度和长度 要通过这些来计算向量 你可能不知 道怎么办 不用担心 你很快就可以学会 它实际上不是非常的复 杂 注意 这次我没有用 简单 这个词 基础 什么是向量的归一化 注 原作者虽然用英文写作 但把normal这个单词 理解为 正 常 这是应该是不对的 在数学中 称为 归一化 每个向量都可以被归一化 长度为1的向量 称为归一化向量 将x y分量除以向量的长度 我们得到了单位向量 和普通的向量 一样 归一化的向量也可以分解为x和y方向的分量 单位向量的长 度为1 这一点你可以测试一下 真的 你可以用勾股定理来计 算dx dy对应的向量长度 如果你懒于测试 而直接相信我说的 那当然更好 归一化的向量只告诉了我们方向信息 而不包含距离 信息 就好比当你跟人家说 地铁站往这走 这句话包含了方向 信息 但是没有包含有多远的信息 做除法的时候一定要小心 不要除以0 向量的长度可以为0 而且 为0的时候仍然是一个向量 但是没有办法归一化 所以向量做归一 1 v len Math sqrt v vx v vx v vy v vy 1 angle Math atan2 v vy v vx 1 angledeg angle 180 Math PI 1 2 v vx v len Math cos angle v vy v len Math sin angle 1 2 v dx v vx v len v dy v vy v len 化操作时 一定要检查向量的长度是否为0 在flash中 除以0 返 回的将是 Infinity 向量有 法线 法线是指与向量垂直的向量 如果你还记得角度的 话 那么法线就是将向量旋转90度 因为向量是有方向的 所以法 线就会有2条 分别称为左法线和右法线 假如你起身站起来 我知 道其实你现在正坐着在阅读文章 你可能想坐下来 但偶尔站起来 一下有利于身体健康 你面向的方向有一个向量 然后 你向2边 展开双手 此时你的左右手就好比左右法线 右法线和左法线这样计算 最后 我制作了一个小的flash 你可以到处拖动那个点 然后观察 向量的变化 黑色是向量 蓝色是单位向量 绿色是右法线 红色是左法线 你 可以下载fla源文件 1 2 3 4 v rx v vy v ry v vx v lx v vy v ly v vx FLASH向量 3 加法和投影 基础 处理向量的乘法 1个单独的向量 在很多的时候 让你觉得已经足够的智能和强大 去应付这个世界上的各种问题 然而事实上 你很少只需要1个向 量 通常 你需要使用2个 3个甚至更多的向量 所以管理多个向 量是非常重要的 否则它们会脱离你的控制 要知道和一个失控的 向量战斗不是一件好玩的事情 首先 多数情况下 有多个向量影响物体 一个例子就是重力 当 物体本身在移动 用一个向量表示 而重力会把物体往下拉 重 力和其他的力一样 可以用一个向量来表示 此时就有2个向量 你 需要找到2个向量的综合效果 以确定物体到底该怎么移动 为了 将2个向量加起来 你需要把他们的分量加起来 如果你有更多的向量 你可以用同样的办法 把它们都加起来 向量的投影 有时候我们非常需要知道2个向量的方向关系 他们到底是把我们的 物体往同一个方向牵引 还是一东一西呢 我们将2个向量的x分量相乘 y分量相乘 然后在相加 得到结 果dp 称为 向量v1和向量v2的点乘 dp并不是一个向量 而是 一个数字 如果是正数 那么2个向量的方向是相同的 夹角小 于90度 如果是负数 那么2个向量的方向是相反的 夹角大 于90度 下面说下2个向量的投影问题 将向量在其他任意的坐标系 向 量v2和它的发现构成了一个坐标系 里面进行转换是非常有用的 这样投影的分量就可以单独变化 计算v1在v2上的投影的办法是 向量的投影也是一个向量 我们先计算出2个向量的点乘 再乘以向 量v2的归一化向量 就得到了投影 以下是我制作的一个关于投影向量的例子 你可以四处拖动那些 点 以观察投影分量的变化 1 2 3 resultv resultv vx v1 vx v2 vx resultv vy v1 vy v2 vy 1 dp v1 vx v2 vx v1 vy v2 vy 1 2 proj vx dp v2 dx proj vy dp v2 dy 黑线是向量v1 蓝线是向量v2以及它的法线 绿线和红线分别 是v1在v2和v2的法线上的投影 你可以下载fla源文件 FLASH向量 4 速度和加速度 使用向量来移动 希望你在阅读本节之前 已经阅读了之前的基本章节 此刻 你应 该已经知道什么是点 什么是向量 和如何计算向量的各种属性 并且你一直在等待能够亲自动手在一些真实的游戏中使用向量 让 我们开始研究下如何使用向量来移动物体 在这个例子中 红色的点就是我们的对象 通过方向键 你可以改 变运动向量的x y分量 首先 我们定义一个对象 对象的起点是x 100 y 150 移动向量的值是vx 3 vy 1 对象的新位置是向量的终点p1 它是在函数updateVector中进行 计算的 如果你已经不记得如何查找p1的值 可以在Flash向量 基 础知识章节中查找 在MovieClip正确的放置了以后 我们会把终点p1作为在drawAll 函数中再一次计算位置时的起点 每次按下方向键 x y的分量就会增或者减 函 数getKeys和releaseKeys处理这一逻辑 主函数runMe在每一帧 都会执行 并且它会调用updateVector和drawAll函数来计算新位 置并对mc进行定位 并且在这个例子中 你会发现 当对象移出舞 台的时候 会重新出现到舞台的另外一边 记住在进行计算的过程中 永远不要使用MovieClip的 x y属 性 它应该是在计算过程完成以后 最后一步讲MovieClip放置到 正确的位置 帧还是时间 我们看下函数updateVector是如何找到结束点p1的新坐标的 1 2 3 4 myOb myOb p0 x 100 y 150 myOb vx 3 myOb vy 1 Flash是基于帧的程序 它会尽量以帧频的速度来执行所有的动画和 脚本 在enterframe里面来处理所有的计算是很常见的 但这事实 上并不是很好的方式 假设你写的代码是每一帧让对象的x坐标增 加1 如果你将帧频设置为20 那么代码在每一帧里面会执 行20次 从而使得对象每一帧移动20的像素 你大概就是这样想的吧 但事实上 没有flash可以准确的按照帧频 来执行 帧频只是flash想达到的最大值 但是通常都做不到 在浏 览器中运行的flash比较吃力 因为浏览器本身占用一些cpu 有些 计算机本身就比较慢 人们也可能有其他的程序在运行 所有的这 些原因都会导致帧频下降20 25 真的是这样吗 你可能在怀疑 它还在运行啊 坐标也会计 算 MovieClip的位置也会改变的啊 是的 但是你已经失去了对 你的游戏的控制了 你无法确保在一段时间之后 MovieClip位置 在哪里 它的运动速度如何 如果你的flash是设计成用来测试人们 的反应速度的 如果帧频下降50 那么低帧频的人玩就比正常帧 频下玩的人有巨大的优势 这是flash游戏的一种常见作弊方法 你 可以很容易的降低帧频 并取得游戏胜利 解决的办法是不要将计算基于帧数 而是实际的时间 在基于帧的 游戏里面 声明速度vx 3意味着MovieClip每次能够执行的时候都 会移动3个像素 在基于时间的游戏里面声明速度vx 3意味 着MovieClip每秒钟移动3个像素 在基于时间的游戏里面 帧速的 下降不会导致不可预知的结果 你仍然可以准确的知 道MovieClip在哪里 不论是1秒钟之后 10秒钟之后或者1个小时 之后 较慢的帧速在基于时间的影片里面会影响移动的平滑 对象 在舞台上被绘制的次数 在每秒钟内会减少 从而导致 跳帧 但 是每一次绘制的时候 它将绘制到准确的位置 我们使用getTimer函数来计算时间 getTimer函数返回影片从开始到现在的毫秒数 在运动计算的时 候 我们需要知道距离上一次计算的时间 所以我们用当前的时间 减去上一次的时间 并且因为时间是用毫秒来计算的 我们需要将 它除以100来得到秒 当然 你也可以使用 像素 毫秒 作为速度向 量的单位 但是注意得出的值将非常的小 终点的新坐标要根据逝去的时间来计算 让我们来试一下到底对不对 加入我们 的MovieClip在x 150 y 10的位置 速度为vx 1 如果帧速设 置为20 时间间隔的变化 不管是5毫秒还是50毫秒 例如 假设 是5毫秒 意味着每次移动的距离为v p1 x v p0 x 0 05 1秒钟 1 2 3 4 5 6 var thisTime getTimer var time thisTime v lastTime 100 v p1 v p1 x v p0 x v vx time v p1 y v p0 y v vy time v lastTime thisTime 1 2 var thisTime getTimer var time thisTime v lastTime 100 1 v p1 x v p0 x v vx time 内移动20次 移动距离20 0 05 1 像素 也恰恰符合速度v1 再 看看假设时间间隔50的情况 MovieClip每秒钟会在舞台上绘 制2次 最后的位置是2 0 5 1像素 你可以下载fla源文件 加速度 就像速度向量能随着时间改变物体的位置一样 加速度向量可以随 着时间改变物体的速度 我们先将物体的加速度设置为0 之后 当方向键被按下的时候 我们就改变加速度向量的x y分 量 在update函数里 我们会把加速度向量 添加到速度向量 使 用加速度的时候要小心 如果你不限制速度的话 它会不断的增加 下去 同样要注意 要想完全停止物体的移动 我们不仅要将速度向量设 置为0 还应该将加速度设置为0 否则物体是不会停下来的 你可以下载fla源文件 1 2 myOb ax 0 myOb ay 0 1 2 v vx v vx v ax v vy v vy v ay FLASH向量 5 相交 现在你已经知道如何来移动物体了 现实世界中 移动的对象迟早 是要碰到什么东东的 举个例子 如果移动的对象就是你本人 并 且你很幸运的话 你碰到的东西很软 比如床 但是有时候你可能 碰到坚硬的东西 砖头墙 水泥板 关闭的门 以及这个世界上的 其他的一些等待你或者其他运动的物体去碰撞的坚硬物体 所以 疼痛的一个好处就是让人们知道什么东西可以去碰撞 我们知道对象的移动向量 我们也知道墙壁所构成的向量 我们要 求得 是否 何时 何地 物体会和墙壁碰撞 换句话说就是 2个 向量在哪里相交 首先 让我们看看什么时候2个向量不想交 向量平行的时候不相 交 并且平行向量的单位向量是相等的 方向可以不相同 它们可 以使反向的 如果它们不平行 那么相交时迟早的事情 绿线是移动向量 红线 是墙壁 蓝线在它们的起点之间 交点的坐标可以这样计算 首先 我们计算出在它们起点之间的向量v3 上面的函数是用来计 算2个向量的垂直点乘 perp dot product as4game注 垂 直点乘这个概念 在中文的数学教科书我是没发现过的 参考网 址 垂直点乘和点乘非常相似 不同的是用v1的法线取代v1 点乘是 v1的法线是 1 2 v1 dx v2 dx and v1 dy v2 dy or v1 dx v2 dx and v1 dy v2 dy 01 02 03 04 05 06 07 08 09 v3 vx v2 p0 x v1 p0 x vy v2 p0 y v1 p0 y var t perP v3 v2 perP v1 v2 ip ip x v1 p0 x v1 vx t ip y v1 p0 y v1 vy t function perP va vb pp va vx vb vy va vy vb vx return pp 1 dp v1 vx v2 vx v1 vy v2 vy 1 2 v rx v vy v ry v vx 然后我们用v1的法线代替v1 这就是垂直点乘了 当两个垂直点乘的比例正好为1 那么交点就正好在移动向量的终点 上 当为0 1之间的值时 那么交点就在v1上 当为负数交点就在 向量的起点之前 当为大于1的数 交点就在向量的终点之后 当然如果你想找到在另外一个向量上的交点 你也需要为v2计 算t值 在下面的例子中 你可以尝试拖动那些点 然后观察向量的交点 如果你对求交点的实际算法感兴趣 可以在这里查看 你可以下载fla源文件 1 pp v1 vy v2 vx v1 vx v2 vy 1 2 v3 vx v1 p0 x v2 p0 x vy v1 p0 y v2 p0 y var t perP v3 v1 perP v2 v1 FLASH向量 6 弹性 一旦碰撞发生 通常会在阻挡的地反发生反弹 当你的头撞到墙的 时候是一个非常明显的例子 我不建议你这样尝试 那只会导致你 头疼 但是如果观察一些事物比如球 会非常容易的发现球碰到 障碍物的时候 很少继续向前或者正好停在那附近 让我们研究下 在碰撞发生之后 如何计算新的运动向量 图中 红线是运动向量 绿线是墙壁 黑线是墙壁的法线 而蓝线 是碰撞发生后的新的运动向量 粗线是运动向量在墙壁和墙壁的法 线上的投影 原始运动向量和新的运动向量之间的不同是很明显的 看不出来 吗 ok 你可以看一下他们的投影 在墙壁上的投影是一样的 在 墙壁的法线上的投影方向相反 从这一点 我们很容易构建一个运 动物体与墙壁之间的反弹系统 找到交点 找到运动向量的投影 将法线上的投影反向 投影相加 如果你已经忘记了什么是投影 你可以在基础知识章节中查看 v1是运动向量 v2是墙壁向量 v2的左法线是 v1 v2的点乘是 运动向量在v2上的投影 v1和v2法线的点乘 1 2 v2 lx v2 vy v2 ly v2 vx 1 dp1 v1 vx v2 vx v1 vy v2 vy 1 2 proj1 vx dp1 v2 dx proj1 vy dp1 v2 dy 1 dp2 v1 vx v2 lx v1 vy v2 ly 运动向量在v2上的投影 注意 我们需要将左法线除以长度 将其 归一化 将投影反向 通过投影相加 计算出新的向量 在下面的例子中 你可以拖动一些点 来观察运动向量的变化 你可以下载fla源文件 真实的反弹和摩擦 在真实的世界中 没有物体可以永远运动 因为摩擦会损耗能量 而弹性碰撞也不是完全的 完全弹性碰撞意味着碰撞前后运动向量 的长度不变 为了将反弹过程中的能量损失考虑进来 我们需要赋 予物体2个属性 弹性系数 和 摩擦系数 为了计算新的运动向量 我们可以分别将投影和两个物体的b和f相 乘 弹性系数影响墙壁法线上的投影 摩擦系数影响墙壁上的投 影 如果每个物体的f和b都等于1 会发生什么呢 将会发生完全弹性碰 撞 在碰撞的过程中 什么也没有损失 运动将以同样的强度继 续 举个例子 如果没有弹性 b 0 那么运动向量在发生碰撞 之后将与墙壁平行 物体将粘在墙壁上 想象一下球飞到油或者胶 水上的样子 当然 你也可以将弹性系数设置为大于1 在那种情况下 碰撞将加 速物体的移动 一个比较好的例子是弹球游戏中的杠子 球碰到的 时候 会有增加额外的速度 在这个例子中 球在舞台上运动 有重力 并且有许多的墙壁 1 2 proj2 vx dp v2 lx v2 len proj2 vy dp v2 ly v2 len 1 2 proj2 vx 1 proj2 vy 1 1 2 v1 vx proj1 vx proj2 vx v1 vy proj1 vy proj2 vy 1 2 ob b 0 99 ob f 0 99 1 2 v1 vx v1 f v2 f proj1 vx v1 b v2 b proj2 vx v1 vy v1 f v2 f proj1 vy v1 b v2 b proj2 vy 运动的点会遍历所有的墙壁 自从上次检测到现在的时间里 是否 会和他们发生碰撞 如果会碰到多个墙壁 交点最近的墙壁会被选 择 然后将物体的终点会设置到交点的位置 并计算出新的运动向 量 然后再将终点从交点的位置向新的运动向量的方向移动 移动 多少呢 用原来的运动向量的长度减去从起点到交点的长度 就是 这么多 你至少还可以从2个方面来增强这个系统 1 因为对象上一次绘制在p0 而下一次绘制在p1 我们看不到它曾 经在交点附件呆过 这可能导致对象看起来像直接从p0到p1 虽然 这样做逻辑上是不正确的 但是可以让人亲眼看到点曾经碰到墙 壁 2 当对象撞到一个墙壁之后 可能撞到第2个墙壁 而目前的方式 我们只考虑了最近的墙壁的碰撞 为了更加精确一些 我们可以在 碰撞发生之后 立即在检查新的向量与所有的墙壁之间的碰撞 这 个时候之需要检查从交点到p1的向量 图中的蓝线 你可以下载fla源文件 FLASH向量 7 球和线 球和线 到现在你可能已经厌倦了总是只有一个移动的点 倒不是说点本身 有什么不好 它们是好的 但是毕竟 点只是点 你能在你的周围 能看到多少个点 我相信不会很多 最后 我们将向前迈进一大 步 开始移动一些更加真实的东东西 球 我相信你在生活中看到过很多的球 所以你知道他们和点有什么不 同 球是有宽度的 在我们的2D例子中 球是用圆来表示的 它有 圆心坐标并且有半径 已知一个运动的球的半径是10 另外我们知道球的中心坐标 它的 移动向量和半径 我们要计算球撞上墙壁的会在哪儿 图中 灰色的圈圈表示球的中心与墙壁的交点 事实上球在更早的 时候就碰到墙壁了 球碰到墙壁的时候 球的位置应该这样的 将 墙壁向量 green 向它的法线方向移动一个半径的距离 然后求 出这个新的向量和球的运动向量 红色 的交点 所以 我们可以 不使用墙壁向量 而是用一个方向相同 起点位置不同的向量 Axes method 球和线的交点也可以用别的方法来计算 下面就来研究下如何通过 一些简单的投影来确定球是否与墙壁碰撞 1 2 game myOb r 10 game myOb p0 x 150 y 100 图中 我们可以看到 球处于他的运动向量的终点p1处 我们绘制 一个蓝色的向量 从墙壁向量的起点 v2 p0 出发 到达球的中 心 现在我们将这个新的向量在墙壁的法线上进行投影 得到向 量v3 红色 为了将球紧贴墙壁放置 我需要将它向墙壁的法线 方向移动 在示例代码中 我们计算出墙壁法线的单位向量 在runme函数里 我们检查所有的墙壁 对于每一个墙壁 如果球撞进去了 我们就计算出撞进去的距离 再将球拉回来 然后用之前同样的方法去计算反弹之后的向量 计算撞进去的距离的函数 在这个例子中 尝试拖动墙壁四个角的点 1 ball r v3 len 1 2 v lx v dy v ly v dx 01 02 03 04 05 06 07 08 09 10 11 12 13 14 for var i 1 i 0 move object away from the wall ob p1 x w lx pen ob p1 y w ly pen change movement var vb bounce ob w ob vx vb vx ob vy vb vy 01 02 03 04 05 06 07 08 09 10 11 12 function findIntersection v1 v2 vector between center of ball and starting point of wall var v3 v3 vx v1 p1 x v2 p0 x v3 vy v1 p1 y v2 p0 y project this vector on the normal of the wall var v projectVector v3 v2 lx v2 ly find length of projection v len Math sqrt v vx v vx v vy v vy return v len 注意 这个例子并没有考虑墙壁的长度 所有的墙壁都被认为是无 限长的 这种方式可以用来保证球在盒子里面 而不会出去 在下 一章节里面 我们会研究如何处理球和墙壁的角的碰撞 你可以下载fla源文件 FLASH向量 8 球和角 不是所有的墙壁都会无限延伸 他们通常从某处出发 然后在某处 结束 我们把这称为起点和终点 现在我要计算球与墙壁的角碰撞 时的位置点和碰撞后的运动向量 红色的是墙壁向量 灰色的是球的运动向量 可能碰到墙壁 也可 能碰到墙角 在findIntersection函数里面 我们检测到距离球最 近的墙壁 并找到让球 从相交状态回到紧贴状态的那个向量 墙壁向量为v2 球的运动向量是v1 先找到从墙壁的起点到球的中 心的向量v3 然后计算v3和墙壁向量v2的点乘 如果点乘为负数的话 说明球离墙壁的起点很近 并且那个移动回 去的向量是向量v3 如果点乘是0 或者正数 我就检测球是不是和墙壁的终点很近 所 以 首先 找到墙壁的终点到球中心的向量 并且和第一个点类似 我们可以再次计向量算v4和墙壁的点乘 如果点乘是正数 球会碰到终点 而v4是用于将球移开 然而 如果这个时候 点乘为0或者负数 那么墙壁的边缘和球很 近 此时 我们从墙壁起点到球中心的向量v3在墙壁法线上进行投 影 球将会从墙壁法线方向移动回去 就像上一节一样 1 2 v3 vx v1 p1 x v2 p0 x v3 vy v1 p1 y v2 p0 y 1 var dp v3 vx v2 dx v3 vy v2 dy 1 2 3 if dp0 var v v4 最后我们返回当前的向量 记住球的反弹向量将和球的返回向量垂直 当球碰到墙壁的时候 我们可以用墙壁向量来计算新的移动向量 当球碰到墙角的时候 从墙壁的终点到球中心的向量的法线就可以派上用场了 尝试拖动墙壁试一试 观察球与墙壁的碰撞 因为我们只检测了球的运动向量的终点 所以当球的速度非常快的 时候 有可能球会穿过墙壁 为了避免这种情况 你应该确保球的 速度永远不会超过它的半径 你可以分别下载球与一个墙壁和多个墙壁碰撞的例子 1 2 3 else var v projectVector v3 v2 lx v2 ly 1 return v FLASH向量 9 球和球 首先 我们看看如何判断2个球发生碰撞 然后 再思考碰撞发生之 后 球该怎么运动 图中有球1 红色 和球2 蓝色 2个球的球心之间的向量 为v 绿色 只有当v的长度小于两个球的半径只和时 两个球才 发生了碰撞 我们需要做的是让2个球刚刚紧挨着 为了达到这个目 的 我们需要将球1向v的方向移动一段距离 pen v len b1 r b2 r 现在 2个球刚好紧贴 我们需要研究下运动向量如何变化 想象一 下在两个球之间有一个无形的墙壁 墙壁的方式和球心连线向量的 法线方向相同 图中 黑色向量是向量v的法线 将它作为墙壁向量 用之前的方法 计算球1的反弹运动向量 以下是一个例子 一个球在舞台上移动 另外有几个静态的球 尝试拖动那些静态的球 你可以下载fla源文件 把它装起来 你可能想让一个球在另外一个球里面 假设 b2是大球 b1是小球 判断小球是否移出的条件是 b2 r0 collision else no collision 1 2 3 moveBack Math sqrt totalRadius totalRadius vn len vn len p3 x p2 x moveBack v dx y p2 y moveBack v dy v3 p0 v p0 p1 p3 1 2 3 4 5 if game v3 len0 collision game ob1 p0 game p3 球1的开始运动的时候 绿色是球1的运动完成的时候 蓝色是 球2 你可以下载fla源文件 FLASH向量 11 两个高速运动的球 运动的球心情肯定不错吧 因为它能动并且还能游览这个世界 但 是 如果另外一个球决定不再原地不动 而也运动起来 那么会发 生什么事情呢 我们很有必要研究一下这个 在这种情况下 我们 之前介绍的碰撞检测方法可能会失败 让我们看看相同的例子 球1按照红色运动向量来运动 球2按照蓝色运动向量来运动 如果 要正确的进行碰撞检测的话 我们需要把每个球的运动向量考虑在 内 图中 当两球相撞时 球1到达了p2 而球2到达了p3 幸亏我们 用了向量 我们可以非常容易的将2个向量相加 这样 我们就不用 考虑2个运动的球 我们用球1的运动向量减去球2的运动向量 然 后我们可以用学过的 一个运动的球和一个静 态的球 的模型 as4game注 这一段说的就是初中学的相对运 动 把2个球的运动转化成1个球的运动 用球1的运动向量减去球2的运动向量 就得到了向量v3 现在 我们可以使用上一章学习的方法来进行碰撞检测 假设球1要 移动v3这么多 而v2原地不动 如果球1在p4这一点碰到球2 我 们计算出新的向量v4 它是球1碰到球2时 自己的运动向量 因为我们知道2个球都在运动 我们可以找到变量 t 它的值 为v4的长度除以v3的长度 变量 t 的值在0到1之间 当它等于1 碰撞发生在球的运动向量的 终点 当它等于0 碰撞发生在球的运动向量的起点 为了计算2个 球发生碰撞时的位置 我们需要将将它们的运动向量乘以t 我制作了2个运动的球的例子 你可以拖动球的运动向量的终点 1 2 3 4 v3 v3 p0 ball1 p0 v3 vx ball1 vx ball2 vx v3 vy ball1 vy ball2 vy 1 game v4 p0 ball1 p0 p1 p4 1 t v4 len v3 len 1 2 3 4 ball1 p1 x ball1 p0 x t ball1 vx ball1 p1 y ball1 p0 y t ball1 vy ball2 p1 x ball2 p0 x t ball2 vx ball2 p1 y ball2 p0 y t ball2 vy 你可以下载fla源文件 2个球的弹性 在找到了碰撞点之后 我们可以改变球的运动向量 可以参考章 节球和球章节 但是到目前为止 我们只学过一个球运动时的反 弹 当2个球都在运动 它们的运动会相互影响 使得他们的运动向 量都需要重新计算 弹性取决于2个球的质量 为了简化问题 我们假设2个球的质量相 等 as4game注 如果要考虑质量不相等的情况 可以用动量守恒 定理和能量守恒定律2个方程来计算 在这种情况下 他们中心连 线方向的速度会交换 vc是球心连线向量 vcn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论