固定转向和行进速度下的车辆轨迹计算方法

news2024/11/23 21:19:06

游戏车辆固定转向轨迹计算

在这里插入图片描述

概述

车辆游戏是我们经常接触到的一类游戏,这里游戏在只用键盘操作时,往往非常不方便。这是因为这一类游戏大部分都是按下按键时转向,释放按键时方向就会自动转正。这种控制方式在实现方面比较容易。但是缺点也很明显,就是无法像现实中开车一样,我固定一个转向角度来做圆周(圆弧)运动。对于在弯道时,键盘的操作体验非常糟糕。
所以,就想到,采用转向角度来控制车辆转弯,挡位来控制速度(包括前进和后退)。这样的话,当按下左键时,车辆将一直按照一个拐弯角度来运行,在按下其他键之前,车辆将一直进行圆周(圆弧)运动。这中操作方式和现实比较接近,就像我们开车转弯后,必须回正方向盘一样。但是这种的程序实现起来稍微复杂一些,经过研究,特此公布车辆轨迹计算方法。

效果

这是效果展示:

2023-04-27 10-17-43

计算

几何概念

这里仅考虑2D环境下,正如我另外一篇文章所述,三角函数的天然局限性并不能很好的满足在整个圆周下的相互计算。简言之就是在0到360度范围内,存在一个三角函数值对应2个角度的问题。故我们需要自己解决该问题,不能简单的利用三角函数反算。解决途径两种如下:

  1. 自己编写全角函数;
  2. 利用复数计算;
    这两种方式的关键就是三角函数值不再用一个数字表示,而是采用两个数值表示。

位置计算

已知一个车辆的当前角度、转弯角度,和速度值,从理论来讲可以计算出它在任意时刻的准确位置和方向。
固定思维如下:

  1. 确定下一个位置刷新时间
  2. 利用速度和时间求导弧长
  3. 利用刷新时间求导刷新后转向角度
  4. 利用弧长和转向角度、起始点位置、当前角度求导圆形、圆形角,进而确定下一个刷新位置的坐标和旋转角度
    上述步骤虽说可以求导,但是步骤还是非常麻烦的。同时涉及计算绘图坐标系和笛卡尔坐标系的不同,非常容易计算出错或者混乱。
    除了这个因素外,位置刷新的时间往往非常短,要计算弧长需要更高精度的浮点运算才能满足。这可能也是大部分赛车游戏直接采用按下转向、释放回正的最直接原因。
    这种简单的处理方式也有好处,那就是当车辆转弯的需要的角度后,释放按键,车辆就会保持这个角度走直线。所以虽然简单处理,但是对游戏的趣味性影响较小。

解决思路

思路一,提高程序计算能力,利用上面1到4步骤分别计算获得下一坐标点。
思路二,简化掉中间计算步骤,直接利用输入、输出关系自制函数。
这里就介绍以下研究了很久之后的解决知道,效果见上面。
【重点】
车辆的屏幕上的正确像素位移速度我们计算起来较为困难,但是我们知道不论是逻辑速度,还是像素位移速度,都和位移对应的圆心角成反比。即速度越大,转弯半径越大,对应的圆心角越小。
车辆的起始角度加上对应的圆形角的正弦值与y方向的偏移量成正比,余弦值与x方向的偏移量。
速度与弦长成正比。

//! [4]方向

    setRotation(tankRotation);
//! [4]
//! [5]
//    计算车轮转交下偏移量
    tankRotation += tankTurnRadians;
    tankBarrelDirection += tankTurnRadians;
    //TODO  让上面两个变量在[0..260)之间
    if (tankRotation < 0) tankRotation += 360;
    if (tankRotation >= 360) tankRotation -= 360;
    if (tankBarrelDirection < 0) tankBarrelDirection += 360;
    if (tankBarrelDirection >= 360) tankBarrelDirection -= 360;
    qDebug()<<"tankRotation:"<<tankRotation;
//! [5]


//! [7]移动
    QPointF newPos;
    if (tankSpeed > 0.0){
        newPos = this->pos() + Circlemetric::DegreesToPoint(tankRotation - 90) * tankSpeed;
        setPos(newPos);
    }else if (tankSpeed < 0.0){
        newPos = this->pos() + Circlemetric::DegreesToPoint(tankRotation - 90) * tankSpeed;
        setPos(newPos);
    }

