Hello . 大家好!今天给大家带来一个比较有意思的Houdini vex 模拟交通系统案例教程分享,我是神棍赵。
1、介绍
我的名字叫Franco Pizzani,参与过《使命召唤:无限战争》和《使命召唤:第二次世界大战》等游戏的开发。大约从那时起,我开始在空闲时练习Houdini,当时只是为了学习一些新东西,但是,在某个时候,我意识到我想进一步深入掌握它。所以就参加了加拿大温哥华的 Houdini FXTD program 。
2、项目的开始
这是我的Houdini课程中的第三个项目,我们需要创建一个人群系统。前几讲涵盖了有关人群及其行为的基本概念。我们进一步了解了Houdini内置的人群工具,该工具可以与人群求解器一起自动为您完成所有操作。尽管人群求解器和内置工具非常出色,但我确实想尝试使用VEX可以做一些不同的事情,所以我认为交通系统将是独一无二的。在我看来,交通系统是如此机械,它将使我有机会控制和设置使交通系统运行的所有必要属性,例如矢量和力。同时,模拟交通系统似乎并不是典型的Houdini项目,因此我将其视为一举两得的事。
3、项目的基本情况
该项目的核心是一个solver求解器和一堆pointwaranger节点(您可以在其中写VEX的节点),通过vex读取和设置属性。然后,这些属性用于基于不同条件来定义属性状态。在此项目的每个帧上都会计算出90多个属性,这些属性的范围从我所谓的“初始属性”开始,这些属性是原始数据,由方向矢量,距离和模拟中产生的其他信息组成。然后分析这些初始属性以设置“状态属性”。这些状态属性用于定义车辆的状态,这些状态是“加速”,“开始”,“停止”或“以最高速度行驶”。
例如我前面有一辆与我在同一车道上的车辆,那么它的方向与我的方向相同,并且到前面的车辆的距离小于预定的制动距离,这时“在前方车辆制动”属性将为true,从而触发“开始”状态。当触发此状态时,有一个制动节点负责根据距离减小施加到我的车辆上的力,从而减小我的速度和与前方车辆的距离,以防止其发生碰撞。如果我的车辆处于“制动”状态并且我的速度等于0,则表示我已停止,因此将触发“停止”状态。如果车辆正在制动或停止的状态属性改变,它将变为“加速”状态,再次施加力。
这些状态属性的传递都是通过pcopen和neighbor等点云系列函数实现的。下图中是我的节点图,尽可能的保证节点图的组织化和模块化。solver求解器将在每一帧中从左到右以及从上到下执行这些节点。
4、道路与交通结构
具体的道路系统是以现实生活为参照,仔细观察,提炼规则。我非常喜欢现实生活的交通路网,通过观察学习我了解了车辆行驶,交通信号灯,停车标志,避开行人的规则。我花了一段时间才正确设置交通信号灯模式。
当我刚开始该项目时,我先进行了原型制作,使车辆沿着道路(在单车道上)行驶并互相制动/停车。后来,当我将其扩展到每条道路有1条以上车道时,我看到车辆似乎无缘无故地刹车和停止,但它们前面没有其他车辆。经过一些调试后,我发现它们的停止是因为我没有执行任何判断来检查前面的车辆是在当前车道中还是在相邻车道中,因此很多工作确实按照现实生活的逻辑进行修改。在检查设置状态的条件时,重要的是要检查正在发生的事件及其优先级。车辆可能正在刹车减速以在红灯处停车,但是如果在到达红灯之前有停止的车辆,则必须先停车。
在项目中我采用样条线来引导车辆。每个样条都有一个“道路名称”,并且知道与之相连的样条是什么。当车辆在道路上行驶时,它会从样条曲线读取这些属性,从而可以知道下一条街道在哪里以及它们可以走到哪里。如果选项为2或更多,则每辆车将随机选择下一步。这是我最不满意的项目部分,因为设置这些样条线需要一些手动工作去放置,并设置道路属性。
5、管理车辆
我在项目中使用速度属性来移动点:以米/秒为单位进行计算,如果车辆的速度为25,则意味着它以每小时90公里的速度行驶。由于每个车辆都知道它们的位置和所要行驶的道路,因此可以计算从车辆的位置到所要行驶的道路的方向向量,然后在该向量的方向上施加力。一旦我们在道路上,将沿道路的行驶方向施加力,这样,车辆就可以沿着道路正常行驶。
项目中也运用了一些其他的数学概念(例如点积和叉积)。使用点积,我们可以轻松确定车辆之间的前后关系。如果我的方向向量和到另一辆车的方向向量的点积大于0,则意味着另一辆车在我前面。如果小于0的结果表示另一辆车在我后面。
6、speedmax属性
在生成车辆时,我立即为它们分配一个随机的“ speedmax”属性。车辆的speedmax属性在每秒11.1至17.7米之间,相当于每小时40至64公里的速度。无论施加多大的力,都不允许速度超过指定值。
同时,道路具有真实的比例大小,并且车辆以每小时64公里的最大速度行驶,这意味着车辆在道路上行驶一些时间后会离开模拟。因此,我正在准备模拟一个14000帧,这相当于大约10分钟的解算,大约需要5分钟来模拟。
另一个重要方面是通过随机变化。每辆车都会获得随机值,例如它们开始停车时与红灯之间的距离,停在前方车辆后方的距离或者停车后重新启动的时间等随机值,所有的这些值的随机变化都会使解算更加逼真。
产生制动和停止距离的随机值
车辆始终可以获取需要刹车或停车的属性状态,并且当距离低于上面属性中定义的值时,它们会通过减小承受的力来减慢速度,剩下的就是求解器通过降低其速度。车辆源的几何形状经过仔细设置,以1米长为标准,这样我就可以根据实际单位为每辆车辆分配pscale属性(大小)。由于每个车辆都知道它们的尺寸(pscale)和必须制动的车辆的尺寸,因此我可以准确地计算出它们从前保险杠到后保险杠的距离。
7、红绿灯与行人
我认为添加行人会使其看起来更加生动复杂。并且我在之前的制作过程中已经做好了添加行人系统所需要的属性,以及检测其他车辆并为行人工作而刹车/停车的逻辑。这是Houdini的优点之一:进行一项设置,并通过针对不同的事物进行一些调整来重复利用。行人需要做更多的工作,因为现在他们的行为有些漫无目的,他们只是盲目地穿过马路,理想情况下,我会执行一些逻辑以使行人在过马路之前停下来观察车辆的往来疏密,直到有安全的空隙或红绿灯变为绿色时再穿过马路。
交通信号灯是设置的重要组成部分,如果没有交通信号灯,在交通流量大的情况下,这个十字路口可能会很混乱。
我将交通信号灯视为具有通过或不通过状态的实体。将这些插入解算中,每辆车可以一直获取当前状态以及与会影响它们的最近红绿灯的距离。现在已经预定义了交通信号灯状态模式,但是我正在探索使它们根据车辆流量自动更改红绿信号的方法。
8、车辆生成
我为车辆定义了不同的生成源,每个源都有特定的生成频率,生成数量和生成种子,以提供更多的变化。我现在设置的值是在交通流量与我的参考镜头相匹配的最佳值。
在下图中,您可以看到当我同时生成四倍的车辆时会发生什么。交通堵塞模拟器!
9、后记
我不能保证何时能够与人们分享更多的细节,因为在学校的时间非常紧张,我必须将自己的时间用于下一个项目。最重要的是,该系统仍然是一个半成品,有很多地方需要调整和修复。不仅如此,就像我之前说过的那样,目前还有一部分内容需要手工完成,因此,我会考虑一种解决方案,以使其变得更加程序化,更直接易用。
3D艺术家:Franco Pizzani
访谈 :Kirill Tokarev
来源:Thepoly
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答023年以来,在版号审批、出海政策等影响下,新品游戏大量涌现,这也为游戏市场带来了一些新变量、新现象。
学习游戏开发班可以帮助游戏爱好者从零基础成为游戏开发专家,掌握全面的游戏开发技能。
火星时代教育为您提供专业的界面设计实战班,在实践中掌握界面设计的核心技巧和最新趋势,成为优秀的UI设计师。
了解UI交互设计培训的最佳选择,比较不同培训机构的优势和特点。
火星时代教育为您推荐专业的学影视后期培训机构,提供高质量的培训内容及资深导师指导,助您成为优秀的影视后期剪辑师或合成师。
火星时代教育是一家专注于交互设计培训的机构,为学员提供专业的交互设计培训课程,并帮助他们成为优秀的交互设计师。
1. 打开微信扫一扫,扫描左侧二维码
2. 添加老师微信,马上领取免费课程资源
同学您好!