流来!实时流体模拟的N种方法
本文汇总了常见的可以用到实时应用中的流体模拟技术。
本文中提到的所有算法都会附带单文件,直接可以运行的python代码。读者可以挑选喜欢的demo, 喂给agent放到游戏引擎中复现。
1. N-S方程速成在介绍N-S方程之前,我们先介绍一下物理模拟的两大流派——拉格朗日视角和欧拉视角。(从Games201偷来的图)
简单来说,拉格朗日视角将流体看成大量携带质量的粒子,其模拟各个粒子在世界空间中的移动来实现整个流体的模拟。一个比较直观的现实例子是海洋球池,大量海洋球的运动从远处看上去像是水在流动。
拉格朗日视角下的N-S方程如公式(1.1)所示。
其中 为速度, 为密度, 为外力(的加速度), 为粘性系数, 为物质导数,你暂时可以将其想成就是普通的全微分(我们将在和欧拉视角对比的时候详细介绍它!)。
而欧拉视角则是会在流体内部插入固定的木桩(固定网格),每个木桩记录流体的变化并推算未来流体的走势。(又是从Games201偷来的图)
在欧拉视角下的N-S方程如公式(1.2)所示
公式(1.1)左边奇怪的物质导数消失了!取而代之的是更加奇怪的 这项。而这两项是建立起拉格朗日视角 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
Unreal Advanced Locomotion Animation (一) 基础
本文为 虚幻4(UE4) 动画技术 深入浅出 高级运动系统 的笔记
项目设置这个教程基于Advanced Locomotion System的动画资源(在Advanced Locomotion System插件的CharacterAssets/MannequinSkeleton/AnimationExamples路径中) 上展开的。因此,需要订阅该插件后从中提取资源。
由于订阅插件到提取资源过程教程中介绍的不详细,这里给出详细步骤。
在Epic Games Launcher的商城中订阅Advanced Locomotion System(下简称ALS)插件。
由于ALS插件无法直接加入到现有项目中因此,需要创建一个临时项目。
在临时项目中,找到CharacterAssets/MannequinSkeleton/AnimationExample文件夹,右键文件夹选择Migrate。将文件夹迁移到目标项目的Content文件夹中。
骨骼-姿势-动画在UE中带有骨骼动画的资源都由一个Skeleton Mesh资源表示。其中一个Skeleton Mesh与一个Skeleton一一对应,且 ...
如何做一个软体奶龙--初探Chaos物理引擎
在本文的小案例中,将展示如何拓展UE的渲染系统以及物理系统,来实现一个由弹簧质点系统驱动的软体模拟demo。
首先对vibe coder一句话总结思路:对模型凸包加四面体化创建控制点以及四面体笼,每个顶点根据其在四面体笼内的重心坐标烘焙出索引以及权重。在UE中导入该数据,在模型VS中获取索引权重数据并混合得到各个顶点的世界空间位置。随后在运行时,给每个四面体的每个控制点创建一个刚体,四面体每条边由弹簧链接。其中弹簧在Chaos引擎底层对应约束FRigidSpringConstraint ,这东西没有Game Thread的接口,因此需要手动拓展Chaos引擎的接口开放给GT调用。
本文的案例基于UE 5.4.2版本的代码。
1. 模型渲染这部分不是重点,就快速过一下思路。
首先是模型来源的问题,笔者之前尝试用tripo免费额度直出一个乃龙模型,在网站上看着效果还可以,不过基本没法直接拿到blender中编辑,同时导入UE中似乎也会有些奇奇怪怪的问题,所以最后还是在网上找了个免费模型…
tripo还有个智能拓扑模式,生成的模型我只能说,目前指望一次性直出还不现实…
接着是创建一个 ...
从深度到世界空间坐标
z
最近在unity做和后处理相关的需求,需要从屏幕空间深度
UE4中的地形以及植被系统(1)--地形的编辑
临近入职,最近mt安排我看一点有关UE4中植被编辑的源码。而植被系统与地形系统又密切相关,因此本人决定一并阅读地形系统以源代码,并将阅读过程中整理出来的信息写成文档(可以显得我这几天干活比较卖力)。本文作为系列的第一篇文章,记录了地形编辑系统基本操作、源码结构;并以Sculpture功能为例,展示了编辑过程中的数据流通过程。
1. 地编系统的基本操作在UE4中地形的编辑需要在landscape模式下进行。由于我UE的布局和网上大多数教程不一样,并没有Place Actor界面上的Landscape按钮,因此我一般是通过如图所示的modes按钮开启Landscape模式。
在第一次进入Landscape模式,没有创建任何Landscape的情况下,往往需要创建一个新的landscape。Landscape的创建界面如下图所示。
可以看到,一个地形对象的mesh被分为3个层级component-section-quad。其中,一个component可以包含多个section而一个section又可以包含多个quad,而一个quad为两个三角形拼成的方形,为构成地形对象的最小单位。
通 ...
再探PBR--微表面模型
还记得面试被问到是否了解PBR的时候,我每次都能吟唱而出:“PBR基于能量守恒理论,能保证入射能量和出射能量一致,其中,漫反射由Lambert项模拟,而金属材质由Cook-Torrance项模拟,Cook-Torrance基于微表面模型包括法线分布,几何遮蔽以及菲涅尔反射项。”每当被问到这些问题,我心里都在祈祷面试官不会继续追问下去,因为我并不清楚这几个神奇的式子究竟是从哪里冒出来的,和它声称的“微表面”模型的联系在哪里(实际上工业界可能确实不关心这些问题)。
最近刷了一下UCSD CSE 272,并阅读了Eric[1],在这方面又有些新的感悟,随撰文记录。
1.再探微表面模型微表面模型假设了物体表面由无数微小表面构成的,这些微小表面的表现累积成了宏观上物体表面的表现。目前,网上很多流行的PBR教程都是这么描述的。然而,目前鲜有资料说明用更严谨的数学语言描述这些微表面的行为,微表面模型中法线分布D, 菲涅尔F以及几何遮蔽项G这些描述宏观统计表现的项是怎么”统计”出来的。而这就是本节的重点。
考虑一个微表面分布,如图1所示。
对于一个法线为 的物体表面(黑色线段),其由无数微表面构成( ...
再探体渲染(二)--Ray Marching 从理论到实现
前文中探讨了基于物理的体渲染的理论以及相关结论的推导。在本文中,我将展示如何按照前文推导的公式,在unity中实现一套基于ray marching的”丐版“体积雾(只支持方形,全局只能有一个volume)。最后,我们会简单讨论该方案的一些优化方案。
理论回顾关于体渲染的理论以及公式在上一篇文章中有详细介绍。
这里只列出几个重要的公式。
体渲染公式如下所示:
L_i(p,\omega) = L_o(p'',-\omega) Tr(p''\to p) + \int_{p\to p'} Tr(p'\to p)\sigma_t(p',\omega)L_s(p',\omega) dt (1)其中
Tr(p\to p') =\frac{L_o(p',\omega)}{L_o(p,\omega)}= e^{\int_0^d - \sigma_t(p+\omega t,\omega) dt} (2)
L_s(p,\omega) = \frac{\sigma_\alpha(p,\omega)}{\sigma_t (p,\omega)} L_e(p,\omega) + \frac{\sigma_{s} ...
再探体渲染(一)-- 理论
由于之前实习接触到体积雾相关的东西,想顺带把这一系列相关渲染技术复现一下,于是从这篇文章开始看起RayMarching实时体积云渲染入门(上) - 知乎 [1] 。实现到一半发现自己很多理论不扎实的地方(代码和公式没法联系到一起),遂重新研读了PBRT的Volume Rendering [2]部分。不得不说,这东西不隔一阵子梳理一下真的巨容易忘,也应了闫在课上说的”常看常新“了。
微分形式以下部分均来自[2]
对于一小段体积微元的出射强度 主要和一下几项有关:
吸收当入射光线穿过体微元时,其能量损失为
dL_o(p, \omega) = -\sigma_\alpha (p, \omega) L_i(p,-\omega) dt (1.1)其中, 为当前点吸收能量的多少。该项模拟了光线射入粒子内部造成的能量损失。
自发光由于光线穿过的微元内粒子的化学,辐射等现象导致的能量出射。其微分形式和吸收类似
dL_o(p,\omega) = \sigma_\alpha(p,\omega) L_e(p,\omega)dt (1.2)其中 为粒子的自发光强度。由于该现象在游戏中不常见,因此很少有和 ...
校招面试题汇总
收集校招面试中遇到的基础问题。
本人校招已结束,故停更。后面随缘更新。
八股C++C++构造函数能否为虚函数 不能,有两点原因
使用角度:虚函数主要用于在信息不全的情况下,使得重载的函数得到相应的调用。构造函数的目的是初始化实例,使用虚函数在这里没有实际意义。而且,构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用,因此构造函数没有必要是虚函数。
实现角度:在C++中,对象的虚表指针(VPTR)是在构造函数调用后才建立的。因此,在调用构造函数时还不能确定对象的真实类型(因为子类会调用父类的构造函数),并且构造函数的作用是提供初始化,在对象生命周期中仅运行一次,不是对象的动态行为,也没有必要成为虚函数。
*析构函数与构造函数的区别:虚函数的作用在于通过父类的指针或者引用来调用它的时候可以变成调用子类的那个成员函数。而析构函数可以是虚函数,因为我们往往通过基类的指针来销毁对象。如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数,可能会导致资源泄露*
C++的构造函数中能否使用throw不能,原因:
构造函数异常的问题:如果构造函 ...