[4]中已经设置了item的旋转,所以车辆的转向直接累加车辆转角即可。
[7]中的Circlemetric::DegreesToPoint是自己编写的全角函数,是用一个点(x,y)来一一对应0到360度的角度。
可以看出只通过简单的计算就可以得到车辆的新位置和新转角。
那么这种计算出来的转交或者方向大小不满足自己需要怎么办?很简单,您只要添加相应的系数即可。
因为本来在游戏中,如果你要100%的模拟是非常困难的。即便你计算的再正确,也未必能得到预期的结果。
那我们为什么不通过主要关系,建立简单的运算,通过调整固定参数,来达到自己想要的效果呢?
事实证明,这种简算不但简化了程序,而且通过系数的调整,所得到的效果并不亚于复杂的计算!

进阶

车辆的速度并不是线性关系,更多地是接近与对数关系。举例说明:
1档——10km/h
2档——20km/h
3档——30km/h
4档——40km/h
5档——50km/h
上述对应关系是和实际不同地。这里我采用了指数函数,需要更详细速度效果地可以直接采用真实车辆地挡位和速度对应关系。

尾记

欢迎大家转发、打赏。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现Canvas图像的拖拽、点击等操作

上一篇Canvas的博文写完后&#xff0c;有位朋友希望能对Canvas绘制出来的图像进行点击、拖拽等操作&#xff0c;因为Canvas绘制出的图像能很好的美化。好像是想做炉石什么的游戏&#xff0c;我也没玩过。 Canvas在我的理解中就好像在一张画布上绘制图像&#xff0c;它只能看到…

MySQL用的在溜,不知道业务如何设计也白搭!!!

MySQL业务设计 作者: 博学谷狂野架构师GitHub&#xff1a;GitHub地址 &#xff08;有我精心准备的130本电子书PDF&#xff09; 只分享干货、不吹水&#xff0c;让我们一起加油&#xff01;&#x1f604; 逻辑设计 范式设计 范式概述 第一范式&#xff1a;当关系模式R的所有属…

浙江省CIO峰会|数据安全+数字化转型,美创特色实践获“年度数字化赋能服务商”

近日&#xff0c;浙江省CIO年度峰会暨数实融合创新发展大会在杭州成功举办。美创科技受邀参加本次峰会&#xff0c;与全省数字化领袖人才共话数字化发展。 对话数字化转型 美创分享能力实践 在本次峰会以“数字化转型的昨天 今天 明天”为主题的论坛对话环节&#xff0c;美创科…

Win11启用docker报错

这里写自定义目录标题 An unexpected error was encountered while executing a WSLcommand. An unexpected error was encountered while executing a WSLcommand. An unexpected error was encountered while executing a WSLcommand. provisioning docker WSL distros: se…

M2M场景之客户端凭证模式|OIDC OAuth2.0 认证协议最佳实践系列 【4】

在前两篇文章中&#xff0c;我们介绍了 OIDC 授权码以及授权码增强的 PKCE 模式&#xff0c;本次我们将重点围绕 &#xff08;Client Credentials&#xff09; 模式进行讲解 &#xff0c;Client Credentials 模式是 OIDC 授权模式之一&#xff0c;它是一种用于客户端&#xff0…

微信小程序开发一个多少钱

小程序开发是当前比较流行的一项技术服务&#xff0c;能够为企业和个人带来巨大的商业价值和社会价值&#xff0c;但是小程序开发费用也是潜在的成本之一。在选择小程序开发服务时&#xff0c;了解开发费用如何计算、影响价格的因素以及如何降低成本等方面的知识&#xff0c;可…

055:cesium两种方法加载天地影像图

第055个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中用两种方法加载天地影像图。一种是利用WebMapTileServiceImageryProvider,另一种是利用UrlTemplateImageryProvider. 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方…

bug记录:c++ mysql Connector:Lost connection to MySQL server during query

1.背景 使用mysql connector1.1.4版本&#xff0c;代码中有 mysql 连接池&#xff0c;每次执行 sql 时从连接池取出一个连接&#xff0c;先用isClosed()判断为false继续使用&#xff0c;否则创建新连接。     现在升级 mysql connector为1.1.13版本&#xff0c;业务代码未修…

