我的物理引擎开发之旅

博文小编

2024-05-30

文/杨丰

去年年初, 电子工业出版社的郑编辑联系到我。问我有没有兴趣翻译一本叫作Fluid Engine Development的书。

她看到我在知乎上曾经强烈推荐过这本书,于是才联系到我,看看我有没有兴趣做这件事。而我听到这个消息,欣然接受,时隔一年,这本书终于要付梓印刷,出版上架了。中文名叫作《流体动画引擎开发:理论与实践》。

我在翻译的时候,思绪总会闪回到2018。

那时澳门大学的胡老师给我发消息,问我有没有兴趣来澳门做一段时间的研究。

彼时,我已经是博士三年级,经过了三次尝试才通过博士资格考试,正式开始研究的工作。

前两次的失败,加上过去两年在课程学习上的勉强,早已经让我萌生了退出的研究生学习的念头,但接到他的信息,我还是打算过去尝试一下。

去的时候,我随身没有带任何一本教科书和论文,因为我知道那边会是一个全新的课题,所以也打算称这个机会,重新开始。

我后来才知道,16年的时候澳门大学刚刚举办过Siggraph Asia的会议,而我也恰恰在这块土地上,了解了图形学这个方向,在沿着Milo Yip提供的书单按图索骥时,我看到了这本《流体动画引擎开发:理论与实践》,而我的研究方向也恰恰是关于流体模拟,并且在博士前两年的工作中,也关注过多介质流方面的工作。从这本书中,我找到了自己专业和图形学方面的连接点。

虽然我从很小的时候就开始学习计算机相关的知识,但是一直没有入到编程的门。

本科在数学学院最多也只接触了MATLAB的开发,所以刚来北大读博的时候,因为写代码的事情感到非常吃力,特别是到了第二年,我还在对Cpp懵懵懂懂的时候,就要去写MPI多进程并行的大作业。

到了博士三年级,我的代码基本上还是全部东西都丢在一个类里面,没有架构,缺乏测试。

而这本书当中,流体算法的部分对我来说驾轻就熟,但是程序架构却让我耳目一新。

曾经在讨论班的时候,也被质疑过代码有bug,所以算法才不生效,那时候我才知道我应该建立一套完整的单元测试流程,才能够在被质疑的时候,有足够的能力分辨到底是代码的问题还是算法的问题。

相关网址:https://github.com/doyubkim/fluid-engine-dev

经过三个月的澳门之行,当我回到北京后。

我就开始尝试基于《流体动画引擎开发》提供的程序框架,重构过去所有的代码,把零散碎片的程序整合到一个完整的框架当中去。

从此我将网格、离散场的数据、模板搜索、重构算子全部抽象出不同的类模块,并且对所有的基本模块进行了单元测试,手推了WENO重构的解析结果,写到单元测试里面。

然后把代码重构成1D到3D通用的结构。

等到了2019年,我第二次去澳门的时候,这个框架已经完成了第二次重构,把大量堆上的分配都转移到栈上,大幅提高了计算的效率。

同时,我还开始基于他本身的代码,做一些花活,考虑过OpenVDB提到原有的稠密网格,考虑将代码全部复刻到Metal上,那时候我对GPGPU一窍不通,带独显的Mac也远不是什么统一内存架构,所以我根本不知道什么CPU-GPU同步的事情,就是一顿操作猛如虎。(但也竟然可以跑起来,也得拜Metal精妙的设计所赐,哈哈)

但是,在这个过程中,我学到了非常多的东西,无论对于模拟算法,还是空间稀疏存储都有了全面的认识,如果没有这样的积累,后面在研究ORGE的时候,不会那么顺利,也就无法掌握抓帧调试的技术。

用流行的话说,《流体动画引擎开发》为我提供了一套“元框架”,并且让我学习了“重构”的含义。

这本书的框架绝对不是最优的,知乎上也有大神说他的代码一言难尽,这一点我非常认同。

我曾经尝试将他的代码迁移到Rust,以此学习Rust的使用。写的时候我意识到,他的设计导致虚继承的层数非常多,在Solver这一层的设计上有很大的改进空间,但是他的设计在我看来是最容易阅读和学习的。也留给了读者很大的思考和改进空间,通过尝试改进,读者可以学到更多的内容。毕竟他已经做了大量的单元测试和Benchmark,所以无论是哪种重构,都可以和之前进行对比。

