【GAMES101】Lecture 22 物理模拟与仿真

2024-02-13 13:28

本文主要是介绍【GAMES101】Lecture 22 物理模拟与仿真,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

单粒子模拟

显式欧拉方法

改进

中点法/修正的欧拉方法

自适应步长

隐式欧拉方法

非物理改变位置(Position-Based / Verlet Integration)

刚体模拟

流体模拟


单粒子模拟

先来研究粒子的运动,假设有一个速度矢量场,对于确定的位置和时间可以确定粒子的速度

就会有一个计算粒子随时间的位置的一阶常微分方程Ordinary Differential Equation (ODE),一阶表示只有一阶的导数,常表示没有偏导

显式欧拉方法

显式的欧拉方法或者说是前向的欧拉方法就是用上一时刻t的位置加上上一时刻的速度乘以其间的时间间隔Δt来计算当前的位置,同样的方法计算出当前的速度

这个欧拉方法的误差和时间间隔Δt有关,这个间隔越小误差越小,间隔越大误差就越大,并且这个误差会因为积累而变得越来越大

减小Δt可以减小显式欧拉方法的误差,但是不能改变它的不稳定性,归根结底是因为这个步长无论取的多小始终是无法赶上速度场的变化,并且一旦出现了偏差就会继续累计

改进

中点法/修正的欧拉方法

我先算Δt/2时刻的位置,然后取这个中点位置的速度来计算下一时刻的位置

也就是取这个步长时间内的平均速度来计算下一时刻的位置

自适应步长

哎这个就很简单了,就是我先用Δt算一次结果,再用Δt/2算一次结果,如果两次结果差别不大,那我就停下来,这个结果就算出来了,否则的话我就以这个Δt/2的结果继续比较计算Δt/4的结果,这样继续算下去

隐式欧拉方法

我们之前显式的欧拉方法是用上一时刻的速度和加速度来计算当前时刻,那么用下一时刻的速度和加速度来计算当前时刻的就叫作隐式的欧拉方法或者说是后向的欧拉方法

我们把这个每个步长产生的误差叫做局部误差,总体累积的误差叫做全局误差,我们不关心数据的大小,关心这个误差的阶数,像这个隐式的欧拉方法它的局部误差的阶就是二次的,全局误差的阶是一次的,也就是说,当步长减少一半的时候,全局误差也会减少一半,也就是阶数越高误差下降的越快

有一类方法,叫做龙格库塔(Runge-Kutta Families),非常适合用来解这个常微分方程,并且它有一个误差的控制是四阶的方法

非物理改变位置(Position-Based / Verlet Integration)

这个实现很简单,什么呢?就是我直接去改变这个位置来满足某种约束,比如弹簧,当弹簧拉伸到某种程度立刻调整弹簧两个端点回到初始位置

刚体模拟

所谓刚体就是说它不会发生形变,也就是这个刚体内部的所有粒子的运动都是一样,那么就可以把它当成一颗粒子对待,但是会考虑更多的属性,像位置、旋转的角度、速度和角速度,以及它们对时间的导数

流体模拟

这里是Position-Based的一个简单应用,比如模拟水,我假设水是由很多刚体小球组成的并且这个水不可压缩,那也就是说水的密度应该是到处一样的,也就是水的某个地方里的刚体小球是一样的,一旦密度发生变化,就通过改变小球的位置使某处的小球数量恢复,也就是需要知道某处密度相对于小球位置的梯度通过梯度下降法来实现

这里有两种方法或者说是两种视角来模拟这种大量的物质

一个是质点法,也叫拉格朗日方法或者拉格朗日视角,就是对于每个个体进行模拟

还有一个是网格法,也叫欧拉方法或者是欧拉视角,也就是把空间分成很多网格,对于每个网格去研究它里面的东西随时间会发生什么变化

这两个方法也可以结合使用,叫做物质点方法或者材质点方法,Material Point Method (MPM),怎么做呢?我先考虑每个粒子的属性,然后在网格里面考虑粒子之间的整体作用并记录在网格里面,再对于网格里面的粒子去更新它们的状态

完结撒花,用了这个寒假学了games101课程并一直坚持把这个笔记做完,我一开始是先学这个OpenGL,发现确实很多概念不是很懂,然后来学games101,然后就非常的通透,目前games101作业还在做,估计这个寒假可以完成,再做几个小项目,希望能冲上游戏开发的岗位,唉大三了,希望能够顺利找到理想的暑期实习

这篇关于【GAMES101】Lecture 22 物理模拟与仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705638

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d