[计算机图形学]动画与模拟:欧拉方法、刚体与流体(前瞻预习/复习回顾)

news2024/9/29 1:22:24

一、前言

这是本专栏的倒数第二篇文章了,为什么不是最后一篇?因为我要单独写一篇总结哈哈,不管怎么说,从今年的3.13的MVP变换开始写,写到现在,也是一个很大的工程了,我很高兴能在大二下学期的期中这个时间点完成我人生中写的第一篇专栏,它没有什么开创性,但是对我来说意义重大,多余的话这里就不说了,这篇为大家介绍GAMES101最后一节课所讲的内容,利用欧拉方法求解常微分方程刚体与流体的模拟,上篇我们趋向于动画与模拟这块的介绍,这篇我们主要讲细节。

二、单个粒子的模拟

我们规定了一个粒子任何一个时刻的速度,我们又知道这个粒子一开始的位置,那么我们如何求解某个时间之后它出现在哪里呢?这个很简单,高中的物理公式。

那么我们定义一个速度场,类似于电场和磁场,给定任意一个位置,我都知道这个位置对应的速度,这就比较困难了。

1.常微分方程

根据上面所说的,我们定义出来任意一点的速度公式如上图,而这就是一个常微分方程常微分方程中,已知量是微分值,而未知量是原始值。我们要做的就是求解原始的微分之前的值。而常微分方程(ODE)顾名思义就是只涉及一个微分的方程,与之对应的是偏微分方程(PDE)。带入到我们这里就是,我们知道速度,想求位置。

2.欧拉方法

我们说了我们想求一个粒子的位置,想求任意时刻的位置,我们需要一个起始位置,这里假如是Xt,如上图中的t写在右上角表示t时刻。我们取一个Δt,也就是步长,根据上面的公式,我们每个下一个步长的位置和速度都可以根据上一个步长的速度和加速度求得。这种所有下一步的量都由上一步估计的方法就叫做前向欧拉方法,或者叫显式欧拉方法

欧拉方法有一定的问题,如上图所示,我们的步长取多长影响了最终我们得出的运动轨迹和我们想要的运动轨迹的拟合程度的精确,显然步长取的越小越密效果越好。

其次,欧拉方法有严重的不稳定性,如上图中的螺旋速度场,我们想得到的是一个做圆周运动的轨迹,但是最终结果得到的是粒子从速度场中偏离了出去,因为步长再小也是离散的,所以无论取多小的步长,最终这个粒子一定会偏离出去。而第二幅图的速度场,如果正确模拟,我们最终的粒子应该是沿着水平方向向右非处,但是我们看到的结果是上下来回的穿梭,这同样是欧拉方法的不稳定性造成的问题。

3.解决不稳定

(1)Midpoint Method—中点法

中点法,和欧拉方法类似,只不过做了一步改进,我们之前说欧拉方法的下一个点的位置是由上一个点的位置和速度决定的。中点法则不是,如上图,我们先同样的根据初始点的位置和速度计算出下一个点的位置和速度,但是我们不利用下一个点的位置和速度,我们取这两个点的中点的速度,然后用初始点的位置和中点的速度计算出下一个点的最终位置,因为速度场的变化在两点之间可能特别快,而中点的速度某种意义上来说比初始点更具有代表性。

中点法公式

(2)Adaptive Step Size—自适应步长

自适应步长法也顾名思义,我们之前说步长的长短决定了我们拟合出的效果好不好,那也就是说步长越短,也就拟合的越好。和中点法类似,对于一个步长Δt,我们计算出初始点经过Δt的位置xt,然后计算经过Δt/2的位置,再通过Δt/2位置的速度计算出再经过Δt/2的最终位置xt/2,如果xt和xt/2的位置差的很远,就说明我们取的步长过大了,所以要缩小步长,知道最终计算的两个结果相差在我们规定的范围内停下来,这就是自适应步长法。

(3)Implicit Euler Method—隐式欧拉方法

隐式的欧拉方法和显式的欧拉方法的不同之处在于,显示欧拉方法是根据上一个位置的信息去求解下一个位置的信息,隐式欧拉方法则是根据下一个点的信息去求,如上图。而下一个点的信息通常是未知的,我们要求解的是一个非线性的常微分方程,所以求解通常需要用到牛顿迭代法,这里不详细介绍,有兴趣的朋友自行了解。我们只需要知道,隐式的欧拉方法更稳定

