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

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(distSq);//顺时针float x1 = temp.x * cosA - temp.y * sinA;float y1 = temp.x * sinA + temp.y * cosA;//逆时针float x2 = temp.x * cosA - temp.y * (-sinA);float y2 = temp.x * (-sinA) + temp.y * cosA;return make_pair(Vec2(x1, y1), Vec2(x2, y2));
}

判定是否碰撞

判定速度是否在碰撞域内,即判定速度点与在左切线的右边,并且在右切线的左边

// 点 c 在a到b向量的左边, 即∠abc 小于180°
bool GeometryMath::isInLeft(Vec2 a, Vec2 b, Vec2 c) {float e = getVectorCross(a, b, c);return getVectorCross(a, b, c) < 0;
}
// 点 c 在a到b向量的右边, 即∠abc 大于180°
bool GeometryMath::isInRight(Vec2 a, Vec2 b, Vec2 c) {return getVectorCross(a, b, c) > 0;
}
// 点 c 与a到b向量共线, 即∠abc 等于180°
bool GeometryMath::isCollineation(Vec2 a, Vec2 b, Vec2 c) {return getVectorCross(a, b, c) < 0.00001;
}
float GeometryMath::getVectorCross(Vec2 a, Vec2 b, Vec2 c) {Vec2 vectorBA = a - b;Vec2 vectorBC = c - b;return vectorBA.cross(vectorBC);
}
bool isCollision;
bool isFirstLeft = GeometryMath::isInLeft(Vec2::ZERO, verts.second, verts.first);if (isFirstLeft) {isCollision = GeometryMath::isInLeft(Vec2::ZERO, verts.second, relativeVelocity) && GeometryMath::isInRight(Vec2::ZERO, verts.first, relativeVelocity);}else {isCollision = GeometryMath::isInLeft(Vec2::ZERO, verts.first, relativeVelocity) && GeometryMath::isInRight(Vec2::ZERO, verts.second, relativeVelocity);}

求速度转移向量u

选择更近的一条切线边,求出速度到切线上的垂直点,作为新的速度,两者相减即为u
向量a与单位向量n的点积,即为a在n方向的投影长度

Vec2 vert = relativeVelocity.getDistance(verts.first) < relativeVelocity.getDistance(verts.second) ? verts.first : verts.second;
//求切线的单位向量
Vec2 v2 = vert.getNormalized();
//速度在切线上的投影长度
float n = relativeVelocity.dot(v2);
Vec2 v = v2 * n;
Vec2 u = v - relativeVelocity;

VO的效果:
请添加图片描述
RVO的效果:
请添加图片描述
实际写代码中VO其实还有个问题,就是在当前帧求出了新的速度的话,如果在这一帧立刻更新位置的话,在非常近的情况下。是极有可能产生碰撞的。
因为VO抖动的问题就是,在第一帧,双方可能碰撞于是计算了新的速度相互错开(此时的新速度在下一帧计算VO是不会碰撞的)如果当前帧根据新速度更新位置不会产生碰撞。而到了第二帧,双方根据此时的速度计算不会碰撞,于是新速度调整回了最佳速度(调整回的新速度在下一帧计算VO是会产生碰撞的,所以之后会产生抖动),而此时如果根据当前帧调整的最佳速度立刻更新位置,在非常近的情况下,是会直接产生碰撞的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01.数据结构篇-链表

1.找出两个链表的交点 160. Intersection of Two Linked Lists (Easy) Leetcode / 力扣 例如以下示例中 A 和 B 两个链表相交于 c1&#xff1a; A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 但是不会出现以下相交的情况&#xff0c;因为每个节点只有一个…

pycharm—配置python解释器【2023最新版】

目录 1.前言1.打开设置2. 点击到project >> Python interpreter3. 选择环境4. 确定之后等待加载就行了 1.前言 嗨嗨&#xff0c;大家好啊&#xff0c;我是小曼~ 刚入门python的伙伴们&#xff0c;一开始也会很多的问题。今天来给大家分享一下python新手必须学会的技巧 &…

关闭Windows 10自动更新方法

1. 关闭WindowsUpdate服务 如果你想要完全关闭Win10的自动更新功能&#xff0c;你可以在Windows服务中的WindowsUpdate选项里进行禁用设置。按照以下步骤&#xff0c;你就能完成操作。 按下“WinR”键&#xff0c;来启动“运行”&#xff0c;在运行中输入“services.msc”&…

监督学习:从数据中挖掘模式的引导

目录 前言1 定义2 举例说明3 回归问题4 分类问题结论 前言 监督学习是机器学习领域中的一种重要方法&#xff0c;通过给模型提供带有标签的训练数据&#xff0c;使其能够学习输入与输出之间的关系。这种学习方式在各个领域都有广泛的应用&#xff0c;从垃圾邮件过滤到医学诊断…

MATLAB 1:基础知识

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。 MATLAB中还有两种用于高级交叉编程的数据类型&#xff0c;分别是用户自定义的面向对象的用户类类型和Java类类型。 1.1.1数值类…

Java+SpringBoot+Vue:高校科研管理的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml【第79篇—读写XML文件】

深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml XML&#xff08;eXtensible Markup Language&#xff09;是一种常见的数据交换格式&#xff0c;广泛应用于各种应用程序和领域。在数据处理中&#xff0c;Pandas是一个强大的工具&#xff0c;它提供了read_xml和to…

算法沉淀——字符串(leetcode真题剖析)

算法沉淀——字符串 01.最长公共前缀02.最长回文子串03.二进制求和04.字符串相乘 01.最长公共前缀 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-prefix/ 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串…

UnityShader玉石效果

效果&#xff1a; 代码&#xff1a; Shader "MyShader/Jade" {Properties{_DiffuseColor("漫反射颜色",color)(1,1,1,1)_ThicknessMap("厚度图",2d)"white"{}_AddColor("叠加颜色",color)(1,1,1,1)_CubeMap("环境贴图…

steam搬砖项目,“一个月赚8K+”真的假的?

在游戏中&#xff0c;搬砖党是永远都不能忽视的存在&#xff0c;随着游戏产业的不断发展&#xff0c;普通人也可以在steam搬砖项目中找到自己的生财之道。由于是低技术的重复工作&#xff0c;和现实的搬砖类似&#xff0c;所以才叫steam搬砖项目。 steam搬砖项目其实就和pdd无…

C++ 动态规划 线性DP 最短编辑距离

给定两个字符串 A 和 B &#xff0c;现在要将 A 经过若干操作变为 B &#xff0c;可进行的操作有&#xff1a; 删除–将字符串 A 中的某个字符删除。 插入–在字符串 A 的某个位置插入某个字符。 替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出&#xff0c;将…

论文浅尝 | 在图上思考:基于知识图谱的深度且负责的大语言模型推理

笔记整理&#xff1a;孙硕硕&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://arxiv.org/abs/2307.07697 1. 动机 本文的动机是大型语言模型在各种任务中取得了较大的进步&#xff0c;但它们往往难以完成复杂的推理&#xff0c;并且在知识…