【游戏物理】欧拉、龙格、韦尔莱

简单介绍在游戏中模拟物理运动的三个常见方法。

欧拉方法

显式欧拉方法

在数学和计算机科学中,欧拉方法,命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解。它是一种解决数值常微分方程的最基本的一类显型方法(Explicit method)。

欧拉方法通过记录物体位置和速度,然后在每帧循环期间把速度累加到位置上,从而模拟物体的物理运动。

初中物理内容了,根据此刻速度和加速度,可计算出下一刻的速度和位移差。

\[ v_{n+1} = v_n + a_ndt \]
\[ p_{n+1} = p_n + v_ndt \]

改进的欧拉方法——半隐式欧拉

上述对运动的计算并不够准确——加速度的变化是持续的,而这里通过微分时间将加速度这一持续变化的量看作该微分时间短内的常量,除非微分时间段足够短,但这样又会导致效率太低。

这里使用一种改进的欧拉法,即使用上一刻的加速度计算下一刻的速度,并使用下一刻的速度计算出下一刻的位移。

\[ v_{n+1} = v_n + {\color{orange}a_n}dt \]
\[ p_{n+1} = p_n + {\color{orange}v_{n+1}}dt \]

下图解释为何改进后的公式更准确。使用此刻的速度计算下一刻的位移差显然与实际线路偏移较大,而使用下一刻的速度计算下一刻的位移差则更加准确(至少模拟路线有可能与正确路线相交而不是越偏越远)。

改进后的欧拉方法开销和原方法一样大,但却准确得多。

韦尔莱积分法

韦尔莱算法是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中。韦尔莱算法的优点在于:数值稳定性比简单的欧拉方法高很多,并保持了物理系统中的时间可逆性与相空间体积元体积守恒的性质。

韦尔莱积分法记录了分子当前的位置和之前的位置,要获得分子的速度,只要用当前位置减去之前的位置就行了。

\[ p_{n+1} = p_n + (p_n - p_{n-1}) + a_ndt^2 \]

\(p_n - p_{n-1}\) 即隐含的速度。这一方法的好处便是不需要单独储存速度,分子的速度和加速度都是隐式处理,稳定且高效。

龙格-库塔法

在各种Runge-Kutta法当中有一个方法十分常用,以至于经常被称为“RK4”或者就是“Runge-Kutta法”。该方法主要是在已知方程导数和初值信息,利用计算机仿真时应用,省去求解微分方程的复杂过程。

找到一个不错的视频,解释一下公式的推导过程,具体原理我不知道也不想知道。4th-Order Runge Kutta Method for ODEs

总结

以上三种方法的复杂度分别为:

方法 复杂度
欧拉法 \(O(n)\)
韦尔莱积分法 \(O(n^2)\)
龙格-库塔法 \(O(n^4)\)

复杂度越高的方法越准确,但是开销也大。对于大部分游戏和大部分玩家,半隐式欧拉已经足够了。

原文地址:https://www.cnblogs.com/liez/p/12009980.html

时间: 2024-11-07 06:48:15

【游戏物理】欧拉、龙格、韦尔莱的相关文章

Nyoj42 一笔画问题 (欧拉道路)

http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring> #define CLR(arr) memset(arr,0,sizeof(arr)) #define P 1001 int G[P],fa[P]; int find(int x){return x==fa[x]?x:x=find(fa[x]);} int main() {     int n,a,b

寻找德日进,凯文凯利和库兹韦尔的老师?

生命从哪里来,要到那里去,生命存在的意义是什么,这些几乎是人类能够探究的最深层次问题,基督教给出的答案是毁灭和审判:佛学给出的答案是无常,科学的达尔文进化论给出了生命的起点和进化的过程,对于未来,达尔文认为生物进化过程是一棵不断地生长.分支的大树,现存的所有生物都位于这棵树的某个小分支的顶端,很难说哪一种更高级,进化没有预定的方向,不存在一个以人类为顶端的主干,人类只是进化树上一个普普通通的分支. 有一位神奇但被暂时遗忘在历史角落的巴黎天主教大学"科学家",他的理论被教会所不容,他试图

刚体质量分布与牛顿-欧拉方程

惯性矩.惯性积.转动惯量.惯性张量 惯性矩是一个几何量,通常被用作描述截面抵抗弯曲的性质.惯性矩的国际单位为(m4).即面积二次矩,也称面积惯性矩,而这个概念与质量惯性矩(即转动惯量)是不同概念. 面积元素dA与其至z轴或y轴距离平方的乘积y2dA或z2dA,分别称为该面积元素对于z轴或y轴的惯性矩或截面二次轴矩.惯性矩的数值恒大于零.对Z轴的惯性矩:$I_z=\int_A y^2 dA $,对Y轴的惯性矩:$I_y=\int_A z^2 dA $ 惯性积:质量惯性积是刚体动力学中一个重要的质量

欧拉函数 / 蒙哥马利快速幂 / 容斥

一:知识点 欧拉函数参考1 浅谈欧拉函数参考2 欧拉函数的定义: 在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质(即gcd为1)的正整数(包括1)的个数,记作φ(n).     欧拉函数的延伸: 小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2  (n>1). 欧拉函数φ(x)模板: ll Euler(int n)//即求φ(x) { ll ret=n; for(int i=2;i<=sqrt(n);i++) if(n%i==0) { ret=ret/i*(

刷完欧拉计划中难度系数为5%的所有63道题,我学会了Rust中的哪些知识点?

我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以又开始了Rust的快速入门学习. 欧拉计划 看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n)(感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数

通过欧拉计划学Rust编程(第54题)

由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. 刷完欧拉计划中的63道基础题,能学会Rust编程吗? "欧拉计划"的网址: https://projecteuler.net 英文如果不过关,可以到中文翻译的网站: http://pe-cn.github.io/ 这个网站提供了几百道由易到难的数学问题,你可以用任何办法去解决它,当然主要还得靠编程,编程语言不限,论坛里已经有Java.C#.Python.Lisp.Haskell等各种解法,当然

欧拉函数

void Euler_Sieve_Method(int * euler, int n) { euler[1] = 1; for (int i = 2; i < n; i++) { euler[i] = i; } for (int i = 2; i < n; i++) { if (euler[i] == i) { for (int j = i; j < n; j += i) { euler[j] = euler[j] / i * (i - 1); } } } } void Euler_Si

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i