相关网址:https://github.com/doyubkim/fluid-engine-dev/issues/308

所以,当编辑联系我的时候,我感到无比幸运,竟然有机会将这本启发我程序开发的书翻译成中文,让更多人有机会通过这本书入门到流体动画引擎、物理引擎的开发中。

虽然原作者去NVIDIA之后,专注在NeuralVDB的研发上,这个框架已经很多年没有大的更新了,但这依旧是我见过的,最有可读性、最健壮的开源代码,非常适合初学者进行学习。

在此,我非常推荐对于流体引擎,或者任何基于场的求解器开发有兴趣的同学都可以来阅读这本书。

阅读中可以沿着我上面提到的一些花活继续思考,也可以思考如何将这些代码用CUDA重写,或者完善代码当中的刚体碰撞的部分,将流固耦合做的更加完善。

相信我,通过这些思考,你一定能收获更多。

流体动画是一个复杂的问题。求解流体动力学被认为是数学中最具挑战性的问题之一,与此同时,其复杂性之美吸引了许多开发人员和研究人员,涵盖视觉效果在故事片中的运用、互动游戏、AR/VR应用程序,甚至媒体艺术等各个领域。

然而,流体动力学的复杂性常常让新手不知所措;即使是具有出色的编程技能和数学知识的人也常常会迷失在方程式中,不知道从哪里入手。

本书的目标是为新手构建流体模拟引擎提供一个全新的起点。

本书的主要读者是视觉效果工程师、游戏开发人员、媒体艺术家,以及缺乏数据分析或计算流体动力学深厚知识和经验的学生或计算机领域爱好者。本书涵盖最经典和最常用的技术和代码,以帮助感兴趣的读者学习流体动力学并编写自己的引擎。读者一旦理解了流体模拟的本质,就能够扩展代码库以处理更加复杂和独特的问题。

大多数核心算法都将从开发者角度进行解释,将提供实用和具体的代码示例,而不是抽象的理论。基本的数学不会被省略,如有必要,将解释更深入的细节。

读完本书,读者将能够了解引擎的各个部分是如何工作的,并能编写出一个可以工作的流体模拟引擎。

然而,本书并不是代码段的集合,也不是API文档。

这种对开发人员友好的呈现旨在以尽可能轻松的方式传达流体引擎算法的本质,而不仅仅是提供一个黑盒。

本书共4章。

  • 第1章介绍基础知识,解释编写模拟代码的主要步骤,例如向量和矩阵运算及物理动画的概念。

  • 第2章和第3章分别介绍模拟流体的两大范式——粒子和网格。这两种方法具有鲜明的特点和明显的优缺点,我们将在这两章结合各种模型和求解器讨论这些主题。

  • 第4章介绍结合这两种方法的思路及不同的混合方法。

希望本书能激发读者的灵感,使其构建自己的流体引擎或将随附的代码库用于各类应用程序。

即使在本书出版后,源码也会随着更多特性的添加和改进不断发展。

希望作者的代码库成为读者互动和分享想法的地方。

↑限时五折优惠↑

读者评论

相关博文

  • 社区使用反馈专区

    陈晓猛 2016-10-04

    尊敬的博文视点用户您好: 欢迎您访问本站,您在本站点访问过程中遇到任何问题,均可以在本页留言,我们会根据您的意见和建议,对网站进行不断的优化和改进,给您带来更好的访问体验! 同时,您被采纳的意见和建议,管理员也会赠送您相应的积分...

    陈晓猛 2016-10-04
    5700 747 3 7
  • 迎战“双12”!《Unity3D实战核心技术详解》独家预售开启!

    陈晓猛 2016-12-05

    时隔一周,让大家时刻挂念的《Unity3D实战核心技术详解》终于开放预售啦! 这本书不仅满足了很多年轻人的学习欲望,并且与实际开发相结合,能够解决工作中真实遇到的问题。预售期间优惠多多,实在不容错过! Unity 3D实战核心技术详解 ...

    陈晓猛 2016-12-05
    3427 36 0 1
  • czk 2017-07-29
    6277 28 0 1