如需转载本文,请声明作者及出处。

在现实世界中,如:自行车,摩托车,陀螺这一类物体,在无外力驾驶的情况下会因为重力而倒地。但在游戏的物理世界中,常常需要,既有重力的计算以表现真实的物理效果,又要需要在物理世界中维持此类物体的平衡不会因为重力而倒地平衡地运作。

如果根据物体的重力,角速度,加速度等庞杂的计算模型去实时计算出适用的力,来施加在物体上。以达到一套算法可以适用于不同的物体,这样的缺点是计算过于复杂不利于游戏的运行效率。特别是当这些物体行驶起来后,在形驶的过程中,由于,转弯而驶车身倾斜的情况下,又需要考虑离心力,角速度等情况下,则需要更加繁杂的计算。

为了简化这一做法,参考公业上的pid控制器,在physx上尝试了一把两轮载具,确实可行。

https://en.wikipedia.org/wiki/PID_controller

平衡自行车-理论篇

pid控制器的核心内容为提供一种,根据物理体的roll角,进行积分和微分计算的计算方法。该计算方法能够计算出一个足以维持物理体平衡的力来施加在物理体上。不管物理体的质量是否相同,也不管物理体是否在运行(行驶)中,是否转弯,有无产生离心力等情,该计算能根据不同帧物理体的roll角误差积分去计算出大小合适的力,以维持物理体的平衡。

1. pid控制中的p项:

这一项中kp是一个常数系数,roll(t)为每一帧中载具的roll角,必须有一个足以把物体拉起来的力施加在物理体上。而且,当物理体恢复平衡的过程中,这个力也需要遂渐变小,所以这个力随着roll角的变化慢慢变小。

2. pid控制中的i项(积分项):

这一 项中,ki同样为一个常数系数,用这个常数系数,去乘上roll角的积分。时间0-t为,物理体从上次达平衡位置后到当前帧的roll角的持续积分 因为,物理体侧翻时,特别是在运动行驶的过程中侧翻时,由于地形,速度,加速度不一样,和离心力不一样,产生倒地的动量也不样。每一帧情况都不一样,这个是没有办法调的。 所以这里,使用一个常量,持继对roll角做积分累加,若物体持续侧翻,roll角积分越来越大,从而产生的力也将越来越大, 若力足够大了,能够把物体拉起来了,随着物体的恢复,roll角变小,这一积分项的累加幅度也越来越小,力的增涨幅度也越来越小。做到弹性的平衡约束。

这一项,离散化之后,可以简化为:

3.pid控制中的d项(微分项):

这一项中,kd同样为一个常数系统,用这个常数系数去乘上一个roll角的微分,这样做的含义是:当前面两项的力足以把物体,从左倾拉回到平衡位置之后,由于惯性,物体又会右倾。如此,物体将会在前面两项的力的作用下,左右摇罢抖动,难以平衡。

为了解决这个问题,这里需要对roll角做微分,也就是当前帧的roll角与上一帧的roll角的误差值。因为物理体在前面两项力的作用下,在回到平衡位置的过程中,roll角会越来越小,所以这个误差值一个负数。

=kd * delta_roll = kd * (cur_roll - last_roll)

籍此产生一个阻力。这个阻力随roll角的变化速度而变化,在这个阻力的作用下,使用载具可以恢复到平衡位置之后,停止。而不是继续往另一边继续倾斜。

因为考虑了roll角误差,所以物体在恢复到平衡位置时,角速度越大阻力越大,反之越小。达到弹性通用的效果。这也正是pid控制器的主要思想。

最终公式可以简化为:

中的kp, ki, kd 三个常数系数,要靠调, 为了使用调出的参数能够适应所有的物体,可以把这三个常数系数做如下的变形: new_kp = body.mass*kp,  new_ki = body.mass*ki, new_kd = body.mass*kd 因为不同的物理引擎使用的质量系数也不一样,所以,这三个常量系数根据物理体的质量来调,调出一个可以接受的参数之后,更可通用于游戏所用的物理引擎中的所有物理体

而游戏的策划同学,也可以自己想要的效果去调p,i,d这三个系数,以达到不同的物理体有不同的平衡效果。

如:p项调大,k项调小,可实现一个能快速恢复平衡的物理体

p项调小,k项调小,可实现一个能慢慢恢平衡的物理体        诸如此类

