3D有向包围盒与球体碰撞的算法
之前发的小游戏滚蛋躲方块中,用它来判断球体与立方体是否发生了碰撞.
http://www.cnblogs.com/WhyEngine/p/3350012.html
现在发布下该算法:
有向包围盒OBB,是有旋转变化的包围盒,由三种数据组成:
obbCenter表示包围盒的中心位置
obbAxes[3]表示包围盒XYZ三个坐标轴方向上的朝向,应该是正交的,否则意思着立方体有扭曲变形.并且应该是单位向量.
halfExtents表示包围盒三个方向上的长度.
该算法是多年前,已经不记得从什么地方找的了,自己又做了点修改.该代码其实可以更加简化一些,因为原代码中是可以计算球与包围盒的碰撞深度与碰撞的法线方向的.而这里只需要返回TRUE或FALSE即可.
算法的原理比较容易理解:判断球心到包围盒三个坐标轴的投影距离是否小于该轴的长度加上球的半径.如果三个轴都符合,则表示有碰撞.
该算法的基础是判断空间中一点是否在包围盒内部.
bool ObbSphereCollisionDetect(const Vector3& obbCenter,
const Vector3 obbAxes[],
const Vector3& halfExtents,
const Vector3& sphereCenter,
float sphereRadius)
{
Vector3 kDiff = sphereCenter - obbCenter; float fSide[] = { 1.0f, 1.0f, 1.0f };
float fS[] = { 0.0f, 0.0f, 0.0f };
float fD = 0.0f; if (D3DXVec3Dot(&kDiff, &obbAxes[]) < 0.0f)
{
fS[] = D3DXVec3Dot(&( sphereCenter - ( obbCenter - ( obbAxes[] * halfExtents.x ) ) ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
}
else
{
fS[] = D3DXVec3Dot(&( ( obbCenter + ( obbAxes[] * halfExtents.x ) ) - sphereCenter ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
fSide[] = -1.0f;
} if (D3DXVec3Dot(&kDiff, &obbAxes[]) < 0.0f)
{
fS[] = D3DXVec3Dot(&( sphereCenter - ( obbCenter - ( obbAxes[] * halfExtents.y ) ) ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
}
else
{
fS[] = D3DXVec3Dot(&( ( obbCenter + ( obbAxes[] * halfExtents.y ) ) - sphereCenter ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
fSide[] = -1.0f;
} if (D3DXVec3Dot(&kDiff, &obbAxes[]) < 0.0f)
{
fS[] = D3DXVec3Dot(&( sphereCenter - ( obbCenter - ( obbAxes[] * halfExtents.z ) ) ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
}
else
{
fS[] = D3DXVec3Dot(&( ( obbCenter + ( obbAxes[] * halfExtents.z ) ) - sphereCenter ), &obbAxes[]); if (fS[] <= -sphereRadius)
return false; else if (fS[] < 0.0f)
fD += fS[] * fS[]; fS[] += sphereRadius;
fSide[] = -1.0f;
} return (fD <= ( sphereRadius * sphereRadius ));
}
3D有向包围盒与球体碰撞的算法的更多相关文章
- 碰撞回避算法(一) Velocity Obstacle
碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...
- 3D空间中射线与轴向包围盒AABB的交叉检测算法【转】
引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是 ...
- 3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】
http://blog.csdn.net/i_dovelemon/article/details/38342739 引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法. 但是,我们应该知道, ...
- 游戏碰撞OBB算法(java代码)
业务需求 游戏2D型号有圆形和矩形,推断说白了就是碰撞检测 : 1.圆形跟圆形是否有相交 2.圆形跟矩形是否相交 3.矩形和矩形是否相交 ...
- 【Unity 3D】学习笔记三十七:物理引擎——碰撞与休眠
碰撞与休眠 上一篇笔记说过,当给予游戏对象刚体这个组件以后,那么这个组件将存在碰撞的可能性.一旦刚体開始运动,那么系统方法便会监视刚体的碰撞状态.一般刚体的碰撞分为三种:进入碰撞,碰撞中,和碰撞结束. ...
- 数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇
<数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇>一文让读者了解了 HT的 2D 拓扑图组件使用,本文将对 HT 的 3D 功能做个综合性的介绍,以便初学者可快速上手使用 HT ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- 利用Flare3D和Stage3D创建3D
Flare3D 是一款功能强大的引擎,它使得 Flash 中的 3D 内容管理变得更为简便. 它的设计宗旨是提供一个完美的开发工作流程,以便你能够获得事半功倍的效果. 本教程侧重讨论在 Flash 中 ...
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
一. 工作区域详解 1. Scence视图 (场景设计面板) scence视图简介 : 展示创建的游戏对象, 可以对所有的游戏对象进行 移动, 操作 和 放置; -- 示例 : 创建一个球体, 控制摄 ...
随机推荐
- 学习 HMM
简介 HMM 中的变量可以分为两组. 第一组是状态变量 \(\{y_i,y_2,\cdots, y_n\}\), 其中 \(y_i \in \mathcal{Y}\) 表示第 \(i\) 时刻的系统状 ...
- Counter Strike HDU 2443 逆序对数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2443 这个题目尝试了很多种方法都过不去,上网查了一下网友们的的思路,竟然和逆序对数有关系!! 题目大意: ...
- (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__
作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...
- iOS 9应用开发教程之显示编辑文本标签文本框
iOS 9应用开发教程之显示编辑文本标签文本框 ios9显示.编辑文本 在iOS,经常会看到一些文本的显示.文字就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些设备要表达的信息.本节将 ...
- kolla部署all-in-one环境(N版)
简单介绍: Kolla 是 OpenStack 大帐篷模式下的官方子项目之一,其主要目标是通过利用 Docker 容器以及 Ansible 自动化部署工具,来为 OpenStack 云平台提 供一个简 ...
- 【BZOJ 2318】 2318: Spoj4060 game with probability Problem(概率DP)
2318: Spoj4060 game with probability Problem Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 371 Sol ...
- android viewHolder static 静态
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 不是静态内部类 会 持有 外部类的 引用. 就像经常自定义的 适配器 类 作为内部类 ...
- LOJ P1155 双栈排序 二分图染色 图论
https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...
- 函数栈溢出引起的段错误segmentation fault
遇到了一个奇怪的问题: 有一个回调函数中发生了段错误,但经检查也没有什么明显的错误,然后用排除法一点一点屏蔽,最后定位在一个函数里出错,但这个函数没什么明显错误.最后把入口参数改为引用传递就不报错误. ...
- Windows Server 2008 R2的web服务器nginx和Apache的比较
因为很喜欢nginx,所以也想尝试在Windows下使用nginx,前面安装配置都挺顺利,把域名解析尽量后,通过域名代理访问jboss,却异常的慢,起码有3秒的时间才显示页面,而这个页面是jboss的 ...