自定义的AABB碰撞检测算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主要程序代码如下:
vgIsector *make_volume_isector(vgObject *obj, unsigned int isclass, float x,float y, float z,float dirx,float diry,float dirz,float len) {
vgIsector *isector; vgVolume *vol; vgSeg seg; vol = vgNewVol(); /* 线段的一个顶点即为 AABB 的一个顶点,设置为 x,y,z */ seg.pos[0] = x; seg.pos[1] = y; seg.pos[2] = z; /* 设置线段相对于上面设置的顶点的方向 */ seg.dir[0] = dirx; seg.dir[1] = diry; seg.dir[2] = dirz; seg.len = len; /* 设置线段的长度 */ /* 根据线段数据参数创建一个体 */ vgVolSeg(vol, &seg); /* 体有其自身的坐标系统,在初始设置时注意。 */ isector = vgNewIsect(); vgName(isector,"LeftBottomCorner"); vgIsectTarget(isector, obj); vgIsectClass(isector, isclass); vgProp(isector, VGIS_ZOFFSET, 0); vgProp(isector, VGIS_RENDER, VG_ON); vgProp(isector, VGIS_METHOD, VGIS_VOLUME); /* 绑定体到 isector */ vgIsectVol(isector, vol);
20100927飞天诚信代表应邀参加国家知识产权局专利局北京中关村审查员实践基地试点活动近日由国家知识产权局专利局发起北京市知识产权局承办的国家知识产权局专利局北京中关村审查员实践活试点在京正式启动国家知识产权局专利局人事教育部副部长赵喜元国家知识产权局专利局化学发明审查部副部长张伟波北京市知识产权局副局长周砚出席了启动仪式作为国家知识产权试点单位北京市专利示范单位飞天诚信公司副总经理韩雪峰应邀参加了此次活动并代表与会余家试点企业在会上进行了精彩发言韩总代表试点企业对专利审查员直接进驻企业开展服务的新模式表示热烈欢迎认为这是国家北京市中关村知识产权政府机构的大力支持服务中关村企业发展的重要举措同时也希望试点活动的开展为企业带来更多的发展契机北京中关村实践基地的筹建标志着聚集了近家国家高新技术企业的北京中关村国家自主创新示范区企事业单位有了与国家专利审查员面对面直接交流的机会审查员直接进驻实践基地企事业单位的工作模式创造了企事业单位与审查员直接沟通的渠道将对大幅提升企事业单位专利质量降低专利申请中的沟通成本推动企事业单位专利管理工作深入开展起到重要作用
自定义的 AABB 碰撞检测算法
陶阳
摘 要: 针对 Vega 中现有碰撞检测算法存在逼真度不足的现象, 基于 Segment 类 型 的 碰 撞 检 测 体, 提出了一种自定义的 AABB 碰撞检测算法。 通过定义 12 个 Segment 类型的碰撞检测体, 构造 出一个包围运动体的 AABB 盒, 实现该运动体对场景的较为精确的碰撞检测。 在该 AABB 盒的每 条边的碰撞响应函数里面进行碰撞结果处理, 提出了一种基于运动体的碰撞响应算法, 用以提高 视景仿真的逼真度。 关键词: 视景仿真; Vega; 碰撞检测; 轴向包围盒
集成开发环境 Microsoft Visual Studio C++6.0
3.2 实验方法
整个实验以实现一个场景漫游系统为目的, 实验方法主要
步骤如下:
(1) 使用 Vega 的图形界面 Lynx 设置好参数, 导入两个对
象 town 和 tank, 并配置相关的观察者、 运动模型、 环境等。
(2) 利用 VC++6.0 开发环境编写程序代码, 实现自定义的
两个对象的发生碰撞当且仅当它们在 3 个坐标轴上的投影 区间均重叠。 对于拥有 AABB 的对象, 它与其他对象或场景的 碰 撞 检 测 可 转 换 为 该 对 象 的 12 条 边 与 另 外 一 个 对 象 或 场 景 的 碰撞检测, 只要任一条边发生了碰撞, 则该对象就与另外一个 对象或场景发生了碰撞。 所以, 复杂运动体在场景中漫游时的 碰撞检测问题可以转化为其 AABB 包围盒的边与其他对象或场 景 的 碰 撞 检 测 问 题 , 正 好 弥 补 目 前 Vega 产 品 只 支 持 Segment 图元的不足。
AABB 碰 撞 检 测 算 法 。 在 构 造 AABB 的 时 候 , 可 通 过 Creator
打 开 tank 对 象 的 flt 文 件 , 获 得 其 Box 边 界 , 设 置 准 备 构 造 的
AABB 的 各 条 边 的 值 。 在 程 序 中 实 现 每 条 边 的 相 交 Isector 类 。
2 基于运动体的 AABB 构造算法
2.1 对象的 AABB 盒
AABB 即 沿 坐 标 轴 包 围 盒 , 是 指 包 含 一 个 给 定 对 象 的 且 各边平行于坐标轴的最小六面体。 一般来说, 给定一个左下
顶 点 和 一 个 右 上 顶 点 , 即 可 构 造 一 个 AABB 包 围 盒 。 那 么 AABB 的 技 术 只 需 计 算 给 定 对 象 的 各 个 元 素 顶 点 的 坐 标 的 最 小 值 和 最 大 值 即 可 。 如 果 最 小 值 分 别 为 minx、 miny、 minz, 最 大 值 分 别 为 maxx、 maxy、 maxz, 则 构 造 该 AABB 的 左 下 顶 点 坐 标 为 ( minx,miny,minz) , 右 上 顶 点 坐 标 为 ( maxx,maxy, maxz)。
(6) 为 每 条 边 对 应 的 体 的 Isector 设 置 Render On, 则 可 以 看到运动体外构造的 AABB 包围盒。
(7) 如果 12 条边都已经构造完成, 则算法结束。 注意: 每条边对应的 Isector 目标掩码和目标对象对应的掩 码一致。 碰撞响应是检测到碰撞后的处理过程。 碰撞响应可在程序 的 主 循 环 中 进 行 , 对 于 AABB 包 围 盒 的 每 条 边 , 计 算 相 交 矢 量, 交叉计算, 获取相交结果, 根据运动体碰撞的物理意义进 行碰撞结果处理, 把处理后的结果反应到运动体的位置变化即 可。 碰撞响应的算法步骤如下: (1) 在运动体的 AABB 包围盒上, 任取一条边对应的 Isector。 (2) 放置相交矢量。 (3) 对 该 Segment 类 型 的 体 与 目 标 交 叉 计 算 , 并 保 存 结果。 (4) 如果所有的边都已经计算完成, 转 (5); 否则转 (1)。 (5) 计算 12 条边的交叉结果, 判定是否相交, 如果相交, 则根据不同的边碰撞情况, 分类处理, 得到一个新的运动体的 位置; 否则运动体的位置不变。 (6) 重置运动体的位置, 算法结束。
表 1 实验环境
参数项
参数值
硬件主要配置 CPU Intel Dual Core2.6GHz, 内存 2G DDR, 独立显卡 256M 显存
操作系统 Windows XP SP3
三维建模软件 MultiGen-Paradigm Creator3.0
视景仿真软件 MultiGen-Paradigm Vega 3.7
(4) 根 据 八 个 顶 点 关 系 , 确 定 AABB 的 12 条 边 的 每 条 边 的其中一个顶点的位置、 沿坐标轴的方向、 长度。 这一步是为 了自定义一个 Segment 类型的碰撞检测相交矢量。
(5) 根 据 每 条 边 的 情 况 , 自 定 义 一 个 Volume 体 , 类 型 Segment, 绑 定 一 个 新 的 Isector。 每 条 边 就 是 一 ቤተ መጻሕፍቲ ባይዱ 线 段 , 包 括 一 个 顶 点 、 长 度 和 方 向 。 这 是 Vega API 中 自 定 义 相 交 矢 量 类 的要求的参数。
2.3 自定义的 AABB 碰撞检测与响应
在 基 于 Vega 的 视 景 仿 真 系 统 中 , 如 果 要 实 现 对 运 动 体 的
2010. 21 71
碰撞检测, 必须设定碰撞检测目标和交叉体。 根据前面分析, 为了使得碰撞检测更加精确, 可对 Vega 中的 Volume 方法进行 改进。 因此, 提出一种自定义的运动体 AABB 构造方法。 步骤 如下:
综上所述, 为解决 Vega 中现有碰撞检测算法存在不逼真现 象的失真问题, 提出一种基于 AABB 的自定义的碰撞检测算法, 利用 Vega 中的 Segment 方法, 构造运动体的 AABB 盒, 算法简 单 , 实 用 性 高 。 通 过 对 AABB 盒 的 各 条 边 进 行 碰 撞 结 果 检 测 , 使得碰撞做出更精确的响应, 与 Vega 自身的碰撞检测机制相一 致, 达到了快速研发基于 Vega 的视景仿真系统的目的。
3 实验
3.1 实验环境
Vega 是一种用于实时仿真应 用 的 高 性 能 软 件 环 境 和 工 具 。 它 包 括 图 形 用 户 界 面 Lynx、 Vega 模 块 以 及 C 语 言 API 库 。 实 验是在 Vega3.7 版本[4]上进行的, 另外还包括三维建模工具 Creator、 软件集成开发环境 VC++等。 整个实验环境配置参数如表 1 所示。
(1) 确定运动体的体 Box 的值。 即确定该体的左下顶点和 右上顶点坐标。
(2) 在 Vega 中 设 置 好 运 动 体 的 坐 标 位 置 。 当 然 , 如 果 这 个体需要和角色关联, 可把这个位置绑定在 Player 上。
(3) 根 据 (1) 和 (2) 确 定 运 动 体 的 AABB 的 8 个 顶 点 坐标。
1 引言
碰 撞 检 测 是 视 景 仿 真 系 统 研 究 [1,2,3]中 的 关 键 技 术 之 一 。 碰 撞检测与碰撞响应算法的好坏, 直接影响视景仿真的效果。 Vega 是 一 种 用 于 实 时 仿 真 及 虚 拟 现 实 应 用 的 高 性 能 软 件 环 境 和工具[4,5]。 它主 要 包 括 两 个 部 分 : 一 个 是 被 称 为 LynX 的 图 形 用 户 界 面 的 工 具 箱 ; 另 一 个 则 是 基 于 C 语 言 的 Vega 函 数 调 用 库 。 作 为 软 件 环 境 和 工 具 , Vega 提 供 了 碰 撞 检 测 机 制 , 可 满 足实时碰撞检测的需求, 但其提供的已封装好的相交矢量类检 测方法, 却没有完全避免 “穿墙而过”、 “传土而入”、 “上 房 ” 等 现 象 的 发 生 , [6,7,8] 或 者 存 在 碰 撞 检 测 不 精 确 的 现 象 , 如 “擦墙而过” 等。
2.2 Vega 的碰撞检测
Vega 软 件 提 供 了 八 种 相 交 矢 量 方 法 , 完 成 一 些 简 单 的 碰 撞 检 测 和 相 交 测 试 , 也 就 是 Vega 基 本 模 块 中 的 Isector 好 Volume。 在 Isector 模 块 中 , 除 了 Volume 体 方 法 外 , 其 余 的 七 种 方法都属于线段类型的方法, 由不同方法设计的线段配合相 交矢量来检测碰撞情况。 碰撞检测的结果保存在一个内部缓 冲区中, 以一个数组的形式存储。 在进行碰撞响应处理时, 可 通过 Vega 的函数 vgGetIsectResult () 函 数 来 获 得 这 些 数 据 。 虽 然, Volume 方法在 Lynx 里面提供了 Box、 Sphere 等方法参数, 但 是 目 前 的 Vega 产 品 没 有 很 好 地 支 持 这 些 高 级 的 方 法 。 当 然 , 基 于 Volume 方 法 , 可 对 Vega 中 的 碰 撞 检 测 算 法 改 进 , 通 过 建 立 Segment 类 型 的 体 (Volume), 然 后 把 这 个 体 放 置 在 适当的位置上, 实现该体的交叉方法, 就可以进行更精确的碰 撞检测了。
为了提高视景仿真系统的逼真度, 提高碰撞检测的精度或 效率, 许多学者在碰撞检测领域中做出了相当多的工作, 提出 了 一 系 列 算 法[9-15]。 其 中 , 比 较 典 型 的 是 基 于 包 围 盒 的 碰 撞 检 测 算 法[8], 以 及 对 其 的 改 进 算 法 。 [10,13] 通 过 对 相 关 的 文 献 分 析 得 出: (1) 大部分包围盒算法比较复杂, 应用实践起来比较困 难, 实用性差; (2) 很多算法与 Vega 自身的碰撞检测机制不统 一, 兼容性差, 不利于快速研发基于 Vega 的视景仿真漫游系统。
72 2010. 21
return(isector); }
(3) 碰撞结果计算, 实现碰撞响应算法。 对每条边的碰撞
相关文档
最新文档