Linux进程概念——其二

目录 环境变量 基本概念 常见环境变量 查看环境变量方法 测试PATH&#xff3b;重点&#xff3d; 测试HOME 和环境变量相关的命令 环境变量的组织方式 通过代码获取环境变量 通过系统调用获取或设置环境变量 环境变量通常是具有全局属性的&#xff3b;重点&#xff3d…

学会笔记本电脑录屏快捷键,轻松实现录屏!

案例&#xff1a;笔记本电脑录屏有快捷键吗&#xff1f; 【我每次打开笔记本电脑录屏都要耗费比较长的时间&#xff0c;这样会影响到我录屏的效率。在这里想问一下&#xff0c;有没有快速打开电脑录屏的方法&#xff1f;】 在日常的工作、学习、娱乐中&#xff0c;我们经常需…

算法训练第一周题解汇总

A - Sort the Subarray 大意&#xff1a;在s1找一个最大的 [l&#xff0c;r] 子区间&#xff0c;使其经过从小到大的排序后 能够变成 s2 题解&#xff1a;先确定最小的区间&#xff0c;然后慢慢扩大。 最小区间的确定&#xff1a;s1和s2第一个不相等的数开始&#xff0c;到最后…

浅谈测试用例设计 | 京东云技术团队

作者&#xff1a;京东物流 王莹莹 一、测试用例为什么存在 1.1 定义 测试用例(Test Case)是指对特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。测试用例内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等&#xff0c;…

pytorch 计算网络模型的计算量FLOPs和参数量parameter之殊途同归

计算网络模型的计算量FLOPs和参数量parameter之殊途同归 参数量方法一&#xff1a;pytorch自带方法&#xff0c;计算模型参数总量参数量方法二&#xff1a; summary的使用&#xff1a;来自于torchinfo第三方库参数量方法三&#xff1a; summary的使用&#xff1a;来自于torchsu…

controlnet1.1预处理器功能详解

ControlNet 1.1 与 ControlNet 1.0 具有完全相同的体系结构,ControlNet 1.1 包括所有以前的模型&#xff0c;具有改进的稳健性和结果质量,但增加并细化了多个模型。 今天太忙了&#xff0c;有时间就把每个模型的测试样稿发出来 2023.4.27 分类预处理器备注模型黑白倒转invert边…

数据库物理存储结构

目录 一、数据库文件和文件组 1、数据库文件 &#xff08;1&#xff09; 主数据库文件&#xff08;Primary Database File&#xff09; &#xff08;2&#xff09; 次数据库文件&#xff08;Secondary Database File&#xff09; &#xff08;3&#xff09; 事务日志文件 …

[Linux]文档搜索和归档备份

​⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Linux基础操作。本文主要是分享一些Linux系统常用操作&#xff0c;内容主要来源是学校作业&#xff0c;分享出来的…

配置zabbix自定义监控项

1.需要安装zabbix-agent服务&#xff0c;使用的zabbix版本为5.0版本 参考&#xff1a;zabbix监控linux主机_Apex Predator的博客-CSDN博客 2.创建存放脚本目录并编辑监控服务的脚本(此处监控一下服务是否存活) mkdir /opt/zabbix_jb vi /opt/zabbix_jb/service_status.sh …

【容器化应用程序设计和开发】2.2 Dockerfile 的编写和最佳实践

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;2.1 容器化基础知识和Docker容器 容器化应用程序设计和开发 2.2 Dockerfile 的编写和最佳实践2.2.1 Dockerfile 包含哪些指令2.2.2 Dockerfile 注意事项 在上篇章节中&#xff0c;我们介绍了…

什么是索引?MySQL索引的底层数据结构

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构(B树)&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结构就是索引…

SAP 生产订单修改记录查询

无论在项目实施过程中还是在运维的项目中,经常会遇到生产订单被修改,导致需求发生变更,这个时候用户经常就会需要要求查询生产订单的修改记录。通过SAP的标准程序是没有办法查询到生产订单修改记录,这个时候就从开发的角度去做增强的方式去实现。 1、肯定是在生产订单保存…