physx: pid balance controll相关推荐

  1. HDU 5616 Jam's balance(01背包)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...

  2. matlab 中pid tuning,PID Tuning Algorithm

    PID Tuning Algorithm Typical PID tuning objectives include: Closed-loop stability - The closed-loop ...

  3. 平衡小车PID,就该这么调!!!

    上一篇文章:看完这篇文章,还不会做平衡小车,你来打我. 描述了平衡小车的制作过程,也开源了一部分设计资料. 在上篇文章留言中,有朋友说: 安排,必须安排! 1.PID 关于PID的概念,网上相关的帖子 ...

  4. 亲密接触Redis-第三天(Redis的Load Balance)

    前言 上两天讲述了Redis的基本搭建和基于HA的集群布署方式以及相关的策略和注意点.今天开始讲述Redis的Cluster功能,而这块目前来说网上资料不是太全,就算有1,2篇也只是单讲服务端的搭建也 ...

  5. PID控制器(比例-积分-微分控制器)

    PID控制器(比例-积分-微分控制器)- I 形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置, ...

  6. PID控制器(比例-积分-微分控制器)- I

    原文链接:https://www.cnblogs.com/shangdawei/p/4825259.html 形象解释PID算法 小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变 ...

  7. pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool

    用 repmgr实现 pg的master/slave 搭建高可用和自动切换过程略 (详见htthttps://blog.csdn.net/zhaowenzhong/article/details/80 ...

  8. 直立平衡车PID控制策略以及数据平滑算法

    在某些场合下,如果我们把一个突变的数据直接加到一个已经稳定的系统中,那么这个系统可能会很难再次达到稳定,这个时候就需要对突变的数据进行平滑处理,逐渐的加大.可能这样说不太容易理解,举个例子,最近在做一 ...

  9. 十一.四轮车驱动开发之四:理解直流电机PID控制器

    这是"四轮车驱动控制"系列,分多个小节来介绍: 1. 八.四轮车驱动开发之一:正/逆向运动学分析 2. 九.四轮车驱动开发之二: 配置PWM驱动直流电机 3. 十.四轮车驱动开发之 ...

  10. numa balance实现浅析

    NUMA balance的背景 在NUMA(None Uniform Memory Access)之前是UMA(Uniform Memory Access), UMA 架构下,CPU 和内存之间的通信 ...

最新文章

  1. 胜过iPhone XS?Google Pixel的“夜视功能”是怎样炼成的
  2. PADS Router VX.2.3 设置光标的类型
  3. 【Linux - mysql】 unknown variable ‘sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZER
  4. ASP.NET内置对象的总结
  5. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
  6. 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)
  7. c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案
  8. 华为怎么用手机看时间到读秒_华为手机灭屏也可以看时间?其实设置方法很简单,不会有些可惜了...
  9. matlab读取图片亮度,Matlab中使用imagesc函数显示的亮度图像怎么和原图像的大小不一样?...
  10. 小括号教学设计导入_如何在教学中凸显出学生的主体地位呢?原来只需要做到这几点即可...
  11. 读取swagger配置文件里的内容
  12. 矩阵分析与应用(一)
  13. 华为服务器找不到阵列卡_DELL 服务器R230 加载阵列卡驱动安装Server 2012R2操作系统...
  14. python教你生成动态二维码
  15. EXCEL实现按照奇偶行填充
  16. 计算机一级荷塘月色操作题,《荷塘月色》课后习题及答案
  17. 智能分析网关微信端告警消息推送的开发流程
  18. 夺宝奇兵 (优先队列 + 贪心 + 暴力枚举)
  19. Android 方向感应器实现指南针
  20. 智源AI日报(2022-09-02):我是如何从头开始写一篇顶级论文的

热门文章

  1. 从小白到大咖——十分钟学会JavaScript操作浏览器内置对象
  2. Scala关键字lazy的理解和使用
  3. elasticsearch 使用词干提取器处理英语语言
  4. 每周读书#12 - 秘密
  5. Ant Design - Authorized
  6. Gym101194F-Mr. Panda and Fantastic Beasts
  7. SHELL 内置变量
  8. java web 实训报告_javaweb实训报告总结.doc
  9. gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!
  10. Todd Lammle's CCNA IOS Commands Survival Guide