我的专栏目录:

小IVan:专题概述及目录

开篇综述

这一卷将会开始研究可交互植被环境的模拟。我把可交互植被环境模拟这个大的课题拆解为几个部分。我挑选了几个森林模拟至关重要的几个要素并且实现它们。

【1】植被的交互

【2】植被渲染

【3】植被的生成

先看下交互效果吧,我这里只给了两层粒子,如果想交互得更细致可以把粒子段数给多点

https://www.zhihu.com/video/1119216366464442368


【1】植被的交互

想要让玩家在游玩游戏的时候产生心流,首先就要让玩家沉浸到游戏里,环境交互将增强玩家的沉浸感。就森林环境而言,玩家需要和植被发生交互。目前制作植被交互效果大致有以下几种方式:

(1)动力学模拟:适用于枝叶明晰类的植被,如芭蕉,成人身高的树苗或灌木。

(2)UV纹理扰动,这种主要用于低矮的苔藓,水生藤蔓等。

(3)顶点偏移:适用于小草等植被。

(4)旋转位移:适用于20cm~120cm左右大小的植被,如树苗,灌木。

(5)纹理控制:适用于草丛,人走过时草丛被拨开,走过后草丛慢慢合上。

可以根据不同的情况选择或者组合相应的技术。

【动力学模拟】

做动力学模拟需要先抽象一个动力学模型模型出来,我把植物想象为若干粒子和约束组成的一个树状结构,如下图所示。下面就来介绍一下构建动力学网格的方法。


我们可以使用动力学粒子+约束的方式+物理引擎碰撞解算来构建我们的动力学解算网格。关于动力学粒子和约束方式这部分内容我前面的图元汇编篇有详细介绍,传送门 : 虚幻4渲染编程(图元汇编篇)【第五卷:游戏中的动力学模拟】

我们需要在动力学粒子网格的基础上加上引擎物理解算,然后用解算后的粒子去驱动数的网格最后实现交互。要实现这个,只需要在Verlet Instigation和Constrain Instigation解算之后加上物理解算即可,下面是一个最简单的动力学小球+物理解算后的运动结果:

https://www.zhihu.com/video/1052577822647898112

物理解算的代码如下:



这里会调用引擎的物理模块,引擎的物理模块最终会去调用英伟达的PhysX物理引擎。

除了要使用物理引擎来解算,我们需要三种约束莱构建整颗树,PinConstrain,DistanceConstrain,AngularConstrain。下面是是PinConstrain,DistanceConstraint和Angular Constrain的粒子和场景交互的效果:


(上面这种约束可以用来做藤条等物体的动力学解算)


(上面这种约束可以用来做如芭蕉叶之类的动力学解算,用来做弹簧绳也不错!)

不运动的质点为PinConstraint,蓝色为DistanceConstrain,绿色为AngularConstrain

下面是我的3DVerletAngularConstraint的代码:


AngularConstraint需要先找到一个轴N作为旋转轴,旋转其实使用四元数也是可以的。我的方法是通过两个DistanceConstraint的向量得到。如下图所示:


上面是构筑Angular Constraint的第一种方法,其实还有一种简便的算法


直接通过三角公式,用a,b和角度alpha把c算出来,然后给c边用DistanceConstraint,但是这个给c用的DistanceConstraint的ErrorFactor很小,以至于两端粒子无法在一帧内恢复给定长度,于是c就拥有了弹性。代码如下:

Q弹的棍子:


DistanceAngularConstraint:


DistanceAngularConstraint效果如下:


总地来说,要构建一个动力学网格,首先需要动力学粒子,这个使用VerletInstigation解算就可以了,然后需要构建PinConstraint,DistanceConstraint,AngularConstraint,然后使用物理引擎再次解算约束器解算后的数据。粒子网格解算完成后,再基于粒子网格构建模型网格。


最后完成上述工作后就可以让粒子网格和(场景&&人物)发生交互了。

下面先从一个简单的模型开始,构建一个动力学草丛。我们需要构建一个草丛粒子整列,两层粒子之间使用距离约束,让力的方向向上即可。增加粒子层数可以让草更柔软。


下面是我的粒子网(注意粒子网不是模型,是粒子约束运动网)构建代码:


使用这种方式可以轻松实现多物体交互。下面开始构建模型网格。我这里就只是在两层粒子的基础上生成了一个草的面片模型。让草丛更加自然,加入了些随机值。如果觉得草的晃动持续过久,可以把加速度的值加大来解决这个问题。