(4)稳定性的定义

我们一直提到稳定性,那么稳定性如何定义呢?通常人们会定义一个局部的误差,也就是每个步长产生的误差,而最终每个步长产生的步长加和得出的就是总体误差。人们用这两个误差来衡量稳定性。正常情况下,人们认为研究这两个数的大小是没有意义的,我们需要研究的是这两个数和Δt的关系,也就是阶数。通常用O(h)表示,上图给出了隐式欧拉方法的局部误差是O(h^2),总体误差是O(h)h就是Δt,阶数越高越好,因为阶数越高我们相应减少步长而减少的误差就越多。

(5)Runge-Kutta Families—龙格库塔法

龙格库塔法不是一个方法是一类方法,它们特别适合求解非线性的常微分方程,其中有一种龙格库塔的方法叫RK4用的最广泛,4就是4阶的意思,可想而知误差很小。

(6)Position-Based / Verlet Integration

Position-Based或者叫 Verlet Integration不是一种基于物理的方法,之所以被称为“非物理”的方法,是因为它们主要关注在给定时间步长下尽可能准确地模拟物体的运动,而不是严格遵循物理规律。实际应用中,这些简化和近似手段通常可以带来较好的性能和视觉效果。其核心思想是通过直接操作物体上的粒子的位置信息,从而达到约束物体运动的目的(调整位置从而满足某种限制)。当然因为不基于物理,它有时很难保证它符合能量守恒定律。

三、Rigid Body Simulation—刚体模拟

刚体的模拟非常简单,因为它不会发生弹性形变,这也就说明它内部所有的点的运动形式都是相同的,那这和单独一个粒子的模拟没什么太大的区别。只不过在刚体的模拟里,人们会更多的考虑其它的物理量,如上图,位置,朝向,速度,角速度时间的导数。和粒子的模拟相比,无非是多了几个变量,我们同样可以用之前说的欧拉方法以及一系列方法去求解。

四、Fluid Simulation—流体模拟

 接下来我们说流体模拟,来作为我们之前所说的非物理的Position-Based方法的例子。

首先我们认为,水体是由许多不可压缩的刚体小球组成的。

其次,假设水在任何一个地方都是不可压缩的,2L水不可能变成1L水,也就说任何位置密度都相同。

而第二个假设就给了我们这么一个根据位置去约束的条件,假设我们一开始平静的水面是各处密度相等的,一旦有一个位置水的密度发生了变化,那么根据我们的定义其它地方的小球也要跟着变化,从而来符合“各处密度都相等”这个条件。

1.欧拉方法和拉格朗日方法

在物理模拟中,模拟大规模的物质的两个思路:拉格朗日方法欧拉方法拉格朗日方法,俗称质点法就是我们上面提到的对于一大片水我们把它当成许多小水滴,然后我们找出每个小水滴的位置,最终整个水的位置就是正确的,或上图,我们模拟一群小鸟,把每个小鸟的位置都找出,我们就得出了整个鸟群的样子,当然这其中也会考虑它们之间的约束关系。 欧拉方法,或者叫网格法,我们把空间分成许多网格,我们考虑一个网格内随着时间如何变化,如上图,我们看一个网格,t-1的时间里网格里是蓝色的鸟,t时间是黑色鸟,t+1时间是橙色的鸟。两种方法的视角不同,拉格朗日视角是盯着物体看,欧拉视角是盯着空间看。

2.Material Point Method (MPM)—物质点法

当然,也有两种方法结合的方法,叫做物质点法,既考虑欧拉方法,又考虑拉格朗日方法。我们先假设物体的各个粒子都有各自的材质属性,比如密度等等,然后模拟它的运动过程,但是这些过程我们在格子中考虑,最终格子中记录的信息我们再写回粒子中。

3.小结

  1. 欧拉方法(Eulerian method)

欧拉方法是一种描述流体或者可变形物体运动的方法,在此方法中,观察者固定在空间中观察流经某个点的物质。这种方法关注的是每个固定点的状态变化,而不是跟随单个粒子的运动轨迹。在计算过程中,物质特性(如速度、密度等)被定义在一个固定的网格上。

  1. 拉格朗日方法(Lagrangian method)

