【博物纳新】Unity海洋场景构建

您所在的位置:网站首页 模型大海场景制作 【博物纳新】Unity海洋场景构建

【博物纳新】Unity海洋场景构建

2024-06-14 22:49| 来源: 网络整理| 查看: 265

【博物纳新】是UWA重磅推出的全新栏目,旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

更多精彩内容请关注:lab.uwa4d.com

导读 这个项目是基于Unity社区中一个经典Ocean shader多次改进后海洋场景,海平面实现了浮力、波浪、风、气泡、交互泡沫、焦散以及其他的一些光的反射折射效果。本文重点介绍海平面场景的构建,其他效果的实现不作重点介绍。

开源库地址:https://lab.uwa4d.com/lab/5b442d9bd7f10a201faf74b5 Unity社区原版项目地址:https://forum.unity.com/threads/wanted-ocean-shader.16540 效果展示:

请输入图片描述

                                                                                                普通效果

请输入图片描述

                                                                                              与岛屿交互

请输入图片描述

                                                                                 开启风效果,并设置较大风

使用方法

项目作者将重要参数可视化,在Inspector面板中进行修改。如果不太明白该参数的模拟的效果,可点击参数末尾的“?”按钮,会有详细的解释。

例如:Waves Settings 中的参数,由上而下依次可已设置波浪大小、波浪波动大小、流速、波浪密度。

请输入图片描述

                                                                                     Ocean Object属性面板

并在其中预置了一些参数集作为可选场景,大家也可以保存自己修改后的参数集,添加可选场景。

请输入图片描述

                                                                                           可选场景列表

实验原理/方法

浮力效果在Buoyancy中实现;海平面的效果在Ocean.cs中实现,其中SetupOffscreenRendering、RenderReflectionAndRefraction等函数用于一些光影效果的实现,本文不做重点介绍,有兴趣的读者可以下载源代码研究。

请输入图片描述

                                                                                      开启折射反射效果

请输入图片描述

                                                                                          不开启折射反射效果

作者采用绘制Mesh作为海平面、采用LOD技术进行优化。 作者将海平面区域划分为如图所示的11*11块方形区域,采用5级LOD、最外层加载一个铜钱形状Mesh来填充最外围的场景。

请输入图片描述

                                                                                             海平面分割图

所有Mesh全部生成在名为Ocean的Object下,部分生成的Mesh列表如下:

请输入图片描述

                                                                                          Mesh列表 

船体永远位于5*5Mesh区域内,LOD级别为LOD_0,绘制最为精细的细节与效果。其余部分采取较低级别LOD,如图所示:

请输入图片描述

                                                                                              普通场景

请输入图片描述

                                                                                             开启WireFrame

当船体移动,驶出该区域,Ocean 组件会计算偏移量,然后将Ocean Object整体移动一块Mesh的距离,例如,在场景开始后控制船体向X轴负方向前进,直至驶出该Mesh区域,此时Ocean Object通过计算,也平移了一段距离:

请输入图片描述

                                                                                         注意Mesh的移动

请输入图片描述

                                                                                              移动前

请输入图片描述

                                                                                              移动后

这样可以保证距离摄像机最近的地方显示效果最佳,距离摄像机较远的地方绘制的Mesh采用较低等级的LOD,以节省开销。

以下节选相应代码:用于计算偏移量,来决定是否移动Ocean Object

: 1 void calculateCenterOffset() { 2 if (followMainCamera && player) { 3 centerOffset.x = MyFloorInt(player.position.x * sizeInv.x) * size.x; 4 centerOffset.z = MyFloorInt(player.position.z * sizeInv.y) * size.z; 5 centerOffset.y = transform.position.y; 6 if(transform.position != centerOffset) { 7 ticked = true; 8 transform.position = centerOffset; 9 //确保在偏移更改时立即更新LOD0 10 updateTiles(0, 1); 11 ticked2 = true; 12 } 13 //计算高度 14 if(player) { 15 if(farLodOffset!=0) { 16 flodFact = 1f - Mathf.Clamp01((player.position.y)*0.0007f); 17 //调整摄像机距离 18 ffact = MyFloorInt(flodFact*10.5f); 19 if(ffact != oldffact) { 20 oldffact = ffact; 21 ticked = true; 22 updateTiles(1, max_LOD); 23 } 24 } 25 } 26 } 27 }

产生Mesh并选择对应的LOD级别(变量christ):

1 void GenerateTiles() { 2 3 int chDist, nmaxLod=0; // Chebychev distance 4 5 //设置LOD级别 6 for (int y=0; y


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3