NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

汽车控制器帖子中,你可以看到我一直过着肯尼资产的生活。 我非常喜欢能够专注于游戏玩法的原型设计。

展望未来,我希望能够快速制作内容(赛道),所以今天我将讨论我制作的将空间中的任意曲线转换为可驾驶几何形状的系统。

1、过程

我开始使用 Houdini 的内置曲线 SOP 制作一条曲线,它使用给定点作为贝塞尔曲线(或其他曲线类型)的锚点。 不幸的是,与其他工具相比,曲线工具相当笨重,并且在其他地方定义并引入一系列点可能更容易。

输入曲线

接下来我沿曲线采样点。 具有紧密曲率的角需要更高的分辨率才能获得平滑的几何形状,而直线可以是矩形,因此我使用面 SOP 来合并共线点。 另外,我只想要点数据,所以我剪掉了线几何图形。

重采样曲线

为了将曲线转换为曲面,我最初尝试使用扫描 SOP 采样线,但这在所有 3 个轴上工作时会无法控制地扭曲曲面。 相反,我现在对于每一点:

  • 获取沿曲线的向量 diffV。 对于给定点 i,这可以通过对 i-1,i 和 i,i+1 之间的差进行平均来完成。
  • 生成与道路正交的方向向量 crossDir。 我可以通过 diffV 与路面法线交叉来得到这个(世界向上,因为道路不应该扭曲)
  • 将新点放置在 pos(point_i) +/- crossDif * width 处
  • 点到位后,我可以在每 3 个点之间创建三角形。 我最初是手动完成此操作,但 Poly patch SOP 为我完成了此操作。
与道路正交的点和线,连接时形成道路几何形状

它变成了可驾驶的表面! 但我想让这个表面形成带有墙壁的坡道,而不仅仅是纸薄的表面。 所以我接下来向下挤压,创建一个底面。 我进行另一遍操作,将该底面投影到 XZ 地平面上。

挤压并投射到地面上

从这里开始,只是导出前的一些优化。 我移除地面上的面,并焊接闭合点(主要是为了清理道路已经在地面上的挤压墙),并创建平滑组。

2、倾斜

不幸的是,当我尝试在游戏中驾驶它时,我遇到了各种各样的问题。 碰撞检测在三角测量方面确实遇到了困难,但添加悬架而不是盒式碰撞器修复了大部分卡顿。

尽管如此,同时在 3 个轴上移动的曲线仍然是个问题。 汽车在他们身上操控性很差,通常会飞走。 而且,一旦进行三角测量,道路就会形成“墙”,因为内侧比外侧上升得更陡(Y/XZ 比率更大)。

解决这两个问题的一种方法是尝试根据转弯的松紧程度来倾斜转弯。 我尝试通过 Y/XZ 比率(曲率估计)的函数进行倾斜,并在几个点上进行了平滑处理。 不幸的是,我没有很好的方法来扭曲表面,所以最终只是降低/平滑坡道而不是倾斜。 它清理了墙壁,但却使道路变得沉闷。

我的第二种方法是限制爬升量,例如 对于 XZ 的每一个单位,道路最多可以在 Y 轴上爬升一定的距离。 重要的是,我分别在内边缘和外边缘测量这个值,因此如果外边缘移动得更远,它可以爬升得更多。

这意味着每个点都是前一个点的函数。 在Houdini中,每个属性争论只能在执行之前访问其他点的属性,因此像这样的迭代需要对整个对象进行单次传递,手动迭代跟踪数组中的点。

倾斜。 上图显示了原始点和存储结果之间的差异

仍然有一些工件可以清理,但你可以看到急转弯时的表面坡度很多,并且墙壁已基本平滑。

游戏画面

原文链接:GENERATING ROAD FROM A CURVE IN HOUDINI

BimAnt翻译整理,转载请标明出处