https://www.zhihu.com/video/1055427648175579136

还可以更改一下VerletInstigation部分,让粒子的迭代速度变慢


然后就可以得到如下的碾压草丛的效果,效果如下:



这样就初步完成了物理草的动力学解算部分了。

上面使用了两层动力学粒子来模拟简单的草丛。如果想要模拟更加复杂的形状就需要在粒子动力学网格的构建,约束上下功夫了。


https://www.zhihu.com/video/1055950598406467584

我重载了粒子动力学网格的加速度解算方法,让每个粒子都可以定义自己的加速度方向,这样就可以仅仅使用DistanceConstraint和pinConstraint就能方便支撑起整个动力学网格的形状啦。


这样一来就可以使用非常cheap的少量DistanceConstraint和PinConstraint来进行粒子网格的形状建模,避免使用非常expensive的AngularConstraint。但是如果想要强调枝干的韧性还是需要上AngularConstraint。




实现方式是我给Init函数多实现了一个版本,如果使用第二个init版本初始化粒子,那么粒子将默认开启使用自己的LocalForce而不是全局的。用代码建模实在太痛苦了,其实可以做个工具来实现BuildVerletparticleMesh里面的逻辑的。

利用动力学粒子来构建模型最主要的问题其实还是优化,可以考虑为植被使用两个IB和VB,这样就可以避免Buffer在读的时候GPU处于等待状态。这样就可以绘制大量物体了,效果如下:

https://www.zhihu.com/video/1060201911701082112

使用动力学模拟的方式来实现植物的动力学交互的步骤总的来说就是

(1)构建动力学粒子和动力学网格

(2)利用动力学网格构建模型网格

(3)在模型的基础上做shading

优点是限制少,因为这种方式是最接近真实的方式。但是缺点就是效率问题和自由度问题,在粒子网格上构建模型网格实在比较难。还有种思路是使用粒子网格驱动骨架网格。这种就解决了上述所有问题,但是效率堪忧,但是效果是最好的一种方式。驱动骨架的实现方法可以看我下面这篇文章

小IVan:虚幻4渲染编程(动画篇)【第六卷:自定义动画节点】


物理模拟的方式可以轻松实现多物体的交互,如果是使用RT或者是数组传到shader里的方式的话,在实现多人同时交互时就比较麻烦了。

https://www.zhihu.com/video/1062679680951377920


【UV纹理扰动】

这种方式来模拟植被的交互效果就比较简单了,这种方式适合青苔,水洼里的水藻之类的。


【顶点偏移】

这种方式被业内大量运用,这种方式能做到效率效果兼备而且自由度高,能方便美术师制作。最简单的方法就是把角色的位置传到cbuffer里,顶点着色器每帧取一下,然后给植被的顶点做个偏移。

最多给个曲线或者什么trcik公式控制一下幅度



【纹理控制的顶点偏移】

这种方式就是做一个RT用于记录当前草丛的信息,被拨开也好被扰动也好,然后把这个RT传到草丛模型Shader里做解读。



【旋转位移】

这种方式是在植被的Transform信息上下文章,非常适合draw instance的植被,因为instance天生就有个transform信息,这种方式模拟出来的效果也非常自然,不需要来回画Rendertarget了,直接对instance进行操作(摆动,拨开等等)。主要开销在instance的查询上。

这种方法的具体做法我以前的CSDN博客上有详细描述



可交互物理植被模拟(1)主要是理论推导和实现,后面的shading和生成章节会有更进一步的效果完善。

Enjoy it!

