碰撞检测GJK算法论文解析二
碰撞检测GJK算法论文解析二
- The Theoretical Algorithm
- 内容详解
- 初探The Distance Subalgorithm
- 内容详解
- Appendix Ⅱ
- 涉及的概念
- 内容详解
接上文,本篇文章讲解GJK算法论文的第四、第五部分前半部分,这是整个算法最为核心的部分。第四部分阐述了算法的核心思想,而第五部分则给出了可行的算法流程。不废话,直接进入正题。
The Theoretical Algorithm
内容详解
这一节的主要内容就是介绍寻找v(K)v(K)v(K)的算法,其中KKK是凸的并且是紧的。如果KKK是多面体,那么这个算法能在有限次迭代后找到v(K)v(K)v(K)。
这个算法的主要思想如下:在KKK中生成一系列的多面体coVkco\space V_kco Vk,并且序列v(coVk)v(co\space V_k)v(co Vk)会收敛于v(K)v(K)v(K)。为了表述这个算法,需要引进以下定理:
定理1:设K⊂RmK \subset R^mK⊂Rm,KKK是闭集且是凸的,然后定义函数gK:Rm→Rg_K:R^m\to RgK:Rm→R为:
gK(x)=∣x∣2+hK(−x),x∈K(25)g_K(x) = |x|^2 + h_K(-x), x \in K \kern3em \lparen25\rparen gK(x)=∣x∣2+hK(−x),x∈K(25)那么有以下三个结论:
1)若gK(x)>0g_K(x) \gt 0gK(x)>0,那么在线段{x,sK(−x)}\lbrace x,s_K(-x) \rbrace{x,sK(−x)}间必定存在一个点zzz,使得zzz满足∣z∣<∣x∣|z| \lt |x|∣z∣<∣x∣;
2)只有当gK(x)=0g_K(x) = 0gK(x)=0时,x=v(K)x = v(K)x=v(K);
3)∣x−v(K)∣2⩽gK(x)|x - v(K)|^2 \leqslant g_K(x)∣x−v(K)∣2⩽gK(x)
为了不把思路带偏,定理1的证明这里就不再陈述(因为不了解对理解整个算法没有太大的区别,个人观点),其证明的主要思想是三角不等式,论文的后面也有证明的过程。
接下来阐述距离算法:
1)设V0={y1,y2...yv}V_0 = \lbrace y_1,y_2...y_v \rbraceV0={y1,y2...yv},其中y1,y2...yv∈Ky_1,y_2...y_v \in Ky1,y2...yv∈K,并且1⩽v⩽m+11 \leqslant v \leqslant m+11⩽v⩽m+1,这一步就是说一开始要在集合中随机选取v个点,当然这个随机是可以伴随一定的策略的。这里再次提醒,KKK必须是多面体,如果是像球这样的物体,这个算法是求不了的,这是因为球会让这个算法无限迭代下去(不过mesh的话也不会有真正意义上的球)。
2)求出vk=v(coVk)v_k = v(co \space V_k)vk=v(co Vk),就是求出$y1,y2...yvy_1,y_2...y_vy1,y2...yv这些点构成的凸包到原点的最近的点是什么,而这个点代表的向量会代入到(15)式中进行计算。这个怎么找呢,论文的下一节才给出了算法,所以这里先不提。
3)如果gK(vk)=0g_K(v_k) = 0gK(vk)=0(要注意里面的大小写,大写代表集合,小写代表标号),那么这个点就是我们要找的点,这个时候就可以退出循环。否则进入下一步
4)设Vk+1=Vk^⋃{sK(−vk)}V_{k+1} = \hat{V_k} \bigcup \lbrace s_K(-v_k)\rbraceVk+1=Vk^⋃{sK(−vk)},其中Vk^\hat{V_k}Vk^指的是当vk∈coVk^v_k \in co \space \hat{V_k}vk∈co Vk^时,Vk^\hat{V_k}Vk^中的顶点数最少,举个例子,在二维平面下一个三角形到原点最近的点有三种情况,一是原点落在三角形内部,那么原点需要用三个顶点来进行表示((12)式);二是最近的点落在三角形边上,那么这个点只需要两个顶点就可以表示;还有就是离原点最近的点就是其中一个顶点,那么这个点只用一个点就可以进行表示。然后后面的{sK(−vk)}\lbrace s_K(-v_k)\rbrace{sK(−vk)}表示选择一个尽量靠近原点(向量的长度短),并且离vkv_kvk远的点A,点A必定会更靠近原点。然后将点A和Vk^\hat{V_k}Vk^的并集输入到2)中继续执行。
结合上面对算法的阐述以及论文的Fig.3,这个算法应该是比较清晰的了,而且论文中也有计算过程的描述,所以这里就不多说明了。下面是论文中的图,这里的V0={z1,z2,z3}V_0=\lbrace z_1,z_2,z_3 \rbraceV0={z1,z2,z3}
接下来是收敛性证明,因为会把思路带偏,这里也不再做过多阐述,有兴趣的可以自己去看
初探The Distance Subalgorithm
内容详解
这一节的内容是对上一节的距离算法的一些细节进行补充,主要是步骤2),这一个小节的论述是在是太精彩了,喜欢数学以及图形的你绝对不能错过。
首先还是设定条件,设Y={y1,y2...yv}⊂RmY = \lbrace y_1,y_2...y_v \rbrace \subset R^mY={y1,y2...yv}⊂Rm,即Y=VkY = V_kY=Vk,这个VkV_kVk就是上一节提到的集合。那么从这个算法最终可以将v(coY)v(co\space Y)v(co Y)表示成如下形式:
v(coY)=∑i∈ISλiyiv(co\space Y) = \sum_{i \in I_S} \lambda^i y_i v(co Y)=i∈IS∑λiyi∑i∈ISλi=1λi>0i∈IS⊂{1,2,...,v}\sum_{i \in I_S} \lambda^i = 1 \lambda^i > 0\space i \in I_S \subset \lbrace 1, 2,..., v \rbrace i∈IS∑λi=1λi>0 i∈IS⊂{1,2,...,v}YS={yi,i∈IS}isaffinelyindependent(29)Y_S = \lbrace y_i, i \in I_S \rbrace \space is \space affinely \space independent \kern3em \lparen29\rparen YS={yi,i∈IS} is affinely independent(29)其中SSS表示集合YYY的所有非空索引集中的其中一个。可以发现,上面的式子其实就是公式(14)。这里需要注意的是YSY_SYS就是距离算法中4)的Vk^\hat{V_k}Vk^,之前提到说Vk^\hat{V_k}Vk^是包含最少顶点的集合,这样能提高迭代的效率。
当vvv的值很小的时候,即便我们对所有顶点的所有组合进行最近点的计算,效率也是很高的,要计算的次数可以通过组合的公式得到:
σ=∑k=1v[v!/(k!(v−k)!)]\sigma = \sum^v_{k = 1}[v! / (k!(v - k)!)] σ=k=1∑v[v!/(k!(v−k)!)]例如当v=4v = 4v=4时,那么σ=15\sigma = 15σ=15。回到距离算法,基于(12)式,可以知道,在三维空间中,Vk^\hat{V_k}Vk^最多拥有4个点。如果还是不太清楚为什么最多是4,我这里展开解释一下。可能会有人觉得,5个点不可以吗?我们假设可以,那么要表示凸包中的点A的时候,我们会用5个点来表示这个点A,可是在三维空间里面,我们真的需要用5个点来表示一个点吗?因为用4个点的时候我们已经能构成一个四面体了,这个四面体已经能够包含空间内的点了,再多一个是可以,但是没必要,因为这样一来我们要处理的数据就更多了,而且得到的结果说不定还更复杂,而Vk^\hat{V_k}Vk^仅仅需要最少的点(再次强调)。然后我们提到YS=Vk^Y_S = \hat{V_k}YS=Vk^,所以下文中的YiY_iYi就代表Vi^\hat{V_i}Vi^.
(30)式使用了一堆奇怪的符号,定理3也使用了一堆奇怪的符号,一开始看得我晕头转向,然后发现在附录二中有详细的说明,所以我们先跳到附录二,然后再回来看定理3
Appendix Ⅱ
涉及的概念
在附录2中将会使用到下面几个概念,需要对其有较为清晰的认识才能保证后面不会晕,有些概念不是三言两语能解释清楚的,所以原谅我直接放上连链接。
- 代数余子式(cofactor):百度百科
- 克莱姆法则(Cramer’s Rule):百度百科
- 多元函数的极值与局部极值:多元函数的极值指的是当x=x0x = x_0x=x0时,对于∀x′∈E\forall x' \in E∀x′∈E都有f(x′)⩽f(x0)f(x') \leqslant f(x_0)f(x′)⩽f(x0),那么f(x0)f(x_0)f(x0)就是函数fff在集合EEE中的极值。至于局部极值,简单来说,就是在这个点xlx_lxl附近,f(xl)f(x_l)f(xl)最大或最小,然后这个“附近”不一定是全局,它可以是半径为1的球内(三维中),也可以是半径为10的球内,只要在某个半径内满足即可。如果点f(xl)f(x_l)f(xl)是局部极值,且对xlx_lxl内每个变量的偏导数都存在(xlx_lxl是向量),那么这些偏导数都为0。我这里的描述并不严瑾,主要是要展开的话又会涉及一系列的概念。这里记住一点就是局部极值的偏导数为0(当然前提是存在,不过针对论文描述的问题,偏导数必定存在)就够了。
内容详解
附录2主要内容是要证明定理3,但现在我们抛开这个,把附录2当成是独立的篇章,那么附录2的主要内容就是确定(29)式中λi\lambda^iλi的值
首先,我们考虑如何确定v(affYS)v(aff\space Y_S)v(aff YS)的值,其中YS∈YY_S \in YYS∈Y。如果YSY_SYS中只有1个点,那么直接求距离即可,没有太多讨论的必要,所以这里假设YSY_SYS至少含有2个点,且后面提到的rrr也至少为2。v(affYS)v(aff\space Y_S)v(aff YS)的形式如下:
v(affYS)=∑i=2rλixi(a)v(aff\space Y_S) = \sum^r_{i = 2} \lambda^i x_i \kern3em \lparen a\rparen v(aff YS)=i=2∑rλixi(a)根据仿射集的定义有:
λ1=1−∑i=2rλi(b)\lambda^1 = 1 - \sum^r_{i = 2} \lambda^i \kern3em \lparen b\rparen λ1=1−i=2∑rλi(b)那么点v(affYS)v(aff\space Y_S)v(aff YS)到原点的距离可以表示成λ2,λ3...λr\lambda^2, \lambda^3...\lambda^rλ2,λ3...λr的函数:
f(λ2,λ3...λr)=∣x1+∑i=2rλi(xi−x1)∣2(c)f(\lambda^2, \lambda^3...\lambda^r) = |x_1 + \sum^r_{i = 2}\lambda^i(x_i - x_1)|^2 \kern3em \lparen c\rparen f(λ2,λ3...λr)=∣x1+i=2∑rλi(xi−x1)∣2(c)上面那个式子可以把求和的项拆开,就会得到一般的距离公式。然后关键点来了,v(affYS)v(aff\space Y_S)v(aff YS)是离原点最近的点,那代表什么?没错,就是f(λ2,λ3...λr)f(\lambda^2, \lambda^3...\lambda^r)f(λ2,λ3...λr)取最小值,之前我们提到了局部最值的概念,这里就正好可以用上。首先,我们要求f(λ2,λ3...λr)f(\lambda^2, \lambda^3...\lambda^r)f(λ2,λ3...λr)的偏导数,简单起见,这里设r = 3,那么对©式求偏导数可得:
∂f∂λ2=2λ2(x2−x1)⋅(x1+λ2(x2−x1)+λ3(x3−x1))=λ2(x2−x1)⋅(λ1x1+λ2x2+λ3x3)=0\frac{\partial f}{\partial \lambda^2} = 2\lambda^2(x_2 - x_1)·(x_1 + \lambda^2(x_2 - x_1) + \lambda^3(x_3 - x_1)) = \lambda^2(x_2 - x_1)·(\lambda^1x_1 + \lambda^2x_2 + \lambda^3x_3) = 0 ∂λ2∂f=2λ2(x2−x1)⋅(x1+λ2(x2−x1)+λ3(x3−x1))=λ2(x2−x1)⋅(λ1x1+λ2x2+λ3x3)=0∂f∂λ3=2λ3(x3−x1)⋅(x1+λ2(x2−x1)+λ3(x3−x1))=λ3(x3−x1)⋅(λ1x1+λ2x2+λ3x3)=0\frac{\partial f}{\partial \lambda^3} = 2\lambda^3(x_3 - x_1)·(x_1 + \lambda^2(x_2 - x_1) + \lambda^3(x_3 - x_1)) = \lambda^3(x_3 - x_1)·(\lambda^1x_1 + \lambda^2x_2 + \lambda^3x_3) = 0 ∂λ3∂f=2λ3(x3−x1)⋅(x1+λ2(x2−x1)+λ3(x3−x1))=λ3(x3−x1)⋅(λ1x1+λ2x2+λ3x3)=0然后结合(b)式,再将这几个式子写成矩阵相乘的形式,那么我们可以得到:
∣111(x2−x1)⋅x1(x2−x1)⋅x2(x2−x1)⋅x3(x3−x1)⋅x1(x3−x1)⋅x2(x3−x1)⋅x3∣∣λ1λ2λ3∣=∣100∣(d)\begin{vmatrix} 1 & 1 & 1 \\ (x_2 - x_1)·x_1 & (x_2 - x_1)·x_2 & (x_2 - x_1)·x_3 \\ (x_3 - x_1)·x_1 & (x_3 - x_1)·x_2 & (x_3 - x_1)·x_3 \end{vmatrix} \begin{vmatrix} \lambda^1 \\ \lambda^2 \\ \lambda^3 \end{vmatrix} = \begin{vmatrix} 1 \\ 0 \\ 0 \end{vmatrix} \kern3em \lparen d\rparen ∣∣∣∣∣∣1(x2−x1)⋅x1(x3−x1)⋅x11(x2−x1)⋅x2(x3−x1)⋅x21(x2−x1)⋅x3(x3−x1)⋅x3∣∣∣∣∣∣∣∣∣∣∣∣λ1λ2λ3∣∣∣∣∣∣=∣∣∣∣∣∣100∣∣∣∣∣∣(d)这就是论文中的(41)式(系数2约掉了)!接下来我们要做的事情就是通过这个式子求出λ1,λ2,λ3\lambda^1, \lambda^2 ,\lambda^3λ1,λ2,λ3。求解方程组有挺多方法的,这里用的是克莱姆法则(Cramer’s Rule),因为向量(1, 0, 0)很特殊,在用余子式求解行列式的时候,除了第一行向量(1, 0, 0)所在的那一列的余子式,其余余子式的行列式都为0,这样我们就知道了实际上符号Δi(YS)\Delta_i(Y_S)Δi(YS)代表的是克莱姆法则中向量(1, 0, 0)的1所在的行列的代数余子式, 而Δ(YS)\Delta(Y_S)Δ(YS)代表的是系数矩阵的行列式。拿(d)式做例子,求λ2\lambda^2λ2,那么根据克莱姆法则有:
Δ2(YS)=∣111(x2−x1)⋅x10(x2−x1)⋅x3(x3−x1)⋅x10(x3−x1)⋅x3∣=(−1)1+2∣(x2−x1)⋅x1(x2−x1)⋅x3(x3−x1)⋅x1(x3−x1)⋅x3∣\Delta_2(Y_S) = \begin{vmatrix} 1 & 1 & 1 \\ (x_2 - x_1)·x_1 & 0 & (x_2 - x_1)·x_3 \\ (x_3 - x_1)·x_1 & 0 & (x_3 - x_1)·x_3 \end{vmatrix} = (-1)^{1 + 2}\begin{vmatrix} (x_2 - x_1)·x_1 & (x_2 - x_1)·x_3 \\ (x_3 - x_1)·x_1 & (x_3 - x_1)·x_3 \end{vmatrix} Δ2(YS)=∣∣∣∣∣∣1(x2−x1)⋅x1(x3−x1)⋅x11001(x2−x1)⋅x3(x3−x1)⋅x3∣∣∣∣∣∣=(−1)1+2∣∣∣∣(x2−x1)⋅x1(x3−x1)⋅x1(x2−x1)⋅x3(x3−x1)⋅x3∣∣∣∣那么λ2=Δ2(YS)/Δ(YS)\lambda^2 = \Delta_2(Y_S) / \Delta(Y_S)λ2=Δ2(YS)/Δ(YS)。至此,我们给出了仿射集系数的解的形式。
下一篇文章我们会继续证明定理3,并且会回到第五章,继续论文里的算法,敬请期待。
碰撞检测GJK算法论文解析二相关推荐
- 碰撞检测GJK算法论文解析一
碰撞检测GJK算法论文解析一 碰撞检测 Objcet Representation And Distance 1.涉及的概念 2.内容详解 Preliminaries 1.涉及的概念 2.内容详解 碰 ...
- 碰撞检测GJK算法论文解析三
碰撞检测GJK算法论文解析三 再探Appendix Ⅱ 内容详解 再探The Distance Subalgorithm 内容详解 过程1 过程2 过程3 这里要先纠正上篇文章的一些错误,就是上篇文章 ...
- 碰撞检测——GJK算法
目录 碰撞检测--GJK算法 1.GJK算法的原理及思想 1.1 Minkowski Sum(明可夫斯基和) 1.2 Simplex 1.3 support函数 1.4 构建Simplex 2. GJ ...
- 【论文解读】Confluence:物体检测中不依赖IoU的NMS替代算法论文解析
导读 基于IoU的NMS实际上是一种贪心算法,这种方法得到的结果往往不是最优的,Confluence给出了另一种选择. 论文地址:https://arxiv.org/abs/2012.00257 摘要 ...
- 前景检测算法论文解析之 HMMB(Real-Time Adaptive Histogram Min-MaxBucket)
Real-Time Adaptive Histogram Min-MaxBucket (HMMB) Model forBackground Subtraction 简介 本文提出了一种高效的实时背景减 ...
- 计算机图形学碰撞检测,碰撞检测——GJK算法
基本概念 闵可夫斯基差(Minkowski difference) 凸体 和 两个物体相交,当且仅当其闵可夫斯基差包含原点. 单纯形(simplex) 这里相当于在闵可夫斯基差内迭代形成一个多面体,且 ...
- 感知算法论文(二)Pelee: A Real-Time Object Detection System on Mobile Devices(2018)译文
摘要 目前在计算能力和内存资源有限的移动设备上运行卷积神经网络模型的需求越来越大,这样一来就刺激了对高效模型的设计和研究. MobileNet.ShuffleNet和MobileNetV2等高效的网络 ...
- CVPR2020论文解析:实例分割算法
CVPR2020论文解析:实例分割算法 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation 论文链接:https://arxiv ...
- Adam算法_Tensorflow实现——论文解析:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
目录 Adam优化器 论文解析:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION 摘要 背景 算法介绍 偏差修正 收敛性理论证明 相关算法 实验 ADAMAX 结论 ...
最新文章
- [学习笔记]最小圆覆盖
- ubuntu10.0.4使用再生龙还原后在启动时不能正常启动
- 使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
- 工作日的努力python_python计算上班时间的问题
- 自学Android!Android高级工程师面试题-字节跳动,附答案
- chrome浏览器ios版本迎来“信用卡扫描器”代码
- Android 系统(193)----图解从URL到网页通信原理
- 【数组】Triangle
- WIN7系统开启无线路由共享上网功能
- Python3-word文档操作(六):word文档中表格的操作-单元格文字居中,字体颜色等的设置
- jxls遍历list时使用模板的批注语法
- 全裸或半裸的大肚照国际接轨 细数女星大尺度斗艳孕照
- 智能暖风机——FAQ
- 我眼中的未来计算机作文1000字,我的未来作文1000字
- 机器如何猜你所想?阿里小蜜预测平台揭秘 1
- html如何冻结字段,利用jQuery实现HTML 表格行列冻结
- mysql1.2.17,17.1 MySQL主从介绍17.2 准备工作17.3 配置主17.4 配置从17.5 测试主从同步...
- Java数据结构-树状数组
- Capsule Networks胶囊网络(二)
- HTML/CSS 变形(盒子水平垂直居中)、过渡、动画 (学习整理)
热门文章
- Intellij IDEA必备快捷键大全(超详细)
- Kisu Pari Na 2
- phoenix创建视图失败
- android 人脸识别边框_【技术分享】虹软人脸识别 - Android Camera实时人脸追踪画框适配...
- 游戏服务器是软件还是硬件,硬件raid和软件raid有什么区别
- SpringBoot实现文件上传下载功能详解(附带中文名称显示乱码问题的解决)
- STM32系统时钟超详解
- 基于Matlab/simulink的风力永磁直驱发电系统
- 3d红苹果html,有关html
- ewb文件用multisim打开_MULTISIM(EWB)电路仿真实例文件打包