AI - 碰撞避免算法分析(VO/RVO)

本文介绍了VO和RVO碰撞避免算法的原理,涉及计算碰撞速度域、判定速度是否在碰撞域、求速度转移向量以及VO存在的抖动问题。着重讲解了数学判断在代码中的应用和解决方法。

VO/RVO

VO和RVO的原理本身理解起来比较简单的,就是根据两个圆形的相对半径,相对速度,相对位置,求出碰撞区域,然后将速度移出碰撞区域。VO是双方都是当作对方速度不变的情况下,各自都将速度完整的移出了会碰撞的速度域,因此会抖动,RVO则是双方都默认对方速度也会移一半,因此自身也只移一半。
VO的原理
RVO的原理与VO类似,VO通过求出一个速度向量u,让物体的速度加上向量u,来移出会碰撞的速度域,RVO只移一半就行,即物体的速度加上向量u/2

数学相关的判断

代码实现主要是解一些数学题

求碰撞速度域

比如,即是求点到一个圆的两个切线。
在这里插入图片描述

//求point 到 以circleCenter为圆心半径radius的圆的切线
pair<Vec2, Vec2> GeometryMath::calculateTangetLines(Vec2 point, Vec2 circleCenter, float radius) {
   
   
	//点到圆心的长度,上图红线
	float distSq = circleCenter.getDistanceSq(point);
	//len是点到切点的长度
	float len = sqrt(distSq - radius * radius);
	//上图盖住部分红线的绿线
	Vec2 temp = circleCenter - point;
	temp.normalize();
	temp *= len;
	//左右各旋转夹角,即为切线点
	float cosA = len / sqrt(distSq);
	float sinA = radius / sqrt
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值