大家今天跟大家聊聊我最近瞎折腾的一个东西——“模拟人”。这事儿得从我琢磨怎么让电脑里的小人儿更像那么回事儿说起。
最初的想法和尝试
我没想搞得多复杂,就想着,起码让它们动起来,别傻站着。最早就是让它们走走路,转转身子。我用了一些最基本的办法,就是设定好路径,让它们按着走。但很快就发现,这玩意儿太假了。真人走路哪有那么直愣愣的,跟机器人巡逻似的。
于是我就开始琢磨,得加点细节。 比如,走路的时候,胳膊得摆起来?脑袋也不能一直朝前,得偶尔看看旁边。我就试着给它们加了些随机的头部转动,还有手臂摆动的幅度也根据走路速度稍微变了变。这么一改,你别说,稍微有点儿人味儿了,不再那么僵硬了。
让它们“活”起来一点
光走路像还不行,我就想,能不能让它们之间有点互动,或者对周围的环境有点反应。比如,两个人走近了,会不会互相瞅一眼,或者稍微侧身让一下?前面要是有个障碍物,能不能自己绕开?
这块儿可就费了我不少劲。我先是给每个小人儿加了个“视野范围”,就跟雷达似的。如果视野里出现了别的小人儿或者障碍物,它就得判断一下距离和方向。
- 躲避障碍: 我尝试了几种算法,最简单的就是检测到前方有东西,就随机往左或者往右偏一点,然后再尝试往前走。效果嘛时好时坏,有时候它们会卡在角落里“思考人生”。
- 简单互动: 比如俩小人儿迎面走过来,快撞上的时候,我让它们随机一个稍微停顿一下,或者稍微改变一点点方向。虽然还是很傻,但总比直接穿过去或者撞上要强点儿。
我还试着给它们加入一点“情绪”的雏形。比如,长时间没遇到其他小人儿,它的移动速度可能会稍微慢一点,看起来有点“无聊”;如果周围突然出现好几个小人儿,它可能会稍微停一下,或者转头多“看”几眼,显得有点“好奇”或者“警惕”。这些都是我通过调整一些参数硬编码出来的,离真正的智能还差得远。
遇到的一些坑和怎么填的
最大的坑就是性能。你想,要是场景里小人儿一多,每个都要计算视野、判断碰撞、调整动作,那电脑可就吃不消了。一开始我没注意,放了几十个小人儿进去,结果画面卡得跟幻灯片似的。
后来我就学乖了,开始优化。
- 比如,不是每个小人儿每一帧都去计算那么复杂的东西,可以隔几帧算一次。
- 远处的、看不见的小人儿,就大大简化它们的行为逻辑,甚至直接让它们暂停思考,就播个简单动画就行。
- 我还尝试把一些重复的判断逻辑给封装起来,减少重复计算。
还有就是“真实感”这个东西,太玄乎了。有时候你觉得已经调得很好了,但换个角度一看,或者让它做个别的动作,又觉得假得不行。这是一个不断调整、不断试错的过程,特别磨人。
你问我为啥花这么多功夫搞这个?说起来也是因为之前接了个活儿,客户想要一个演示场景,里面需要些路人NPC,让场景显得热闹点,有点生活气息。预算给得不多,市面上那些成熟的方案又贵,只好自己动手丰衣足食了。
我就天天在街上观察行人,看他们怎么走路,怎么左顾右盼,怎么排队,怎么扎堆聊天。那段时间,我走路都开始不自觉地模仿别人,我老婆都说我魔怔了。
实现的效果和一点感悟
搞出来的东西,说多高级肯定谈不上。 那些小人儿的行为模式还是比较简单的,仔细看还是能看出破绽。但是,比起一开始那种僵尸走路,已经强太多了。它们会在广场上溜达,会三三两两“聚”在一起(就是靠近了之后降低移动意愿),看到特定的“景点”(我设定的兴趣点)会停下来“张望”一下。
整个场景因为这些小人儿的存在,确实显得生动了不少。客户看了之后也挺满意,说达到了他们“看起来不那么假”的基本要求,哈哈。
通过这回实践,我最大的感受就是,模拟“人”这个东西,真是个无底洞。你越想让它像真的,需要考虑的细节就越多,从简单的物理运动到复杂的行为逻辑,甚至到表情、微动作。我这回做的,充其量就是个“形似”,离“神似”还差得老远。
看着自己一点点把这些“数字假人”弄得越来越有意思,也挺有成就感的。这活儿虽然糙,但每解决一个小问题,都能乐呵半天。今天就先分享到这儿,下次再有啥好玩的实践,再来跟大家唠!
还没有评论,来说两句吧...