【游戏引擎之路】登神长阶(十九):3D物理引擎——岁不寒,无以知松柏;事不难,无以知君子
游戏引擎开发记录:
2024年 5月20日-6月4日:攻克2D物理引擎。
2024年 6月4日-6月13日:攻克《3D数学基础》。
2024年 6月13日-6月20日:攻克《3D图形教程》。
2024年 6月21日-6月22日:攻克《Raycasting游戏教程》。
2024年 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。
2024年 7月2日-7月6日:攻克《雅达利2600汇编游戏开发》。
2024年 7月7日-7月11日:攻克《x86/x64汇编语言》。
2024年 7月11日-7月22日:学习《3D游戏编程大师技巧》(阶段性)。
2024年 7月14日-7月18日:学习《游戏引擎架构》(完成)。
2024年 7月23日-7月30日:攻克Python语言学习。
2024年 7月31日-8月5日:攻克《3D游戏编程大师技巧》。
2024年 9月10日-9月20日:攻克游戏动画绑定
2024年 10月27日-10月31日:攻克《C++大师教程》
2024年 10月21日-11月02日:攻克《DirectX11教程》
2024年 11月02日-11月06日:攻克《CMake教程》
2024年 11月06日-11月10日:攻克《Vulkan教程》
2024年 11月11日-11月13日:攻克《OpenGL教程》
2024年 11月14日-11月29日:攻克《DirectX12龙书》
2024年 11月29日-2025年1月16日:《心火引擎》基础渲染部分,UI,基础游戏框架
2025年 1月16日-2月12日:载入骨骼部分。能够使蒙皮骨骼,动画载入。但有诸多问题。
2025年 2月19日-3月8日:制作了完整的小哪吒模型。自已的引擎,必须要自已建模适配。
2025年 3月10日-3月23日:制作骨骼动画,面对各种问题,各种崩溃,无法解决。
2025年 3月24日-3月27日:攻克《Lua教程》。把LUA加入引擎解决c++编译时间问题。
2025年 3月28日-4月11日:进行Maya的学习。掌握了Maya软件。
2025年 4月14日-4月19日:宁可碎此身,终不起此座!终于完美解决动画问题。
2025年 4月19日-5月30日:制作Humaniod动画。(史上最难)
2025年 5月31日-6月4日:三天制作一Galgame引擎《GalPlayer》,剩下2天进行完善。
2025年 6月4日-7月4日:3D物理引擎。又一个挑战。
(一)引子
在6月份我拥有300小时的净工作时间,注意这是净工作时间,而不是工作时间。平时吃饭午睡这些都不会计算在内的。而且这些净工作时间都是重劳动。算是创造了记录,我在这一个月的结尾还写了一篇文章,说我如何“战胜”抑郁症。结果装逼装了没3秒,7月份牙痛的后遗症爆发,马上就变成抑郁症颓废状态了。
写这篇日志的时候是7月16日,算是对以前的没有写的日志进行一个补充。重新开始“长征”,这次没有牙痛,希望会好一些——因为我突然发现,我之前很多的头痛,其实是被牙痛“带”起来的痛。现在我最后一个坏牙齿也做了治疗,以后头痛的情况应该会少一些。
(二)为什么要制作物理引擎
其实自己制作游戏引擎,有两个选择,自己制作和使用现有的引擎。现在3D物理引擎不管是收费的还是免费的,都非常成熟。比如Bullet什么的,而且根据网上的情报,也是相当好用的。我的游戏引擎之后的发展计算,也应该会集成更加专业点的引擎。
但是在这个阶段,我在仔细思考之后,还是决定自己来做一个自己的游戏引擎。
所谓“岁不寒,无以知松柏;事不难,无以知君子。”所谓“不登高山,不知天之高也;不临深溪,不知地之厚也。”做为现代游戏引擎的物理部分,自己不去上手,不去面临各种各样的问题,丢失掉这个经历实在太可惜了。
在这里我也不会像某些大师一样忽悠别人,说自己做物理引擎就一定会更好。以前我学画的时候,别人就跟我说要练手绘(是指拿铅笔画,我也练了很久),后来发现现在的人很少说这个了。因为现在很多画的好的画师,都是从手写板直接画起来的。
我只是“相信”这段经历会给我更多的成长,让我变得更强。我愿意这样相信。
(三)游戏引擎的开发过程
如果用两个字来形容,那就是“折磨”。Humanoid是我遇到的最难的挑战,物理引擎虽然没有那么变态,但也不遑多让。
Humanoid的难点在于你需要找到那个唯一的解。没有那个唯一的解,你什么都没有。
物理引擎就正好相反,怎么搞都行。所以现在的物理引擎,每个物理引擎都有自己独特的解决方案。
但是,物理引擎的问题就在于,它不知道什么地方,为什么就会出错。
我以前学过2D物理引擎,我本来以为3D物理引擎原理也是一样的,但是我还是低估了3D物理引擎的难度,因为多了一个维度,所以造成的异常就更多。
我以前以为2D物理引擎和3D物理引擎的不同只在于要套用公式的不同,其实不然,3D引擎的难度真的高了一个维度。
我当时学教程的时候,编制出来的2D引擎稳定性还是相当不错的。但我的3D引擎直到现在,稳定性还是非常差。
物理引擎的“问题”就在于,他有时候明明看得挺好的,可是过一段时间,遇到什么特殊的情况,马上就“不好”了。
而为了解决这些问题,就把我搞得焦头烂额。这方面多亏了AI,你可以迅速地查到,当面临这些问题的时候,一个工业级的引擎怎么样解决这些问题。
我在使用Unity的物理引擎的时候,经常性的有些东西就飞到老远去,当时我就觉得物理引擎好扯蛋啊。等到我自己来开发引擎的时候,我才知道,没有最扯蛋,只有更扯蛋。
我现在的物理引擎就是这样一个“到处漏风”的引擎。但是,最终的效果还是可以接受,我现在也暂时不打算引用其它的物理引擎来使我的引擎臃肿。因为我要做的游戏并不是以物理为主打,现在的引擎已经够用了。
(四)物理骨骼
这东西应该也算到物理引擎里面。但是在Unity里面,这是用DynamicBone或者是MagicCloth插件来实现的。我是模仿DynamicBone制作自己的物理骨骼。
这东西比想象中要容易太多了,3D物理引擎有各种各样的问题,而Verlet的集成相对非常稳定。只不过效果看起来没有那么“飘逸”,但是,也可以接受。
而且我制作了Humanoid之后,对于3D还拥有一些直觉,比如说我就在里面增加了Wave的能够,使用一个正弦波,在角色移动的时候,能够让头发和衣服“舞动”起来,这些DynamicBone和MagicCloth都不具备。
当然还有各位绅士关心的“乳摇”部分,其实实现起来异常简单。我现在还考虑要不要改进一下Verlet集成,单独用一个弹簧来让这个更加自然。
总之,这个我以前觉得“高大上”的物理头发,衣服的物理骨骼部分,我在游戏中也实现出来,效果还不错。
(五)AI的力量
我现在编程几乎离不开AI了。而且有一种渐渐被AI“养废”了的趋势(笑)。
在没有AI之前,我的编程原则就是“只要能查的,绝对不去记”。就比如说,冒泡排序法,快速排序法,你让我说这是什么东西,什么原理,我都知道,但是,如果你要我在面试的时候去现写一个快速排序法,我写不出来,因为我记不住细节。
我用冒泡排序法和快速排序法的时候,都直接抄。如果某个设计模式我不需要借助查阅的力量,那一定是我使用了很多次,非常常用了。
在AI出现之后,这个情况可以说是“每况愈下”,我现在连获得一个unorder_map的key,如果不存在时返回nullptr这样的事情也得去问AI。其实我得到答案时,能够记住的,但不知道怎么的,过一会儿就忘记了。
我觉得可能因为年龄的原因,也有可能是因为我的脑回路的潜意识里面已经判定了,AI能够记住的东西,自己绝不记。
总之在3D物理编程里面,AI给我的帮助非常大,AI的好处在于,他对于特写的知识点非常明确,如果你让他去设计点什么东西,要涉及框架的东西,他就只能给你一个用不上的“印象”上的东西,但如果你给他非常明确的任务,他完成任务的效率非常惊人。
就比如说,3D物理里面,很重要的一个参数就是转动惯量,这个不同的3D物体是不一样的。照理来说,你应该去查公式,然后把这个公式实现。但是这种特定的任务,AI就可以给你处理的很好,你只需要说:给我正方体的转动惯量。他就直接给你代码,简直不要太方便。
我在Galgame引擎《Galplayer》创作的时候,也大量使用了AI,AI编写什么东西方便,就是你能够准确描述你的代码的时候,换句话说,你知道你想要做什么的时候,他得到代码非常准确,有很多时候几乎不用改。
其实几年前我还在纠结要不要用AI,但现在感觉是根本不可能离开AI来写代码了。因为效率实在太高。我的《Galplayer》能够3天做出来,AI也功不可没。