拉格朗日方法与欧拉方法相反,它关注的是沿着单个粒子的运动轨迹的物质状态。观察者跟随物质粒子运动,聚焦于粒子随时间推移的属性变化。在拉格朗日视角下,物质特性(如位置、速度等)被定义在每个粒子上。

  1. 物质点方法(Material Point Method,MPM)

物质点方法(MPM)是一种将欧拉方法和拉格朗日方法结合起来的方法,它试图克服两者的局限性。在 MPM 中,物体被表示为一组离散的物质点,每个物质点携带了与其相关的物质特性(如密度、速度等)。物质点在一个固定的网格上进行计算,而后根据网格上的信息更新物质点的状态。

MPM 的主要步骤如下:

  1. 将物质点的物质特性(如质量、速度等)传递到固定的网格节点上。
  2. 在网格上求解物质的运动方程,例如牛顿第二定律。
  3. 根据网格节点的速度更新物质点的速度和位置。
  4. 重复以上过程直至计算结束。

总之,物质点方法利用了欧拉方法中固定网格的优势,使计算更加稳定;同时,通过拉格朗日方法对物质点的处理,能够捕捉物体的大变形和拓扑变化。

五、总结

这是本专栏的最后一篇文章,那么到这里GAMES101的所有内容基本上就都介绍完了,从光栅化到几何,到光线传播,以及相机透镜颜色空间这些,最后到动画与模拟,就都介绍完了,本篇主要简单介绍了利用欧拉方法以及其它改进的方法求解常微分方程的简单思路,以及刚体和流体的模拟,当然本篇只是简单介绍了一下,想更详细的了解还要靠大家自己,但是前面渲染的内容,介绍的已经相对详细了,尤其是MVP变换,我认为是本专栏中最详细的一篇,那么到这里就结束了,再见~

参考:

GAMES101_Lecture_22 (ucsb.edu)

Lecture 22 Animation Cont._哔哩哔哩_bilibili

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

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

相关文章

使用ffmpeg拼接两张图片

最近在工作中遇到了一个需求,就是需要将两张图片拼接在一起,作为一个封面图。如果只是临时拼接一张,我们可以只用photoshop之类的图片编辑工具,将两张图片拼接在一起。而我们的需要是需要实现自动化,由于之前使用过ffm…

KALI入门到高级【第六章】

预计更新第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 特…

Linux网络编程:基础知识