虚幻4渲染编程(环境模拟篇)【第五卷:可交互物理植被模拟 - 上】相关推荐

  1. unity scence灯光不显示_Unity渲染编程(灯光篇)【第二卷:MobileVolumetricLight】

    MY BLOG DIRECTORY: todo... INTRODUCTION: 如果需要一个方案来渲染城镇或空旷的马路上巨量的灯光.图形程序拿到这个需求直接开始搞F+或者延迟光照,但是对于移动端的巨 ...

  2. 虚幻4渲染编程(图元汇编篇)【第五卷:游戏中的动力学模拟】

    我的专栏目录 小IVan:专题概述及目录 还是先上效果吧 目前(2018年)在游戏中,通常使用韦尔莱积分做动力学模拟.使用韦尔莱积分可以模拟大部分物体的运动.布料,绳子,弹簧,软体,棍子都可以模拟.但 ...

  3. 虚幻4渲染编程(环境模拟篇)【第三卷:体积云天空模拟(3)---高层云】

    我的专栏目录: 小IVan:专题概述及目录 目前业内流行有两种体积云模拟的方式,模型+特殊shader法,RayMarching法.我前两篇文章已经对它们都做了介绍.当然还有些比较非主流的,比如粒子云 ...

  4. 虚幻4渲染编程(材质编辑器篇)【第五卷:布料,丝绸纱皮革棉】

    My blog directory: 小IVan:专题概述及目录 Introduction: 现在的游戏对质感要求越来越高(我估计是硬件越来越好,可编程管线越来越来越完善).游戏的画面已经越来越接近影 ...

  5. 虚幻4渲染编程(材质编辑器篇)【第三卷:正式准备开始材质开发】

    My blog directory: YivanLee:专题概述及目录 Introduction: 前面两章我们已经完成了对工具的研究,下面我们久正式开始启程啦!后面的内容可能就比较美术了. 还是老规 ...

  6. 渲染到ui_虚幻4渲染编程(UI篇)【第二卷:程序化UI特效-[1]】

    MY BLOG DIRECTORY: 小IVan:专题概述及目录​zhuanlan.zhihu.com INTRODUCTION: 当遇见某些特殊需求,比如对游戏效果有很多变化的要求,这时使用静态的贴 ...

  7. 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...

    My blog directory: YivanLee:专题概述及目录​zhuanlan.zhihu.com Introduction: 各向异性材质 玻璃材质 材质编辑器篇的很多效果都非常简单,可以 ...

  8. 虚幻4渲染编程(光线追踪篇)【第一卷:光线追踪篇开篇综述】

    MY BLOG DIRECTORY: 小IVan:专题概述及目录​zhuanlan.zhihu.com INTRODUCTION: 什么都不说了先上个效果: 光线追踪云 电子游戏的光线追踪时代即将到来 ...

  9. 虚幻4渲染编程(灯光篇)【第二卷:体积光】

    我的专栏目录: 小IVan:专题概述及目录 体积光在游戏里被越来越多地用到,对烘托场景气氛,提高游戏的逼格有比较重要的作用.这篇就来由浅入深研究一下这个东西.从容易的做法到高端做法依次递进. 首先先来 ...

最新文章

  1. javascript小数四舍五入
  2. Android中怎样使用Navicat可视化查看sqllite的数据库(查看db文件)
  3. MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)
  4. spring mvc接收数组
  5. 【机器学习】NMF(非负矩阵分解)
  6. python前端界面模板_Python编程flask使用页面模版的方法
  7. Tensorflow学习教程------tfrecords数据格式生成与读取
  8. Windows10 VS2019下使用CMake3.20.1打开PCL1.11.0程序
  9. TomTom导航新增IFTTT功能 可连接到车主日常生活设备
  10. kotlin之泛型的使用
  11. JavaScript基本数据类型
  12. 三级计算机等级2021年9月考试准考证下载步骤
  13. Linux制作简版的镜像,手把手教你制作一个精简版Windows10镜像
  14. Java基础之类加载器
  15. CVTE 后端开发面经
  16. OSChina 周一乱弹 ——女人比代码复杂多了,搞不懂!
  17. 强大到爆的代码阅读工具understand
  18. Mac OSX 安装qemu
  19. html文字段落设置,p字间距 html段落内文字设置字间距间隔
  20. android 判断图片的格式的,android判断文件是否是图片文件的方法

热门文章

  1. 图片免费压缩在线的方法有哪些
  2. 华为5g鸿蒙折叠,华为再次亮剑!5G新旗舰已经确认,折叠屏+升级到鸿蒙2.0,价格过万...
  3. uva 557 Buger 概率
  4. C语言高级部分总结,也是面试官会经常问的问题哦~
  5. 360度绩效评估中的6个关键点,尤其是第4个!
  6. 文本和输入:复制和粘贴
  7. Node.js 下载与安装教程
  8. win11系统苹果电脑如何安装 Windows11绕过tpm限制在苹果电脑进行安装的步骤方法
  9. 高德地图 SDK集成 定位 地理编码 搜索 经纬度获取 功能工具类
  10. 视觉软件 VisionPro 定位引导3(卡尺CogFindLineTool工具以及辅助工具)