1. MAC地址和IP地址 IPV4:32位;8B 4 32bit IPV6:128位;4B 32 128bit,图中IPV6补全为:fe80:0000:0000:0000:6e3f:77c3:ceca:b5a7 MAC:48位; 4B 12 48bit (图中IPV6和MAC地址使用的16进制表示法&a…

QTDAY4

定时闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> //定时器类 #include <QTime> //时间类 #include <QTimerEvent> //定时器事件类 #include <QDateTime> //日期时间类 #include <QText…

052、牛客网算法面试必刷TOP101--二分查找/排序(230503)

文章目录 前言二分查找/排序1、BM17 二分查找-I2、BM18 二维数组中的查找3、BM19 寻找峰值4、BM20 数组中的逆序对5、BM21 旋转数组的最小数字6、BM22 比较版本号 总结 前言 本文记录自己刷&#xff0c;牛客网的面试必刷TOP101&#xff0c;地址&#xff1a;面试必刷TOP101–二…

【GAMES101】05 Rasterization(Triangles)

光栅化过程&#xff1a;将一系列变换后的三角形转换为像素的过程。 三角形在图形学中得到很多的应用。 最基础的多边形&#xff08;边数最少&#xff09;。任何多边形都可以拆成三角形。性质&#xff1a;三角形内部一定是平面的。三角形内外部定义非常清楚。定义三个顶点后&a…

libfacedetection 人脸检测库 检测速度慢的问题

目录 一、libfacedetection 性能介绍 英特尔CPU 使用AVX2指令集 使用AVX512指令集 嵌入式设备 二、加速检测速度 libfacedetetion的前向推理速度很快的原因 使用axv2加速指令 一、libfacedetection 性能介绍 在上一篇文章中&#xff0c;我发现使用摄像头检测&#xff0c;构…

C++入门——内联函数的介绍

目录 前言 内联函数 1. 概念 2.特性 前言 今天小编给大家带来的是内联函数的介绍&#xff0c;大家可能之前没有听过内联函数这个名词&#xff0c;那么今天就和小编一起认识一下这个朋友吧。 内联函数 我们每次在调用函数时都会开辟一个函数栈帧&#xff0c;那么过度的函数…

上海联影面试(部分)(未完全解析)

一面 Spring Boot为什么可以自启动&#xff0c;且变成一个web项目&#xff1f;本地连不上网&#xff0c;Maven缺一个jar包&#xff0c;怎么解决&#xff1f;linux用什么命令找到占用指定端口的进程&#xff0c;并杀掉&#xff1f;Answer by new bing: 查找被占用端口的PID&am…

单载波传输与多载波传输

一、单载波传输 1. 单载波基带传输&#xff1a;系统模型 信道h(t)的带宽为W T&#xff1a;符号周期&#xff0c;数据速率&#xff1a;R1/T&#xff0c;每秒传输R个符号&#xff0c;单位&#xff1a;Hz z(t)&#xff1a;加性噪声 g(t)带宽有限&#xff0c;时间无限&#xff0c…

AI 图像生成工具可以取代摄影师吗?让我们从原理开始聊聊

AI 的风已经吹向了每一个人&#xff0c;在这篇文章中我们一起来聊一聊 AI 图像生成的原理以及未来。 作为一个非职业的摄影爱好者&#xff0c;我通常会在 Instagram 上面搜罗各种各样的优质图片并将其放进我的收藏夹。其中&#xff0c;有一位我关注了很久的德国摄影师&#xff…

Linux常用快捷键

前言&#xff1a;由于需要&#xff0c;梳理了一下常用的快捷键&#xff0c;以便忘记时查找。 Linux系统快捷键&#xff1a;(Bash解释器) 1&#xff09;Tab键 补齐命令补齐路径显示当前目录下的所有目录 2&#xff09;清屏&#xff1a; clearCtrl L ( “L” 大小写均可 ) …

Cadence基础操作:ADE L仿真基础操作

仿真器启动 schematic视图左上角 launch 启动各种仿真器&#xff0c;ADE L界面左上角Launch 启动ADL XL 和ADE GXL。通过ADE L启动的ADEXL 会继承ADE L的各种设置&#xff0c;如变量、plot and save的点等等。 仿真器主要设置 1.仿真器选择&#xff1a;如图&#xff0c;Setup里…

Linux进程初识

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 Linux进程初识目录 前言正文冯诺依曼体系结构操作系统简介概念操作系统的管理系统调用 进程初识进程理解进程的属性和数据进程控制块查询进程信息的相关指令进程PID 父…

机器学习笔记 Segment Anything用于图像分割的通用大模型

一、简述 人工智能中的基础模型正变得越来越重要。它们被定义为在大量数据上训练的大型人工智能模型,可以适应广泛的任务。 基础模型的早期例子是大型语言模型(LLM),如GPT和BERT。随后,该行业也看到了同样的想法被应用于多模态基础模型,如DALLE、CLIP等。基础模型这个术语…

基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

摘要&#xff1a;本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码&#xff0c;包括GUI界面和数据集&#xff0c;可选择模型进行图片分类&#xff0c;支持一键训练神经网络。首先介绍了基于GoogleNet、ResNet进行图像分类的背景、意义&#xff0c;系统研…

S3C6410 中的 cascaded irqdomain 之 gpio

文章目录 VIC 中断 与 gpio 中断 的硬件拓扑图描述linux cascaded irq domainirq domain 初始化时获取 IRQ number(软件中断号) 时中断发生时如何调试linux irq domain 实例 VIC domain 与 gpio domain 的硬件拓扑语言描述VIC 与 INT_EINTx 的关系INT_EINTx 与 GPIO的关系INT_E…

python+excel的接口自动化测试框架实战教程(视频讲解+源码)

目录 设计流程图 Excel和结果预览 框架结构 Excel相关 日志封装 正则操作 核心操作 测试操作 测试报告发送邮件类 运行 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方…

PyTorch中的优化器探秘:加速模型训练的关键武器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…